UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

138 lines (130 loc) 19.8 kB
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+ID0ge1xuICBBc3NpZ25tZW50UGF0dGVybixcbiAgQm9vbGVhbkxpdGVyYWwsXG4gIENhbGxFeHByZXNzaW9uLFxuICBDbGFzc0ltcGxlbWVudHMsXG4gIENsYXNzUHJvcGVydHksXG4gIEV4cG9ydFNwZWNpZmllcixcbiAgRXhwcmVzc2lvblN0YXRlbWVudCxcbiAgRnVuY3Rpb25UeXBlUGFyYW0sXG4gIEdlbmVyaWNUeXBlQW5ub3RhdGlvbixcbiAgSWRlbnRpZmllcixcbiAgSW1wb3J0U3BlY2lmaWVyLFxuICBKU1hBdHRyaWJ1dGUsXG4gIEpTWEVsZW1lbnQsXG4gIEpTWEV4cHJlc3Npb25Db250YWluZXIsXG4gIEpTWElkZW50aWZpZXIsXG4gIEpTWFRleHQsXG4gIE51bWVyaWNMaXRlcmFsLFxuICAvLyBPYmplY3RFeHByZXNzaW9uLFxuICBPYmplY3RQcm9wZXJ0eSxcbiAgT2JqZWN0VHlwZVByb3BlcnR5LFxuICBSZWdFeHBMaXRlcmFsLFxuICBTcHJlYWRFbGVtZW50LFxuICBTdHJpbmdMaXRlcmFsLFxuICBUZW1wbGF0ZUxpdGVyYWwsXG4gIFRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzLFxuICBUU1Byb3BlcnR5U2lnbmF0dXJlLFxuICBUU1R5cGVBbm5vdGF0aW9uLFxuICBUU1R5cGVQYXJhbWV0ZXIsXG4gIFRTVHlwZVJlZmVyZW5jZSxcbiAgVHlwZUFubm90YXRpb24sXG4gIFR5cGVQYXJhbWV0ZXIsXG4gIFZhcmlhYmxlRGVjbGFyYXRvcixcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRQcmVkaWNhdGVNYXRjaGVyKFxuICBwYXR0ZXJuOiBOb2RlUGF0aCxcbiAgbWF0Y2hlcjogUHJlZGljYXRlTWF0Y2hlcixcbiAgeyBkZWJ1ZyB9OiBDb21waWxlT3B0aW9uc1xuKTogQ29tcGlsZWRNYXRjaGVyIHtcbiAgcmV0dXJuIHtcbiAgICBwYXR0ZXJuLFxuICAgIG5vZGVUeXBlOiBtYXRjaGVyLm5vZGVUeXBlLFxuICAgIG1hdGNoOiAocGF0aDogTm9kZVBhdGgsIG1hdGNoU29GYXI6IE1hdGNoUmVzdWx0KTogTWF0Y2hSZXN1bHQgPT4ge1xuICAgICAgZGVidWcoJyVzIChzcGVjaWZpYyknLCBwYXR0ZXJuLnZhbHVlLnR5cGUpXG4gICAgICBjb25zdCByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKHBhdGgsIG1hdGNoU29GYXIpXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIGRlYnVnKCcgIG1hdGNoZWQnKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgPyByZXN1bHQgOiBtYXRjaFNvRmFyIHx8IHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkgZGVidWcoYCAgZGlkbid0IG1hdGNoYClcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXBpbGVNYXRjaGVyKFxuICBwYXRoOiBOb2RlUGF0aCxcbiAgcm9vdENvbXBpbGVPcHRpb25zOiBSb290Q29tcGlsZU9wdGlvbnNcbik6IENvbXBpbGVkTWF0Y2hlciB7XG4gIGNvbnN0IHsgZGVidWcgPSBfZGVidWcgfSA9IHJvb3RDb21waWxlT3B0aW9uc1xuICBjb25zdCBjb21waWxlT3B0aW9ucyA9IHsgLi4ucm9vdENvbXBpbGVPcHRpb25zLCBkZWJ1ZyB9XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGgudmFsdWUpKSB7XG4gICAgcmV0dXJuIGNvbXBpbGVHZW5lcmljQXJyYXlNYXRjaGVyKHBhdGgsIGNvbXBpbGVPcHRpb25zKVxuICB9IGVsc2UgaWYgKG5vZGVNYXRjaGVyc1twYXRoLnZhbHVlLnR5cGVdKSB7XG4gICAgY29uc3QgbWF0Y2hlciA9IG5vZGVNYXRjaGVyc1twYXRoLnZhbHVlLnR5cGVdKHBhdGgsIGNvbXBpbGVPcHRpb25zKVxuICAgIGlmIChtYXRjaGVyKSByZXR1cm4gbWF0Y2hlclxuICB9XG4gIHJldHVybiBjb21waWxlR2VuZXJpY05vZGVNYXRjaGVyKHBhdGgsIGNvbXBpbGVPcHRpb25zKVxufVxuIl0sIm1hcHBpbmdzIjoiOztBQUVBLE9BQU9BLE9BQVAsTUFBb0IsT0FBcEI7O0FBRUEsT0FBT0MsaUJBQVAsTUFBOEIscUJBQTlCO0FBQ0EsT0FBT0MsY0FBUCxNQUEyQixrQkFBM0I7QUFDQSxPQUFPQyxjQUFQLE1BQTJCLGtCQUEzQjtBQUNBLE9BQU9DLGVBQVAsTUFBNEIsbUJBQTVCO0FBQ0EsT0FBT0MsYUFBUCxNQUEwQixpQkFBMUI7QUFDQSxPQUFPQywwQkFBUCxNQUF1Qyx1QkFBdkM7QUFDQSxPQUFPQyx5QkFBUCxNQUFzQyxzQkFBdEM7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLG1CQUFQLE1BQWdDLHVCQUFoQztBQUNBLE9BQU9DLGlCQUFQLE1BQThCLHFCQUE5QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLHlCQUFsQztBQUNBLE9BQU9DLFVBQVAsTUFBdUIsY0FBdkI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLFlBQVAsTUFBeUIsZ0JBQXpCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QixjQUF2QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDBCQUFuQztBQUNBLE9BQU9DLGFBQVAsTUFBMEIsaUJBQTFCO0FBQ0EsT0FBT0MsT0FBUCxNQUFvQixXQUFwQjtBQUNBLE9BQU9DLGNBQVAsTUFBMkIsa0JBQTNCO0FBQ0EsT0FBT0MsY0FBUCxNQUEyQixrQkFBM0I7QUFDQSxPQUFPQyxrQkFBUCxNQUErQixzQkFBL0I7QUFDQSxPQUFPQyxhQUFQLE1BQTBCLGlCQUExQjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsaUJBQTFCO0FBQ0EsT0FBT0MsYUFBUCxNQUEwQixpQkFBMUI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLDZCQUFQLE1BQTBDLGlDQUExQztBQUNBLE9BQU9DLG1CQUFQLE1BQWdDLHVCQUFoQztBQUNBLE9BQU9DLGdCQUFQLE1BQTZCLG9CQUE3QjtBQUNBLE9BQU9DLGVBQVAsTUFBNEIsbUJBQTVCO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxjQUFQLE1BQTJCLGtCQUEzQjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsaUJBQTFCO0FBQ0EsT0FBT0Msa0JBQVAsTUFBK0Isc0JBQS9CO0FBQ0EsU0FBU0Msb0JBQVQsUUFBcUMsZUFBckM7O0FBRUEsTUFBTUMsTUFBTSxHQUFHbkMsT0FBTyxDQUFDLFlBQUQsQ0FBdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxTQUFTb0MscUJBQVQsQ0FBK0JDLFFBQS9CLEVBQTZFO0VBQzNFLEtBQUssTUFBTUMsR0FBWCxJQUFrQkQsUUFBbEIsRUFBNEI7SUFDMUIsSUFBSUgsb0JBQW9CLENBQUNJLEdBQUQsQ0FBeEIsRUFBK0IsT0FBTyxJQUFQO0VBQ2hDO0VBQ0QsT0FBTyxLQUFQO0FBQ0Q7O0FBRUQsT0FBTyxTQUFTQyxhQUFULENBQXVCLEdBQUdDLE9BQTFCLEVBQStEO0VBQ3BFLElBQUlDLE9BQW9CLEdBQUcsSUFBM0I7RUFDQSxLQUFLLE1BQU1DLE1BQVgsSUFBcUJGLE9BQXJCLEVBQThCO0lBQzVCLElBQUksQ0FBQ0UsTUFBTCxFQUFhO0lBQ2IsSUFBSUEsTUFBTSxDQUFDTCxRQUFQLElBQW1CRCxxQkFBcUIsQ0FBQ00sTUFBTSxDQUFDTCxRQUFSLENBQTVDLEVBQStEO01BQzdELElBQUksQ0FBQ0ksT0FBTCxFQUFjQSxPQUFPLEdBQUcsRUFBVjtNQUNkLElBQUksQ0FBQ0EsT0FBTyxDQUFDSixRQUFiLEVBQXVCSSxPQUFPLENBQUNKLFFBQVIsR0FBbUIsRUFBbkI7TUFDdkIsS0FBSyxNQUFNLENBQUNDLEdBQUQsRUFBTUssS0FBTixDQUFYLElBQTJCQyxNQUFNLENBQUNDLE9BQVAsQ0FBZUgsTUFBTSxDQUFDTCxRQUF0QixDQUEzQixFQUE0RDtRQUMxRCxJQUFJSCxvQkFBb0IsQ0FBQ0ksR0FBRCxDQUF4QixFQUErQkcsT0FBTyxDQUFDSixRQUFSLENBQWlCQyxHQUFqQixJQUF3QkssS0FBeEI7TUFDaEM7SUFDRjtJQUNELElBQUlELE1BQU0sQ0FBQ0ksYUFBUCxJQUF3QlYscUJBQXFCLENBQUNNLE1BQU0sQ0FBQ0ksYUFBUixDQUFqRCxFQUF5RTtNQUN2RSxJQUFJLENBQUNMLE9BQUwsRUFBY0EsT0FBTyxHQUFHLEVBQVY7TUFDZCxJQUFJLENBQUNBLE9BQU8sQ0FBQ0ssYUFBYixFQUE0QkwsT0FBTyxDQUFDSyxhQUFSLEdBQXdCLEVBQXhCO01BQzVCLEtBQUssTUFBTSxDQUFDUixHQUFELEVBQU1LLEtBQU4sQ0FBWCxJQUEyQkMsTUFBTSxDQUFDQyxPQUFQLENBQWVILE1BQU0sQ0FBQ0ksYUFBdEIsQ0FBM0IsRUFBaUU7UUFDL0QsSUFBSVosb0JBQW9CLENBQUNJLEdBQUQsQ0FBeEIsRUFBK0JHLE9BQU8sQ0FBQ0ssYUFBUixDQUFzQlIsR0FBdEIsSUFBNkJLLEtBQTdCO01BQ2hDO0lBQ0Y7SUFDRCxJQUFJRCxNQUFNLENBQUNLLGNBQVgsRUFBMkI7TUFDekIsSUFBSSxDQUFDTixPQUFMLEVBQWNBLE9BQU8sR0FBRyxFQUFWO01BQ2QsSUFBSSxDQUFDQSxPQUFPLENBQUNNLGNBQWIsRUFBNkJOLE9BQU8sQ0FBQ00sY0FBUixHQUF5QixFQUF6QjtNQUM3QkgsTUFBTSxDQUFDSSxNQUFQLENBQWNQLE9BQU8sQ0FBQ00sY0FBdEIsRUFBc0NMLE1BQU0sQ0FBQ0ssY0FBN0M7SUFDRDtFQUNGO0VBQ0QsT0FBT04sT0FBUDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkQsTUFBTVEsWUFNTDs7Ozs7O0FBQUc7RUFDRmhELGlCQURFO0VBRUZDLGNBRkU7RUFHRkMsY0FIRTtFQUlGQyxlQUpFO0VBS0ZDLGFBTEU7RUFNRkcsZUFORTtFQU9GQyxtQkFQRTtFQVFGQyxpQkFSRTtFQVNGQyxxQkFURTtFQVVGQyxVQVZFO0VBV0ZDLGVBWEU7RUFZRkMsWUFaRTtFQWFGQyxVQWJFO0VBY0ZDLHNCQWRFO0VBZUZDLGFBZkU7RUFnQkZDLE9BaEJFO0VBaUJGQyxjQWpCRTtFQWtCRjtFQUNBQyxjQW5CRTtFQW9CRkMsa0JBcEJFO0VBcUJGQyxhQXJCRTtFQXNCRkMsYUF0QkU7RUF1QkZDLGFBdkJFO0VBd0JGQyxlQXhCRTtFQXlCRkMsNkJBekJFO0VBMEJGQyxtQkExQkU7RUEyQkZDLGdCQTNCRTtFQTRCRkMsZUE1QkU7RUE2QkZDLGVBN0JFO0VBOEJGQyxjQTlCRTtFQStCRkMsYUEvQkU7RUFnQ0ZDLGtCQWhDRSxFQU5KOzs7QUF5Q0EsT0FBTyxTQUFTaUIsdUJBQVQ7QUFDTEMsT0FESztBQUVMQyxPQUZLO0FBR0wsRUFBRUMsS0FBRixFQUhLO0FBSVk7RUFDakIsT0FBTztJQUNMRixPQURLO0lBRUxHLFFBQVEsRUFBRUYsT0FBTyxDQUFDRSxRQUZiO0lBR0xDLEtBQUssRUFBRSxDQUFDQyxJQUFELEVBQWlCQyxVQUFqQixLQUEwRDtNQUMvREosS0FBSyxDQUFDLGVBQUQsRUFBa0JGLE9BQU8sQ0FBQ1IsS0FBUixDQUFjZSxJQUFoQyxDQUFMO01BQ0EsTUFBTWhCLE1BQU0sR0FBR1UsT0FBTyxDQUFDRyxLQUFSLENBQWNDLElBQWQsRUFBb0JDLFVBQXBCLENBQWY7TUFDQSxJQUFJZixNQUFKLEVBQVk7UUFDVixJQUFJQSxNQUFNLEtBQUssSUFBZixFQUFxQlcsS0FBSyxDQUFDLFdBQUQsQ0FBTDtRQUNyQixPQUFPLE9BQU9YLE1BQVAsS0FBa0IsUUFBbEIsR0FBNkJBLE1BQTdCLEdBQXNDZSxVQUFVLElBQUksRUFBM0Q7TUFDRCxDQUhELE1BR087UUFDTCxJQUFJZixNQUFNLEtBQUssS0FBZixFQUFzQlcsS0FBSyxDQUFFLGdCQUFGLENBQUw7UUFDdEIsT0FBTyxJQUFQO01BQ0Q7SUFDRixDQWJJLEVBQVA7O0FBZUQ7O0FBRUQsZUFBZSxTQUFTTSxjQUFUO0FBQ2JILElBRGE7QUFFYkksa0JBRmE7QUFHSTtFQUNqQixNQUFNLEVBQUVQLEtBQUssR0FBR2xCLE1BQVYsS0FBcUJ5QixrQkFBM0I7RUFDQSxNQUFNQyxjQUFjLEdBQUcsRUFBRSxHQUFHRCxrQkFBTCxFQUF5QlAsS0FBekIsRUFBdkI7RUFDQSxJQUFJUyxLQUFLLENBQUNDLE9BQU4sQ0FBY1AsSUFBSSxDQUFDYixLQUFuQixDQUFKLEVBQStCO0lBQzdCLE9BQU9yQywwQkFBMEIsQ0FBQ2tELElBQUQsRUFBT0ssY0FBUCxDQUFqQztFQUNELENBRkQsTUFFTyxJQUFJWixZQUFZLENBQUNPLElBQUksQ0FBQ2IsS0FBTCxDQUFXZSxJQUFaLENBQWhCLEVBQW1DO0lBQ3hDLE1BQU1OLE9BQU8sR0FBR0gsWUFBWSxDQUFDTyxJQUFJLENBQUNiLEtBQUwsQ0FBV2UsSUFBWixDQUFaLENBQThCRixJQUE5QixFQUFvQ0ssY0FBcEMsQ0FBaEI7SUFDQSxJQUFJVCxPQUFKLEVBQWEsT0FBT0EsT0FBUDtFQUNkO0VBQ0QsT0FBTzdDLHlCQUF5QixDQUFDaUQsSUFBRCxFQUFPSyxjQUFQLENBQWhDO0FBQ0QifQ==