astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
138 lines (130 loc) • 19.8 kB
JavaScript
import __debug from 'debug'
import AssignmentPattern from './AssignmentPattern.mjs'
import BooleanLiteral from './BooleanLiteral.mjs'
import CallExpression from './CallExpression.mjs'
import ClassImplements from './ClassImplements.mjs'
import ClassProperty from './ClassProperty.mjs'
import compileGenericArrayMatcher from './GenericArrayMatcher.mjs'
import compileGenericNodeMatcher from './GenericNodeMatcher.mjs'
import ExportSpecifier from './ExportSpecifier.mjs'
import ExpressionStatement from './ExpressionStatement.mjs'
import FunctionTypeParam from './FunctionTypeParam.mjs'
import GenericTypeAnnotation from './GenericTypeAnnotation.mjs'
import Identifier from './Identifier.mjs'
import ImportSpecifier from './ImportSpecifier.mjs'
import JSXAttribute from './JSXAttribute.mjs'
import JSXElement from './JSXElement.mjs'
import JSXExpressionContainer from './JSXExpressionContainer.mjs'
import JSXIdentifier from './JSXIdentifier.mjs'
import JSXText from './JSXText.mjs'
import NumericLiteral from './NumericLiteral.mjs'
import ObjectProperty from './ObjectProperty.mjs'
import ObjectTypeProperty from './ObjectTypeProperty.mjs'
import RegExpLiteral from './RegExpLiteral.mjs'
import SpreadElement from './SpreadElement.mjs'
import StringLiteral from './StringLiteral.mjs'
import TemplateLiteral from './TemplateLiteral.mjs'
import TSExpressionWithTypeArguments from './TSExpressionWithTypeArguments.mjs'
import TSPropertySignature from './TSPropertySignature.mjs'
import TSTypeAnnotation from './TSTypeAnnotation.mjs'
import TSTypeParameter from './TSTypeParameter.mjs'
import TSTypeReference from './TSTypeReference.mjs'
import TypeAnnotation from './TypeAnnotation.mjs'
import TypeParameter from './TypeParameter.mjs'
import VariableDeclarator from './VariableDeclarator.mjs'
import { isCapturePlaceholder } from './Placeholder.mjs'
const _debug = __debug('astx:match')
function hasCapturePlaceholder(captures) {
for (const key in captures) {
if (isCapturePlaceholder(key)) return true
}
return false
}
export function mergeCaptures(...results) {
let current = null
for (const result of results) {
if (!result) continue
if (result.captures && hasCapturePlaceholder(result.captures)) {
if (!current) current = {}
if (!current.captures) current.captures = {}
for (const [key, value] of Object.entries(result.captures)) {
if (isCapturePlaceholder(key)) current.captures[key] = value
}
}
if (result.arrayCaptures && hasCapturePlaceholder(result.arrayCaptures)) {
if (!current) current = {}
if (!current.arrayCaptures) current.arrayCaptures = {}
for (const [key, value] of Object.entries(result.arrayCaptures)) {
if (isCapturePlaceholder(key)) current.arrayCaptures[key] = value
}
}
if (result.stringCaptures) {
if (!current) current = {}
if (!current.stringCaptures) current.stringCaptures = {}
Object.assign(current.stringCaptures, result.stringCaptures)
}
}
return current
}
const nodeMatchers = {
AssignmentPattern,
BooleanLiteral,
CallExpression,
ClassImplements,
ClassProperty,
ExportSpecifier,
ExpressionStatement,
FunctionTypeParam,
GenericTypeAnnotation,
Identifier,
ImportSpecifier,
JSXAttribute,
JSXElement,
JSXExpressionContainer,
JSXIdentifier,
JSXText,
NumericLiteral,
// ObjectExpression,
ObjectProperty,
ObjectTypeProperty,
RegExpLiteral,
SpreadElement,
StringLiteral,
TemplateLiteral,
TSExpressionWithTypeArguments,
TSPropertySignature,
TSTypeAnnotation,
TSTypeParameter,
TSTypeReference,
TypeAnnotation,
TypeParameter,
VariableDeclarator,
}
export function convertPredicateMatcher(pattern, matcher, { debug }) {
return {
pattern,
nodeType: matcher.nodeType,
match: (path, matchSoFar) => {
debug('%s (specific)', pattern.value.type)
const result = matcher.match(path, matchSoFar)
if (result) {
if (result === true) debug(' matched')
return typeof result === 'object' ? result : matchSoFar || {}
} else {
if (result === false) debug(` didn't match`)
return null
}
},
}
}
export default function compileMatcher(path, rootCompileOptions) {
const { debug = _debug } = rootCompileOptions
const compileOptions = { ...rootCompileOptions, debug }
if (Array.isArray(path.value)) {
return compileGenericArrayMatcher(path, compileOptions)
} else if (nodeMatchers[path.value.type]) {
const matcher = nodeMatchers[path.value.type](path, compileOptions)
if (matcher) return matcher
}
return compileGenericNodeMatcher(path, compileOptions)
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfX2RlYnVnIiwiQXNzaWdubWVudFBhdHRlcm4iLCJCb29sZWFuTGl0ZXJhbCIsIkNhbGxFeHByZXNzaW9uIiwiQ2xhc3NJbXBsZW1lbnRzIiwiQ2xhc3NQcm9wZXJ0eSIsImNvbXBpbGVHZW5lcmljQXJyYXlNYXRjaGVyIiwiY29tcGlsZUdlbmVyaWNOb2RlTWF0Y2hlciIsIkV4cG9ydFNwZWNpZmllciIsIkV4cHJlc3Npb25TdGF0ZW1lbnQiLCJGdW5jdGlvblR5cGVQYXJhbSIsIkdlbmVyaWNUeXBlQW5ub3RhdGlvbiIsIklkZW50aWZpZXIiLCJJbXBvcnRTcGVjaWZpZXIiLCJKU1hBdHRyaWJ1dGUiLCJKU1hFbGVtZW50IiwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lciIsIkpTWElkZW50aWZpZXIiLCJKU1hUZXh0IiwiTnVtZXJpY0xpdGVyYWwiLCJPYmplY3RQcm9wZXJ0eSIsIk9iamVjdFR5cGVQcm9wZXJ0eSIsIlJlZ0V4cExpdGVyYWwiLCJTcHJlYWRFbGVtZW50IiwiU3RyaW5nTGl0ZXJhbCIsIlRlbXBsYXRlTGl0ZXJhbCIsIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIiwiVFNQcm9wZXJ0eVNpZ25hdHVyZSIsIlRTVHlwZUFubm90YXRpb24iLCJUU1R5cGVQYXJhbWV0ZXIiLCJUU1R5cGVSZWZlcmVuY2UiLCJUeXBlQW5ub3RhdGlvbiIsIlR5cGVQYXJhbWV0ZXIiLCJWYXJpYWJsZURlY2xhcmF0b3IiLCJpc0NhcHR1cmVQbGFjZWhvbGRlciIsIl9kZWJ1ZyIsImhhc0NhcHR1cmVQbGFjZWhvbGRlciIsImNhcHR1cmVzIiwia2V5IiwibWVyZ2VDYXB0dXJlcyIsInJlc3VsdHMiLCJjdXJyZW50IiwicmVzdWx0IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwiYXJyYXlDYXB0dXJlcyIsInN0cmluZ0NhcHR1cmVzIiwiYXNzaWduIiwibm9kZU1hdGNoZXJzIiwiY29udmVydFByZWRpY2F0ZU1hdGNoZXIiLCJwYXR0ZXJuIiwibWF0Y2hlciIsImRlYnVnIiwibm9kZVR5cGUiLCJtYXRjaCIsInBhdGgiLCJtYXRjaFNvRmFyIiwidHlwZSIsImNvbXBpbGVNYXRjaGVyIiwicm9vdENvbXBpbGVPcHRpb25zIiwiY29tcGlsZU9wdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcGlsZU1hdGNoZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVR5cGUsIE5vZGVQYXRoLCBOb2RlLCBEZWJ1Z2dlciB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0ICogYXMgdCBmcm9tICdhc3QtdHlwZXMnXG5pbXBvcnQgX19kZWJ1ZyBmcm9tICdkZWJ1ZydcbmltcG9ydCB7IEJhY2tlbmQgfSBmcm9tICcuLi9iYWNrZW5kL0JhY2tlbmQnXG5pbXBvcnQgQXNzaWdubWVudFBhdHRlcm4gZnJvbSAnLi9Bc3NpZ25tZW50UGF0dGVybidcbmltcG9ydCBCb29sZWFuTGl0ZXJhbCBmcm9tICcuL0Jvb2xlYW5MaXRlcmFsJ1xuaW1wb3J0IENhbGxFeHByZXNzaW9uIGZyb20gJy4vQ2FsbEV4cHJlc3Npb24nXG5pbXBvcnQgQ2xhc3NJbXBsZW1lbnRzIGZyb20gJy4vQ2xhc3NJbXBsZW1lbnRzJ1xuaW1wb3J0IENsYXNzUHJvcGVydHkgZnJvbSAnLi9DbGFzc1Byb3BlcnR5J1xuaW1wb3J0IGNvbXBpbGVHZW5lcmljQXJyYXlNYXRjaGVyIGZyb20gJy4vR2VuZXJpY0FycmF5TWF0Y2hlcidcbmltcG9ydCBjb21waWxlR2VuZXJpY05vZGVNYXRjaGVyIGZyb20gJy4vR2VuZXJpY05vZGVNYXRjaGVyJ1xuaW1wb3J0IEV4cG9ydFNwZWNpZmllciBmcm9tICcuL0V4cG9ydFNwZWNpZmllcidcbmltcG9ydCBFeHByZXNzaW9uU3RhdGVtZW50IGZyb20gJy4vRXhwcmVzc2lvblN0YXRlbWVudCdcbmltcG9ydCBGdW5jdGlvblR5cGVQYXJhbSBmcm9tICcuL0Z1bmN0aW9uVHlwZVBhcmFtJ1xuaW1wb3J0IEdlbmVyaWNUeXBlQW5ub3RhdGlvbiBmcm9tICcuL0dlbmVyaWNUeXBlQW5ub3RhdGlvbidcbmltcG9ydCBJZGVudGlmaWVyIGZyb20gJy4vSWRlbnRpZmllcidcbmltcG9ydCBJbXBvcnRTcGVjaWZpZXIgZnJvbSAnLi9JbXBvcnRTcGVjaWZpZXInXG5pbXBvcnQgSlNYQXR0cmlidXRlIGZyb20gJy4vSlNYQXR0cmlidXRlJ1xuaW1wb3J0IEpTWEVsZW1lbnQgZnJvbSAnLi9KU1hFbGVtZW50J1xuaW1wb3J0IEpTWEV4cHJlc3Npb25Db250YWluZXIgZnJvbSAnLi9KU1hFeHByZXNzaW9uQ29udGFpbmVyJ1xuaW1wb3J0IEpTWElkZW50aWZpZXIgZnJvbSAnLi9KU1hJZGVudGlmaWVyJ1xuaW1wb3J0IEpTWFRleHQgZnJvbSAnLi9KU1hUZXh0J1xuaW1wb3J0IE51bWVyaWNMaXRlcmFsIGZyb20gJy4vTnVtZXJpY0xpdGVyYWwnXG5pbXBvcnQgT2JqZWN0UHJvcGVydHkgZnJvbSAnLi9PYmplY3RQcm9wZXJ0eSdcbmltcG9ydCBPYmplY3RUeXBlUHJvcGVydHkgZnJvbSAnLi9PYmplY3RUeXBlUHJvcGVydHknXG5pbXBvcnQgUmVnRXhwTGl0ZXJhbCBmcm9tICcuL1JlZ0V4cExpdGVyYWwnXG5pbXBvcnQgU3ByZWFkRWxlbWVudCBmcm9tICcuL1NwcmVhZEVsZW1lbnQnXG5pbXBvcnQgU3RyaW5nTGl0ZXJhbCBmcm9tICcuL1N0cmluZ0xpdGVyYWwnXG5pbXBvcnQgVGVtcGxhdGVMaXRlcmFsIGZyb20gJy4vVGVtcGxhdGVMaXRlcmFsJ1xuaW1wb3J0IFRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIGZyb20gJy4vVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMnXG5pbXBvcnQgVFNQcm9wZXJ0eVNpZ25hdHVyZSBmcm9tICcuL1RTUHJvcGVydHlTaWduYXR1cmUnXG5pbXBvcnQgVFNUeXBlQW5ub3RhdGlvbiBmcm9tICcuL1RTVHlwZUFubm90YXRpb24nXG5pbXBvcnQgVFNUeXBlUGFyYW1ldGVyIGZyb20gJy4vVFNUeXBlUGFyYW1ldGVyJ1xuaW1wb3J0IFRTVHlwZVJlZmVyZW5jZSBmcm9tICcuL1RTVHlwZVJlZmVyZW5jZSdcbmltcG9ydCBUeXBlQW5ub3RhdGlvbiBmcm9tICcuL1R5cGVBbm5vdGF0aW9uJ1xuaW1wb3J0IFR5cGVQYXJhbWV0ZXIgZnJvbSAnLi9UeXBlUGFyYW1ldGVyJ1xuaW1wb3J0IFZhcmlhYmxlRGVjbGFyYXRvciBmcm9tICcuL1ZhcmlhYmxlRGVjbGFyYXRvcidcbmltcG9ydCB7IGlzQ2FwdHVyZVBsYWNlaG9sZGVyIH0gZnJvbSAnLi9QbGFjZWhvbGRlcidcblxuY29uc3QgX2RlYnVnID0gX19kZWJ1ZygnYXN0eDptYXRjaCcpXG5cbmV4cG9ydCB0eXBlIFJvb3RDb21waWxlT3B0aW9ucyA9IHtcbiAgd2hlcmU/OiB7IFtjYXB0dXJlTmFtZTogc3RyaW5nXTogKHBhdGg6IE5vZGVQYXRoKSA9PiBib29sZWFuIH1cbiAgZGVidWc/OiBEZWJ1Z2dlclxuICBiYWNrZW5kOiBCYWNrZW5kXG59XG5cbmV4cG9ydCB0eXBlIENvbXBpbGVPcHRpb25zID0ge1xuICB3aGVyZT86IHsgW2NhcHR1cmVOYW1lOiBzdHJpbmddOiAocGF0aDogTm9kZVBhdGgpID0+IGJvb2xlYW4gfVxuICBkZWJ1ZzogRGVidWdnZXJcbiAgYmFja2VuZDogQmFja2VuZFxufVxuXG5leHBvcnQgdHlwZSBDYXB0dXJlcyA9IFJlY29yZDxzdHJpbmcsIE5vZGVQYXRoPlxuZXhwb3J0IHR5cGUgQXJyYXlDYXB0dXJlcyA9IFJlY29yZDxzdHJpbmcsIE5vZGVQYXRoW10+XG5leHBvcnQgdHlwZSBTdHJpbmdDYXB0dXJlcyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuZXhwb3J0IHR5cGUgTWF0Y2hSZXN1bHQgPSB7XG4gIGNhcHR1cmVzPzogQ2FwdHVyZXNcbiAgYXJyYXlDYXB0dXJlcz86IEFycmF5Q2FwdHVyZXNcbiAgc3RyaW5nQ2FwdHVyZXM/OiBTdHJpbmdDYXB0dXJlc1xufSB8IG51bGxcblxuZnVuY3Rpb24gaGFzQ2FwdHVyZVBsYWNlaG9sZGVyKGNhcHR1cmVzPzogQ2FwdHVyZXMgfCBBcnJheUNhcHR1cmVzKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qga2V5IGluIGNhcHR1cmVzKSB7XG4gICAgaWYgKGlzQ2FwdHVyZVBsYWNlaG9sZGVyKGtleSkpIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNhcHR1cmVzKC4uLnJlc3VsdHM6IE1hdGNoUmVzdWx0W10pOiBNYXRjaFJlc3VsdCB7XG4gIGxldCBjdXJyZW50OiBNYXRjaFJlc3VsdCA9IG51bGxcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmICghcmVzdWx0KSBjb250aW51ZVxuICAgIGlmIChyZXN1bHQuY2FwdHVyZXMgJiYgaGFzQ2FwdHVyZVBsYWNlaG9sZGVyKHJlc3VsdC5jYXB0dXJlcykpIHtcbiAgICAgIGlmICghY3VycmVudCkgY3VycmVudCA9IHt9XG4gICAgICBpZiAoIWN1cnJlbnQuY2FwdHVyZXMpIGN1cnJlbnQuY2FwdHVyZXMgPSB7fVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LmNhcHR1cmVzKSkge1xuICAgICAgICBpZiAoaXNDYXB0dXJlUGxhY2Vob2xkZXIoa2V5KSkgY3VycmVudC5jYXB0dXJlc1trZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdC5hcnJheUNhcHR1cmVzICYmIGhhc0NhcHR1cmVQbGFjZWhvbGRlcihyZXN1bHQuYXJyYXlDYXB0dXJlcykpIHtcbiAgICAgIGlmICghY3VycmVudCkgY3VycmVudCA9IHt9XG4gICAgICBpZiAoIWN1cnJlbnQuYXJyYXlDYXB0dXJlcykgY3VycmVudC5hcnJheUNhcHR1cmVzID0ge31cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5hcnJheUNhcHR1cmVzKSkge1xuICAgICAgICBpZiAoaXNDYXB0dXJlUGxhY2Vob2xkZXIoa2V5KSkgY3VycmVudC5hcnJheUNhcHR1cmVzW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0cmluZ0NhcHR1cmVzKSB7XG4gICAgICBpZiAoIWN1cnJlbnQpIGN1cnJlbnQgPSB7fVxuICAgICAgaWYgKCFjdXJyZW50LnN0cmluZ0NhcHR1cmVzKSBjdXJyZW50LnN0cmluZ0NhcHR1cmVzID0ge31cbiAgICAgIE9iamVjdC5hc3NpZ24oY3VycmVudC5zdHJpbmdDYXB0dXJlcywgcmVzdWx0LnN0cmluZ0NhcHR1cmVzKVxuICAgIH1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuXG5leHBvcnQgdHlwZSBQcmVkaWNhdGVNYXRjaGVyID0ge1xuICBtYXRjaDogKHBhdGg6IE5vZGVQYXRoLCBtYXRjaFNvRmFyOiBNYXRjaFJlc3VsdCkgPT4gYm9vbGVhblxuICBub2RlVHlwZT86IGtleW9mIHR5cGVvZiB0Lm5hbWVkVHlwZXMgfCAoa2V5b2YgdHlwZW9mIHQubmFtZWRUeXBlcylbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkTWF0Y2hlciB7XG4gIHBhdHRlcm46IE5vZGVQYXRoPE5vZGUsIE5vZGU+IHwgTm9kZVBhdGg8Tm9kZSwgTm9kZT5bXVxuICBvcHRpb25hbD86IHRydWVcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgYXJyYXlQbGFjZWhvbGRlcj86IHN0cmluZ1xuICByZXN0UGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgZmxhZz86ICckT3JkZXJlZCcgfCAnJFVub3JkZXJlZCdcbiAgbWF0Y2g6IChwYXRoOiBOb2RlUGF0aCwgbWF0Y2hTb0ZhcjogTWF0Y2hSZXN1bHQpID0+IE1hdGNoUmVzdWx0XG4gIG5vZGVUeXBlPzogTm9kZVR5cGUgfCBOb2RlVHlwZVtdXG59XG5cbmNvbnN0IG5vZGVNYXRjaGVyczogUmVjb3JkPFxuICBzdHJpbmcsXG4gIChcbiAgICBwYXRoOiBOb2RlUGF0aDxhbnksIGFueT4sXG4gICAgb3B0aW9uczogQ29tcGlsZU9wdGlvbnNcbiAgKSA9PiBDb21waWxlZE1hdGNoZXIgfCB1bmRlZmluZWQgfCB2b2lkXG4+ID0ge1xuICBBc3NpZ25tZW50UGF0dGVybixcbiAgQm9vbGVhbkxpdGVyYWwsXG4gIENhbGxFeHByZXNzaW9uLFxuICBDbGFzc0ltcGxlbWVudHMsXG4gIENsYXNzUHJvcGVydHksXG4gIEV4cG9ydFNwZWNpZmllcixcbiAgRXhwcmVzc2lvblN0YXRlbWVudCxcbiAgRnVuY3Rpb25UeXBlUGFyYW0sXG4gIEdlbmVyaWNUeXBlQW5ub3RhdGlvbixcbiAgSWRlbnRpZmllcixcbiAgSW1wb3J0U3BlY2lmaWVyLFxuICBKU1hBdHRyaWJ1dGUsXG4gIEpTWEVsZW1lbnQsXG4gIEpTWEV4cHJlc3Npb25Db250YWluZXIsXG4gIEpTWElkZW50aWZpZXIsXG4gIEpTWFRleHQsXG4gIE51bWVyaWNMaXRlcmFsLFxuICAvLyBPYmplY3RFeHByZXNzaW9uLFxuICBPYmplY3RQcm9wZXJ0eSxcbiAgT2JqZWN0VHlwZVByb3BlcnR5LFxuICBSZWdFeHBMaXRlcmFsLFxuICBTcHJlYWRFbGVtZW50LFxuICBTdHJpbmdMaXRlcmFsLFxuICBUZW1wbGF0ZUxpdGVyYWwsXG4gIFRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzLFxuICBUU1Byb3BlcnR5U2lnbmF0dXJlLFxuICBUU1R5cGVBbm5vdGF0aW9uLFxuICBUU1R5cGVQYXJhbWV0ZXIsXG4gIFRTVHlwZVJlZmVyZW5jZSxcbiAgVHlwZUFubm90YXRpb24sXG4gIFR5cGVQYXJhbWV0ZXIsXG4gIFZhcmlhYmxlRGVjbGFyYXRvcixcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRQcmVkaWNhdGVNYXRjaGVyKFxuICBwYXR0ZXJuOiBOb2RlUGF0aCxcbiAgbWF0Y2hlcjogUHJlZGljYXRlTWF0Y2hlcixcbiAgeyBkZWJ1ZyB9OiBDb21waWxlT3B0aW9uc1xuKTogQ29tcGlsZWRNYXRjaGVyIHtcbiAgcmV0dXJuIHtcbiAgICBwYXR0ZXJuLFxuICAgIG5vZGVUeXBlOiBtYXRjaGVyLm5vZGVUeXBlLFxuICAgIG1hdGNoOiAocGF0aDogTm9kZVBhdGgsIG1hdGNoU29GYXI6IE1hdGNoUmVzdWx0KTogTWF0Y2hSZXN1bHQgPT4ge1xuICAgICAgZGVidWcoJyVzIChzcGVjaWZpYyknLCBwYXR0ZXJuLnZhbHVlLnR5cGUpXG4gICAgICBjb25zdCByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKHBhdGgsIG1hdGNoU29GYXIpXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIGRlYnVnKCcgIG1hdGNoZWQnKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgPyByZXN1bHQgOiBtYXRjaFNvRmFyIHx8IHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkgZGVidWcoYCAgZGlkbid0IG1hdGNoYClcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXBpbGVNYXRjaGVyKFxuICBwYXRoOiBOb2RlUGF0aCxcbiAgcm9vdENvbXBpbGVPcHRpb25zOiBSb290Q29tcGlsZU9wdGlvbnNcbik6IENvbXBpbGVkTWF0Y2hlciB7XG4gIGNvbnN0IHsgZGVidWcgPSBfZGVidWcgfSA9IHJvb3RDb21waWxlT3B0aW9uc1xuICBjb25zdCBjb21waWxlT3B0aW9ucyA9IHsgLi4ucm9vdENvbXBpbGVPcHRpb25zLCBkZWJ1ZyB9XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGgudmFsdWUpKSB7XG4gICAgcmV0dXJuIGNvbXBpbGVHZW5lcmljQXJyYXlNYXRjaGVyKHBhdGgsIGNvbXBpbGVPcHRpb25zKVxuICB9IGVsc2UgaWYgKG5vZGVNYXRjaGVyc1twYXRoLnZhbHVlLnR5cGVdKSB7XG4gICAgY29uc3QgbWF0Y2hlciA9IG5vZGVNYXRjaGVyc1twYXRoLnZhbHVlLnR5cGVdKHBhdGgsIGNvbXBpbGVPcHRpb25zKVxuICAgIGlmIChtYXRjaGVyKSByZXR1cm4gbWF0Y2hlclxuICB9XG4gIHJldHVybiBjb21waWxlR2VuZXJpY05vZGVNYXRjaGVyKHBhdGgsIGNvbXBpbGVPcHRpb25zKVxufVxuIl0sIm1hcHBpbmdzIjoiOztBQUVBLE9BQU9BLE9BQVAsTUFBb0IsT0FBcEI7O0FBRUEsT0FBT0MsaUJBQVAsTUFBOEIscUJBQTlCO0FBQ0EsT0FBT0MsY0FBUCxNQUEyQixrQkFBM0I7QUFDQSxPQUFPQyxjQUFQLE1BQTJCLGtCQUEzQjtBQUNBLE9BQU9DLGVBQVAsTUFBNEIsbUJBQTVCO0FBQ0EsT0FBT0MsYUFBUCxNQUEwQixpQkFBMUI7QUFDQSxPQUFPQywwQkFBUCxNQUF1Qyx1QkFBdkM7QUFDQSxPQUFPQyx5QkFBUCxNQUFzQyxzQkFBdEM7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLG1CQUFQLE1BQWdDLHVCQUFoQztBQUNBLE9BQU9DLGlCQUFQLE1BQThCLHFCQUE5QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLHlCQUFsQztBQUNBLE9BQU9DLFVBQVAsTUFBdUIsY0FBdkI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLFlBQVAsTUFBeUIsZ0JBQXpCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QixjQUF2QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDBCQUFuQztBQUNBLE9BQU9DLGFBQVAsTUFBMEIsaUJBQTFCO0FBQ0EsT0FBT0MsT0FBUCxNQUFvQixXQUFwQjtBQUNBLE9BQU9DLGNBQVAsTUFBMkIsa0JBQTNCO0FBQ0EsT0FBT0MsY0FBUCxNQUEyQixrQkFBM0I7QUFDQSxPQUFPQyxrQkFBUCxNQUErQixzQkFBL0I7QUFDQSxPQUFPQyxhQUFQLE1BQTBCLGlCQUExQjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsaUJBQTFCO0FBQ0EsT0FBT0MsYUFBUCxNQUEw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