UNPKG

41.1 kBJavaScriptView Raw
1import _ from 'lodash';
2import ts from 'typescript';
3import { heritage, modifier, overload, parametered } from './base';
4import * as declaration from './declaration';
5import * as node_ from './node';
6import * as reference from './reference';
7import * as symbol_ from './symbol';
8import * as type_ from './type_';
9import * as utils from './utils';
10export function isClassProperty(node) {
11 return ts.isPropertyDeclaration(node) || ts.isGetAccessorDeclaration(node) || ts.isSetAccessorDeclaration(node);
12}
13export function isClassInstanceProperty(node) {
14 return (isClassProperty(node) || ts.isParameterPropertyDeclaration(node)) && !modifier.isStatic(node);
15}
16export function isClassInstanceMember(node) {
17 return (ts.isMethodDeclaration(node) || isClassInstanceProperty(node)) && !modifier.isStatic(node);
18}
19export function isClassStaticProperty(node) {
20 return (ts.isMethodDeclaration(node) || isClassProperty(node)) && modifier.isStatic(node);
21}
22export function isClassStaticMember(node) {
23 return (ts.isMethodDeclaration(node) || isClassProperty(node)) && modifier.isStatic(node);
24}
25export function isClassMember(node) {
26 return isClassInstanceMember(node) || isClassStaticMember(node);
27}
28export function getExtends(node) {
29 const extendsClause = heritage.getHeritageClauseByKind(node, ts.SyntaxKind.ExtendsKeyword);
30 if (extendsClause === undefined) {
31 return undefined;
32 }
33 const typeNodes = heritage.getTypeNodes(extendsClause);
34 return typeNodes.length === 0 ? undefined : typeNodes[0];
35}
36export function getExtendsOrThrow(node) {
37 return utils.throwIfNullOrUndefined(getExtends(node), 'extends expression');
38}
39export function getImplements(node) {
40 const implementsClause = heritage.getHeritageClauseByKind(node, ts.SyntaxKind.ImplementsKeyword);
41 if (implementsClause === undefined) {
42 return undefined;
43 }
44 return heritage.getTypeNodes(implementsClause);
45}
46export function getImplementsArray(node) {
47 return utils.getArray(getImplements(node));
48}
49export function getMembers(node) {
50 const members = [...node.members];
51 const implementationCtors = members.filter(ts.isConstructorDeclaration).filter((c) => overload.isImplementation(c));
52 for (const ctor of implementationCtors) {
53 let insertIndex = members.indexOf(ctor) + 1;
54 for (const param of parametered.getParameters(ctor)) {
55 if (ts.isParameterPropertyDeclaration(param)) {
56 members.splice(insertIndex, 0, param);
57 insertIndex += 1;
58 }
59 }
60 }
61 return members.filter(isClassMember);
62}
63export function getConcreteMembers(node) {
64 return declaration.isAmbient(node)
65 ? []
66 : getMembers(node).filter((member) => {
67 if (ts.isMethodDeclaration(member)) {
68 return overload.isImplementation(member);
69 }
70 return true;
71 });
72}
73export function getInstanceProperties(node) {
74 return getMembers(node).filter(isClassInstanceProperty);
75}
76export function getInstanceMembers(node) {
77 return getMembers(node).filter(isClassInstanceMember);
78}
79export function getInstanceMethods(node) {
80 return getInstanceMembers(node).filter(ts.isMethodDeclaration);
81}
82export function getMethods(node) {
83 return getMembers(node).filter(ts.isMethodDeclaration);
84}
85export function getSetAccessors(node) {
86 return getMembers(node).filter(ts.isSetAccessor);
87}
88export function getInstanceMethod(node, name) {
89 return getInstanceMethods(node).find((method) => node_.getName(method) === name);
90}
91export function getConcreteInstanceProperties(node) {
92 return getConcreteMembers(node).filter(isClassInstanceProperty);
93}
94export function getConcreteInstanceMembers(node) {
95 return getConcreteMembers(node).filter(isClassInstanceMember);
96}
97export function getConcreteInstanceMethods(node) {
98 return getConcreteInstanceMembers(node).filter(ts.isMethodDeclaration);
99}
100export function getStaticProperties(node) {
101 return getMembers(node).filter(isClassStaticProperty);
102}
103export function getStaticMembers(node) {
104 return getMembers(node).filter(isClassStaticMember);
105}
106export function getConcreteStaticProperties(node) {
107 return getConcreteMembers(node).filter(isClassStaticProperty);
108}
109export function getConcreteStaticMembers(node) {
110 return getConcreteMembers(node).filter(isClassStaticMember);
111}
112export function getConcreteStaticMethods(node) {
113 return getConcreteStaticMembers(node).filter(ts.isMethodDeclaration);
114}
115export function getConstructors(node) {
116 return node.members.filter(ts.isConstructorDeclaration);
117}
118export function getConcreteConstructor(node) {
119 return getConstructors(node).find((ctor) => overload.isImplementation(ctor));
120}
121export function getFirstConcreteConstructor(typeChecker, node) {
122 const ctor = getConcreteConstructor(node);
123 if (ctor !== undefined) {
124 return ctor;
125 }
126 const baseClass = getBaseClass(typeChecker, node);
127 if (baseClass === undefined) {
128 return undefined;
129 }
130 return getFirstConcreteConstructor(typeChecker, baseClass);
131}
132function getDerivedClassesWorker(program, languageService, node, seen = new Set()) {
133 if (seen.has(node)) {
134 return [];
135 }
136 return reference
137 .findReferencesAsNodes(program, languageService, node)
138 .reduce((acc, ref) => {
139 const parent = node_.getParent(ref);
140 if (parent === undefined) {
141 return acc;
142 }
143 const clause = node_.getParent(parent);
144 if (clause === undefined || !ts.isHeritageClause(clause) || !heritage.isExtends(clause)) {
145 return acc;
146 }
147 const derived = node_.getFirstAncestorByKindOrThrow(clause, ts.SyntaxKind.ClassDeclaration);
148 return acc.concat(getDerivedClassesWorker(program, languageService, derived, seen));
149 }, [])
150 .concat([node]);
151}
152export function getDerivedClasses(program, languageService, node) {
153 const result = getDerivedClassesWorker(program, languageService, node);
154 return result.filter((value) => value !== node);
155}
156function getImplementorsWorker(program, languageService, node, seen = new Set()) {
157 if (seen.has(node)) {
158 return [];
159 }
160 return reference
161 .findReferencesAsNodes(program, languageService, node)
162 .reduce((acc, ref) => {
163 const parent = node_.getParent(ref);
164 if (parent === undefined) {
165 return acc;
166 }
167 const clause = node_.getParent(parent);
168 if (clause === undefined ||
169 !ts.isHeritageClause(clause) ||
170 (!heritage.isImplements(clause) && !heritage.isExtends(clause))) {
171 return acc;
172 }
173 let derived = node_.getFirstAncestorByKind(clause, ts.SyntaxKind.ClassDeclaration);
174 if (derived === undefined) {
175 derived = node_.getFirstAncestorByKindOrThrow(clause, ts.SyntaxKind.InterfaceDeclaration);
176 }
177 return acc.concat(getImplementorsWorker(program, languageService, derived, seen));
178 }, [])
179 .concat(ts.isClassDeclaration(node) ? [node] : []);
180}
181export function getImplementors(program, languageService, node) {
182 return getImplementorsWorker(program, languageService, node);
183}
184function getExtendorsWorker(program, languageService, node, seen = new Set()) {
185 if (seen.has(node)) {
186 return [];
187 }
188 return reference
189 .findReferencesAsNodes(program, languageService, node)
190 .reduce((acc, ref) => {
191 const parent = node_.getParent(ref);
192 if (parent === undefined) {
193 return acc;
194 }
195 const clause = node_.getParent(parent);
196 if (clause === undefined || !ts.isHeritageClause(clause) || !heritage.isExtends(clause)) {
197 return acc;
198 }
199 const derived = node_.getFirstAncestorByTestOrThrow(clause, ts.isClassDeclaration);
200 return acc.concat(getImplementorsWorker(program, languageService, derived, seen));
201 }, [])
202 .concat(ts.isClassDeclaration(node) ? [node] : []);
203}
204export function getExtendors(program, languageService, node) {
205 return getExtendorsWorker(program, languageService, node);
206}
207export function getBaseTypes(typeChecker, node) {
208 return type_.getBaseTypesArray(type_.getType(typeChecker, node));
209}
210export function getBaseTypesFlattened(typeChecker, node) {
211 function getBaseTypesWorker(type) {
212 if (type_.isIntersection(type)) {
213 return _.flatten(type_.getIntersectionTypesArray(type).map(getBaseTypesWorker));
214 }
215 const baseTypes = type_.getBaseTypesArray(type);
216 return [type].concat(_.flatten(baseTypes.map(getBaseTypesWorker)));
217 }
218 return _.flatten(getBaseTypes(typeChecker, node).map(getBaseTypesWorker));
219}
220export function getBaseClasses(typeChecker, node) {
221 const baseTypes = getBaseTypesFlattened(typeChecker, node);
222 return baseTypes
223 .map((type) => type_.getSymbol(type))
224 .filter(utils.notNull)
225 .map((symbol) => symbol_.getDeclarations(symbol))
226 .reduce((a, b) => a.concat(b), [])
227 .filter(ts.isClassDeclaration);
228}
229export function getBaseClass(typeChecker, node) {
230 const declarations = getBaseClasses(typeChecker, node);
231 return declarations.length === 1 ? declarations[0] : undefined;
232}
233
234//# sourceMappingURL=data:application/json;charset=utf8;base64,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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IGhlcml0YWdlLCBtb2RpZmllciwgb3ZlcmxvYWQsIHBhcmFtZXRlcmVkIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIGRlY2xhcmF0aW9uIGZyb20gJy4vZGVjbGFyYXRpb24nO1xuaW1wb3J0ICogYXMgbm9kZV8gZnJvbSAnLi9ub2RlJztcbmltcG9ydCAqIGFzIHJlZmVyZW5jZSBmcm9tICcuL3JlZmVyZW5jZSc7XG5pbXBvcnQgKiBhcyBzeW1ib2xfIGZyb20gJy4vc3ltYm9sJztcbmltcG9ydCAqIGFzIHR5cGVfIGZyb20gJy4vdHlwZV8nO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIENsYXNzUHJvcGVydHlUeXBlID0gdHMuUHJvcGVydHlEZWNsYXJhdGlvbiB8IHRzLkdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCB0cy5TZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NQcm9wZXJ0eShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc1Byb3BlcnR5VHlwZSB7XG4gIHJldHVybiB0cy5pc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgdHMuaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKTtcbn1cblxuZXhwb3J0IHR5cGUgQ2xhc3NJbnN0YW5jZVByb3BlcnR5VHlwZSA9IENsYXNzUHJvcGVydHlUeXBlIHwgdHMuUGFyYW1ldGVyUHJvcGVydHlEZWNsYXJhdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBpc0NsYXNzSW5zdGFuY2VQcm9wZXJ0eShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc0luc3RhbmNlUHJvcGVydHlUeXBlIHtcbiAgcmV0dXJuIChpc0NsYXNzUHJvcGVydHkobm9kZSkgfHwgdHMuaXNQYXJhbWV0ZXJQcm9wZXJ0eURlY2xhcmF0aW9uKG5vZGUpKSAmJiAhbW9kaWZpZXIuaXNTdGF0aWMobm9kZSk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzSW5zdGFuY2VNZW1iZXJUeXBlID0gdHMuTWV0aG9kRGVjbGFyYXRpb24gfCBDbGFzc0luc3RhbmNlUHJvcGVydHlUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NJbnN0YW5jZU1lbWJlcihub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc0luc3RhbmNlTWVtYmVyVHlwZSB7XG4gIHJldHVybiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc0NsYXNzSW5zdGFuY2VQcm9wZXJ0eShub2RlKSkgJiYgIW1vZGlmaWVyLmlzU3RhdGljKG5vZGUpO1xufVxuXG5leHBvcnQgdHlwZSBDbGFzc1N0YXRpY1Byb3BlcnR5VHlwZSA9IENsYXNzUHJvcGVydHlUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NTdGF0aWNQcm9wZXJ0eShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyBDbGFzc1N0YXRpY1Byb3BlcnR5VHlwZSB7XG4gIHJldHVybiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc0NsYXNzUHJvcGVydHkobm9kZSkpICYmIG1vZGlmaWVyLmlzU3RhdGljKG5vZGUpO1xufVxuXG5leHBvcnQgdHlwZSBDbGFzc1N0YXRpY01lbWJlclR5cGUgPSB0cy5NZXRob2REZWNsYXJhdGlvbiB8IENsYXNzU3RhdGljUHJvcGVydHlUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NTdGF0aWNNZW1iZXIobm9kZTogdHMuTm9kZSk6IG5vZGUgaXMgQ2xhc3NTdGF0aWNNZW1iZXJUeXBlIHtcbiAgcmV0dXJuICh0cy5pc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzQ2xhc3NQcm9wZXJ0eShub2RlKSkgJiYgbW9kaWZpZXIuaXNTdGF0aWMobm9kZSk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzTWVtYmVyVHlwZSA9IENsYXNzSW5zdGFuY2VNZW1iZXJUeXBlIHwgQ2xhc3NTdGF0aWNNZW1iZXJUeXBlO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xhc3NNZW1iZXIobm9kZTogdHMuTm9kZSk6IG5vZGUgaXMgQ2xhc3NNZW1iZXJUeXBlIHtcbiAgcmV0dXJuIGlzQ2xhc3NJbnN0YW5jZU1lbWJlcihub2RlKSB8fCBpc0NsYXNzU3RhdGljTWVtYmVyKG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5kcyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogdHMuRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXh0ZW5kc0NsYXVzZSA9IGhlcml0YWdlLmdldEhlcml0YWdlQ2xhdXNlQnlLaW5kKG5vZGUsIHRzLlN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpO1xuICBpZiAoZXh0ZW5kc0NsYXVzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHR5cGVOb2RlcyA9IGhlcml0YWdlLmdldFR5cGVOb2RlcyhleHRlbmRzQ2xhdXNlKTtcblxuICByZXR1cm4gdHlwZU5vZGVzLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHR5cGVOb2Rlc1swXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuZHNPclRocm93KG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiB0cy5FeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMge1xuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXRFeHRlbmRzKG5vZGUpLCAnZXh0ZW5kcyBleHByZXNzaW9uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBsZW1lbnRzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgdHMuRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbXBsZW1lbnRzQ2xhdXNlID0gaGVyaXRhZ2UuZ2V0SGVyaXRhZ2VDbGF1c2VCeUtpbmQobm9kZSwgdHMuU3ludGF4S2luZC5JbXBsZW1lbnRzS2V5d29yZCk7XG4gIGlmIChpbXBsZW1lbnRzQ2xhdXNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGhlcml0YWdlLmdldFR5cGVOb2RlcyhpbXBsZW1lbnRzQ2xhdXNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGxlbWVudHNBcnJheShcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbixcbik6IHJlYWRvbmx5IHRzLkV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1tdIHtcbiAgcmV0dXJuIHV0aWxzLmdldEFycmF5KGdldEltcGxlbWVudHMobm9kZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVtYmVycyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogcmVhZG9ubHkgQ2xhc3NNZW1iZXJUeXBlW10ge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgcmVhZG9ubHktYXJyYXlcbiAgY29uc3QgbWVtYmVyczogQXJyYXk8dHMuQ2xhc3NFbGVtZW50IHwgdHMuUGFyYW1ldGVyUHJvcGVydHlEZWNsYXJhdGlvbj4gPSBbLi4ubm9kZS5tZW1iZXJzXTtcbiAgY29uc3QgaW1wbGVtZW50YXRpb25DdG9ycyA9IG1lbWJlcnMuZmlsdGVyKHRzLmlzQ29uc3RydWN0b3JEZWNsYXJhdGlvbikuZmlsdGVyKChjKSA9PiBvdmVybG9hZC5pc0ltcGxlbWVudGF0aW9uKGMpKTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gIGZvciAoY29uc3QgY3RvciBvZiBpbXBsZW1lbnRhdGlvbkN0b3JzKSB7XG4gICAgLy8gaW5zZXJ0IGFmdGVyIHRoZSBjb25zdHJ1Y3RvclxuICAgIGxldCBpbnNlcnRJbmRleCA9IG1lbWJlcnMuaW5kZXhPZihjdG9yKSArIDE7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbWV0ZXJlZC5nZXRQYXJhbWV0ZXJzKGN0b3IpKSB7XG4gICAgICBpZiAodHMuaXNQYXJhbWV0ZXJQcm9wZXJ0eURlY2xhcmF0aW9uKHBhcmFtKSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXJyYXktbXV0YXRpb25cbiAgICAgICAgbWVtYmVycy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHBhcmFtKTtcbiAgICAgICAgaW5zZXJ0SW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVtYmVycy5maWx0ZXIoaXNDbGFzc01lbWJlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZU1lbWJlcnMobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbik6IHJlYWRvbmx5IENsYXNzTWVtYmVyVHlwZVtdIHtcbiAgcmV0dXJuIGRlY2xhcmF0aW9uLmlzQW1iaWVudChub2RlKVxuICAgID8gW11cbiAgICA6IGdldE1lbWJlcnMobm9kZSkuZmlsdGVyKChtZW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgIHJldHVybiBvdmVybG9hZC5pc0ltcGxlbWVudGF0aW9uKG1lbWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgQ2xhc3NJbnN0YW5jZVByb3BlcnR5VHlwZVtdIHtcbiAgcmV0dXJuIGdldE1lbWJlcnMobm9kZSkuZmlsdGVyKGlzQ2xhc3NJbnN0YW5jZVByb3BlcnR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbmNlTWVtYmVycyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogcmVhZG9ubHkgQ2xhc3NJbnN0YW5jZU1lbWJlclR5cGVbXSB7XG4gIHJldHVybiBnZXRNZW1iZXJzKG5vZGUpLmZpbHRlcihpc0NsYXNzSW5zdGFuY2VNZW1iZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdGFuY2VNZXRob2RzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiByZWFkb25seSB0cy5NZXRob2REZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldEluc3RhbmNlTWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNNZXRob2REZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2RzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiByZWFkb25seSB0cy5NZXRob2REZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldE1lbWJlcnMobm9kZSkuZmlsdGVyKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0QWNjZXNzb3JzKG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24pOiByZWFkb25seSB0cy5TZXRBY2Nlc3NvckRlY2xhcmF0aW9uW10ge1xuICByZXR1cm4gZ2V0TWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNTZXRBY2Nlc3Nvcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YW5jZU1ldGhvZChcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbixcbiAgbmFtZTogc3RyaW5nLFxuKTogdHMuTWV0aG9kRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0SW5zdGFuY2VNZXRob2RzKG5vZGUpLmZpbmQoKG1ldGhvZCkgPT4gbm9kZV8uZ2V0TmFtZShtZXRob2QpID09PSBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmNyZXRlSW5zdGFuY2VQcm9wZXJ0aWVzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgQ2xhc3NJbnN0YW5jZVByb3BlcnR5VHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc0luc3RhbmNlUHJvcGVydHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uY3JldGVJbnN0YW5jZU1lbWJlcnMoXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24sXG4pOiByZWFkb25seSBDbGFzc0luc3RhbmNlTWVtYmVyVHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc0luc3RhbmNlTWVtYmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmNyZXRlSW5zdGFuY2VNZXRob2RzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgdHMuTWV0aG9kRGVjbGFyYXRpb25bXSB7XG4gIHJldHVybiBnZXRDb25jcmV0ZUluc3RhbmNlTWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNNZXRob2REZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0aWNQcm9wZXJ0aWVzKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgQ2xhc3NTdGF0aWNQcm9wZXJ0eVR5cGVbXSB7XG4gIHJldHVybiBnZXRNZW1iZXJzKG5vZGUpLmZpbHRlcihpc0NsYXNzU3RhdGljUHJvcGVydHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdGljTWVtYmVycyhub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uKTogcmVhZG9ubHkgQ2xhc3NTdGF0aWNNZW1iZXJUeXBlW10ge1xuICByZXR1cm4gZ2V0TWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc1N0YXRpY01lbWJlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZVN0YXRpY1Byb3BlcnRpZXMoXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24sXG4pOiByZWFkb25seSBDbGFzc1N0YXRpY1Byb3BlcnR5VHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc1N0YXRpY1Byb3BlcnR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmNyZXRlU3RhdGljTWVtYmVycyhcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbixcbik6IHJlYWRvbmx5IENsYXNzU3RhdGljTWVtYmVyVHlwZVtdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlTWVtYmVycyhub2RlKS5maWx0ZXIoaXNDbGFzc1N0YXRpY01lbWJlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZVN0YXRpY01ldGhvZHMoXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24sXG4pOiByZWFkb25seSB0cy5NZXRob2REZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldENvbmNyZXRlU3RhdGljTWVtYmVycyhub2RlKS5maWx0ZXIodHMuaXNNZXRob2REZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25zdHJ1Y3RvcnMobm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbik6IHJlYWRvbmx5IHRzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb25bXSB7XG4gIHJldHVybiBub2RlLm1lbWJlcnMuZmlsdGVyKHRzLmlzQ29uc3RydWN0b3JEZWNsYXJhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jcmV0ZUNvbnN0cnVjdG9yKFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogdHMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRDb25zdHJ1Y3RvcnMobm9kZSkuZmluZCgoY3RvcikgPT4gb3ZlcmxvYWQuaXNJbXBsZW1lbnRhdGlvbihjdG9yKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdENvbmNyZXRlQ29uc3RydWN0b3IoXG4gIHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbixcbik6IHRzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdG9yID0gZ2V0Q29uY3JldGVDb25zdHJ1Y3Rvcihub2RlKTtcbiAgaWYgKGN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjdG9yO1xuICB9XG5cbiAgY29uc3QgYmFzZUNsYXNzID0gZ2V0QmFzZUNsYXNzKHR5cGVDaGVja2VyLCBub2RlKTtcbiAgaWYgKGJhc2VDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBnZXRGaXJzdENvbmNyZXRlQ29uc3RydWN0b3IodHlwZUNoZWNrZXIsIGJhc2VDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIGdldERlcml2ZWRDbGFzc2VzV29ya2VyKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSxcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbixcbiAgc2VlbiA9IG5ldyBTZXQ8dHMuQ2xhc3NEZWNsYXJhdGlvbj4oKSxcbik6IHJlYWRvbmx5IHRzLkNsYXNzRGVjbGFyYXRpb25bXSB7XG4gIGlmIChzZWVuLmhhcyhub2RlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiByZWZlcmVuY2VcbiAgICAuZmluZFJlZmVyZW5jZXNBc05vZGVzKHByb2dyYW0sIGxhbmd1YWdlU2VydmljZSwgbm9kZSlcbiAgICAucmVkdWNlPHJlYWRvbmx5IHRzLkNsYXNzRGVjbGFyYXRpb25bXT4oKGFjYywgcmVmKSA9PiB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBub2RlXy5nZXRQYXJlbnQocmVmKSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsYXVzZSA9IG5vZGVfLmdldFBhcmVudChwYXJlbnQpIGFzIHRzLk5vZGUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2xhdXNlID09PSB1bmRlZmluZWQgfHwgIXRzLmlzSGVyaXRhZ2VDbGF1c2UoY2xhdXNlKSB8fCAhaGVyaXRhZ2UuaXNFeHRlbmRzKGNsYXVzZSkpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVyaXZlZCA9IG5vZGVfLmdldEZpcnN0QW5jZXN0b3JCeUtpbmRPclRocm93PHRzLkNsYXNzRGVjbGFyYXRpb24+KGNsYXVzZSwgdHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcblxuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0RGVyaXZlZENsYXNzZXNXb3JrZXIocHJvZ3JhbSwgbGFuZ3VhZ2VTZXJ2aWNlLCBkZXJpdmVkLCBzZWVuKSk7XG4gICAgfSwgW10pXG4gICAgLmNvbmNhdChbbm9kZV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVyaXZlZENsYXNzZXMoXG4gIHByb2dyYW06IHRzLlByb2dyYW0sXG4gIGxhbmd1YWdlU2VydmljZTogdHMuTGFuZ3VhZ2VTZXJ2aWNlLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uLFxuKTogcmVhZG9ubHkgdHMuQ2xhc3NEZWNsYXJhdGlvbltdIHtcbiAgY29uc3QgcmVzdWx0ID0gZ2V0RGVyaXZlZENsYXNzZXNXb3JrZXIocHJvZ3JhbSwgbGFuZ3VhZ2VTZXJ2aWNlLCBub2RlKTtcblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSBub2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW1wbGVtZW50b3JzV29ya2VyKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSxcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkludGVyZmFjZURlY2xhcmF0aW9uLFxuICBzZWVuID0gbmV3IFNldDx0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24+KCksXG4pOiByZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10ge1xuICBpZiAoc2Vlbi5oYXMobm9kZSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gcmVmZXJlbmNlXG4gICAgLmZpbmRSZWZlcmVuY2VzQXNOb2Rlcyhwcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2UsIG5vZGUpXG4gICAgLnJlZHVjZTxyZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10+KChhY2MsIHJlZikgPT4ge1xuICAgICAgY29uc3QgcGFyZW50ID0gbm9kZV8uZ2V0UGFyZW50KHJlZikgYXMgdHMuTm9kZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGF1c2UgPSBub2RlXy5nZXRQYXJlbnQocGFyZW50KSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBjbGF1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAhdHMuaXNIZXJpdGFnZUNsYXVzZShjbGF1c2UpIHx8XG4gICAgICAgICghaGVyaXRhZ2UuaXNJbXBsZW1lbnRzKGNsYXVzZSkgJiYgIWhlcml0YWdlLmlzRXh0ZW5kcyhjbGF1c2UpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGxldCBkZXJpdmVkOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgPSBub2RlXy5nZXRGaXJzdEFuY2VzdG9yQnlLaW5kPFxuICAgICAgICB0cy5DbGFzc0RlY2xhcmF0aW9uXG4gICAgICA+KGNsYXVzZSwgdHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgIGlmIChkZXJpdmVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVyaXZlZCA9IG5vZGVfLmdldEZpcnN0QW5jZXN0b3JCeUtpbmRPclRocm93PHRzLkludGVyZmFjZURlY2xhcmF0aW9uPihcbiAgICAgICAgICBjbGF1c2UsXG4gICAgICAgICAgdHMuU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0SW1wbGVtZW50b3JzV29ya2VyKHByb2dyYW0sIGxhbmd1YWdlU2VydmljZSwgZGVyaXZlZCwgc2VlbikpO1xuICAgIH0sIFtdKVxuICAgIC5jb25jYXQodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpID8gW25vZGVdIDogW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wbGVtZW50b3JzKFxuICBwcm9ncmFtOiB0cy5Qcm9ncmFtLFxuICBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSxcbiAgbm9kZTogdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4pOiByZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10ge1xuICByZXR1cm4gZ2V0SW1wbGVtZW50b3JzV29ya2VyKHByb2dyYW0sIGxhbmd1YWdlU2VydmljZSwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGdldEV4dGVuZG9yc1dvcmtlcihcbiAgcHJvZ3JhbTogdHMuUHJvZ3JhbSxcbiAgbGFuZ3VhZ2VTZXJ2aWNlOiB0cy5MYW5ndWFnZVNlcnZpY2UsXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24sXG4gIHNlZW4gPSBuZXcgU2V0PHRzLkNsYXNzRGVjbGFyYXRpb24+KCksXG4pOiByZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10ge1xuICBpZiAoc2Vlbi5oYXMobm9kZSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gcmVmZXJlbmNlXG4gICAgLmZpbmRSZWZlcmVuY2VzQXNOb2Rlcyhwcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2UsIG5vZGUpXG4gICAgLnJlZHVjZTxyZWFkb25seSB0cy5DbGFzc0RlY2xhcmF0aW9uW10+KChhY2MsIHJlZikgPT4ge1xuICAgICAgY29uc3QgcGFyZW50ID0gbm9kZV8uZ2V0UGFyZW50KHJlZikgYXMgdHMuTm9kZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGF1c2UgPSBub2RlXy5nZXRQYXJlbnQocGFyZW50KSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNsYXVzZSA9PT0gdW5kZWZpbmVkIHx8ICF0cy5pc0hlcml0YWdlQ2xhdXNlKGNsYXVzZSkgfHwgIWhlcml0YWdlLmlzRXh0ZW5kcyhjbGF1c2UpKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlcml2ZWQ6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB1bmRlZmluZWQgPSBub2RlXy5nZXRGaXJzdEFuY2VzdG9yQnlUZXN0T3JUaHJvdyhcbiAgICAgICAgY2xhdXNlLFxuICAgICAgICB0cy5pc0NsYXNzRGVjbGFyYXRpb24sXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRJbXBsZW1lbnRvcnNXb3JrZXIocHJvZ3JhbSwgbGFuZ3VhZ2VTZXJ2aWNlLCBkZXJpdmVkLCBzZWVuKSk7XG4gICAgfSwgW10pXG4gICAgLmNvbmNhdCh0cy5pc0NsYXNzRGVjbGFyYXRpb24obm9kZSkgPyBbbm9kZV0gOiBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlbmRvcnMoXG4gIHByb2dyYW06IHRzLlByb2dyYW0sXG4gIGxhbmd1YWdlU2VydmljZTogdHMuTGFuZ3VhZ2VTZXJ2aWNlLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uLFxuKTogcmVhZG9ubHkgdHMuQ2xhc3NEZWNsYXJhdGlvbltdIHtcbiAgcmV0dXJuIGdldEV4dGVuZG9yc1dvcmtlcihwcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2UsIG5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZVR5cGVzKFxuICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIG5vZGU6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb24gfCB0cy5JbnRlcmZhY2VEZWNsYXJhdGlvbixcbik6IHJlYWRvbmx5IHRzLlR5cGVbXSB7XG4gIHJldHVybiB0eXBlXy5nZXRCYXNlVHlwZXNBcnJheSh0eXBlXy5nZXRUeXBlKHR5cGVDaGVja2VyLCBub2RlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlVHlwZXNGbGF0dGVuZWQoXG4gIHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbm9kZTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbiB8IHRzLkludGVyZmFjZURlY2xhcmF0aW9uLFxuKTogcmVhZG9ubHkgdHMuVHlwZVtdIHtcbiAgZnVuY3Rpb24gZ2V0QmFzZVR5cGVzV29ya2VyKHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10ge1xuICAgIGlmICh0eXBlXy5pc0ludGVyc2VjdGlvbih0eXBlKSkge1xuICAgICAgcmV0dXJuIF8uZmxhdHRlbih0eXBlXy5nZXRJbnRlcnNlY3Rpb25UeXBlc0FycmF5KHR5cGUpLm1hcChnZXRCYXNlVHlwZXNXb3JrZXIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlVHlwZXMgPSB0eXBlXy5nZXRCYXNlVHlwZXNBcnJheSh0eXBlKTtcblxuICAgIHJldHVybiBbdHlwZV0uY29uY2F0KF8uZmxhdHRlbihiYXNlVHlwZXMubWFwKGdldEJhc2VUeXBlc1dvcmtlcikpKTtcbiAgfVxuXG4gIHJldHVybiBfLmZsYXR0ZW4oZ2V0QmFzZVR5cGVzKHR5cGVDaGVja2VyLCBub2RlKS5tYXAoZ2V0QmFzZVR5cGVzV29ya2VyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlQ2xhc3NlcyhcbiAgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogcmVhZG9ubHkgdHMuQ2xhc3NEZWNsYXJhdGlvbltdIHtcbiAgY29uc3QgYmFzZVR5cGVzID0gZ2V0QmFzZVR5cGVzRmxhdHRlbmVkKHR5cGVDaGVja2VyLCBub2RlKTtcblxuICByZXR1cm4gYmFzZVR5cGVzXG4gICAgLm1hcCgodHlwZSkgPT4gdHlwZV8uZ2V0U3ltYm9sKHR5cGUpKVxuICAgIC5maWx0ZXIodXRpbHMubm90TnVsbClcbiAgICAubWFwKChzeW1ib2wpID0+IHN5bWJvbF8uZ2V0RGVjbGFyYXRpb25zKHN5bWJvbCkpXG4gICAgLnJlZHVjZTxyZWFkb25seSB0cy5EZWNsYXJhdGlvbltdPigoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKVxuICAgIC5maWx0ZXIodHMuaXNDbGFzc0RlY2xhcmF0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VDbGFzcyhcbiAgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICBub2RlOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuQ2xhc3NFeHByZXNzaW9uLFxuKTogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGdldEJhc2VDbGFzc2VzKHR5cGVDaGVja2VyLCBub2RlKTtcblxuICByZXR1cm4gZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSA/IGRlY2xhcmF0aW9uc1swXSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==