UNPKG

67.2 kBJavaScriptView Raw
1import ts from 'typescript';
2import * as guards from './guards';
3import * as symbol_ from './symbol';
4import * as utils from './utils';
5function getIntrinsicName(type) {
6 return type.intrinsicName;
7}
8export function getTypeNode(node) {
9 return utils.getValueOrUndefined(node.type);
10}
11export function getTypeNodeOrThrow(node) {
12 return utils.throwIfNullOrUndefined(getTypeNode(node), 'type node');
13}
14export function getContextualType(typeChecker, node) {
15 return utils.getValueOrUndefined(typeChecker.getContextualType(node));
16}
17export function getTypeFromTypeNode(typeChecker, typeNode) {
18 return typeChecker.getTypeFromTypeNode(typeNode);
19}
20export function getType(typeChecker, node) {
21 const typeNode = ts.isFunctionLike(node) ? undefined : getTypeNode(node);
22 if (typeNode !== undefined) {
23 return typeChecker.getTypeFromTypeNode(typeNode);
24 }
25 const type = typeChecker.getTypeAtLocation(node);
26 if (isAny(type) && guards.isExpression(node)) {
27 const contextualType = getContextualType(typeChecker, node);
28 if (contextualType !== undefined && !isAny(contextualType)) {
29 return contextualType;
30 }
31 }
32 return type;
33}
34export function getConstraint(type) {
35 return utils.getValueOrUndefined(type.getConstraint());
36}
37export function getTypeAtLocation(typeChecker, symbol, node) {
38 return typeChecker.getTypeOfSymbolAtLocation(symbol, node);
39}
40export function typeToTypeNode(typeChecker, type, node) {
41 return typeChecker.typeToTypeNode(type, node);
42}
43export function typeToTypeNodeOrThrow(typeChecker, type, node) {
44 return utils.throwIfNullOrUndefined(typeToTypeNode(typeChecker, type, node), 'type node');
45}
46export function getSymbol(type) {
47 return utils.getValueOrUndefined(type.getSymbol());
48}
49export function getAliasSymbol(type) {
50 return utils.getValueOrUndefined(type.aliasSymbol);
51}
52export function getAliasTypeArguments(type) {
53 return utils.getValueOrUndefined(type.aliasTypeArguments);
54}
55export function getAliasTypeArgumentsArray(type) {
56 return utils.getArray(getAliasTypeArguments(type));
57}
58export function getSymbolOrThrow(type) {
59 return utils.throwIfNullOrUndefined(getSymbol(type), 'symbol');
60}
61function getDefaultTypeFormatFlags(node) {
62 let formatFlags = ts.TypeFormatFlags.UseTypeOfFunction |
63 ts.TypeFormatFlags.NoTruncation |
64 ts.TypeFormatFlags.UseFullyQualifiedType |
65 ts.TypeFormatFlags.WriteTypeArgumentsOfSignature;
66 if (node !== undefined && node.kind === ts.SyntaxKind.TypeAliasDeclaration) {
67 formatFlags |= ts.TypeFormatFlags.InTypeAlias;
68 }
69 return formatFlags;
70}
71export function getProperties(type) {
72 return type.getProperties();
73}
74export function getConstructSignatures(type) {
75 return type.getConstructSignatures();
76}
77export function getProperty(type, name) {
78 return utils.getValueOrUndefined(type.getProperty(name));
79}
80export function getText(typeChecker, type, node, flags = getDefaultTypeFormatFlags(node)) {
81 return typeChecker.typeToString(type, node, flags);
82}
83export function getBaseTypes(type) {
84 return utils.getValueOrUndefined(type.getBaseTypes());
85}
86export function getBaseTypesArray(type) {
87 return utils.getArray(getBaseTypes(type));
88}
89function isTypeFlag(type, flag) {
90 return (type.flags & flag) === flag;
91}
92function isObjectFlag(type, flag) {
93 return isObjectType(type) && (type.objectFlags & flag) === flag;
94}
95function hasTypeFlag(type, flag) {
96 return (type.flags & flag) !== 0;
97}
98export function getAllTypes(type) {
99 const unionTypes = getUnionTypes(type);
100 if (unionTypes !== undefined) {
101 return unionTypes.reduce((acc, unionType) => acc.concat(getAllTypes(unionType)), []);
102 }
103 const intersectionTypes = getIntersectionTypes(type);
104 if (intersectionTypes !== undefined) {
105 return intersectionTypes.reduce((acc, unionType) => acc.concat(getAllTypes(unionType)), []);
106 }
107 return [type];
108}
109export function getTypes(type, isType) {
110 if (isType(type)) {
111 return [type];
112 }
113 const unionTypes = getUnionTypes(type);
114 if (unionTypes !== undefined) {
115 return unionTypes.reduce((acc, unionType) => acc.concat(getTypes(unionType, isType)), []);
116 }
117 const intersectionTypes = getIntersectionTypes(type);
118 if (intersectionTypes !== undefined) {
119 return intersectionTypes.reduce((acc, unionType) => acc.concat(getTypes(unionType, isType)), []);
120 }
121 return [];
122}
123export function isSymbolic(type) {
124 return !(isPrimitiveish(type) || isIntersection(type) || isUnion(type) || isTuple(type));
125}
126export function isObjectType(type) {
127 return isTypeFlag(type, ts.TypeFlags.Object);
128}
129export function isTypeReference(type) {
130 return isObjectFlag(type, ts.ObjectFlags.Reference);
131}
132export function isTupleType(type) {
133 return isObjectFlag(type, ts.ObjectFlags.Tuple);
134}
135export function isTuple(type) {
136 return isTypeReference(type) && isTupleType(type.target);
137}
138export function hasTuple(type) {
139 return hasType(type, isTuple);
140}
141export function getTupleTypes(type) {
142 return getTypes(type, isTuple);
143}
144export function getTupleElements(type) {
145 return isTuple(type) ? utils.getArray(type.typeArguments) : undefined;
146}
147export function getTypeArguments(type) {
148 return isTypeReference(type) ? utils.getValueOrUndefined(type.typeArguments) : undefined;
149}
150export function getTypeArgumentsArray(type) {
151 return utils.getArray(getTypeArguments(type));
152}
153export function getTypeArgumentsOrThrow(type) {
154 return utils.throwIfNullOrUndefined(getTypeArguments(type), 'type arguments');
155}
156export function isAny(type) {
157 return hasTypeFlag(type, ts.TypeFlags.Any);
158}
159export function isErrorType(type) {
160 return isAny(type) && getIntrinsicName(type) === 'error';
161}
162export function isUnion(type) {
163 return type.isUnion === undefined ? false : type.isUnion();
164}
165export function getUnionTypes(type) {
166 return isUnion(type) ? utils.getArray(type.types) : undefined;
167}
168export function getUnionTypesArray(type) {
169 return utils.getArray(getUnionTypes(type));
170}
171export function isIntersection(type) {
172 return type.isIntersection === undefined ? false : type.isIntersection();
173}
174export function getIntersectionTypes(type) {
175 return isIntersection(type) ? utils.getArray(type.types) : undefined;
176}
177export function getIntersectionTypesArray(type) {
178 return utils.getArray(getIntersectionTypes(type));
179}
180export function hasUnionType(type, isType) {
181 const unionTypes = getUnionTypes(type);
182 return unionTypes !== undefined && unionTypes.some(isType);
183}
184export function hasIntersectionType(type, isType) {
185 const types = getIntersectionTypes(type);
186 return types !== undefined && types.some(isType);
187}
188export function hasType(type, isType) {
189 return isType(type) || hasUnionType(type, isType) || hasIntersectionType(type, isType);
190}
191export function isOnlyType(type, isType) {
192 if (isType(type)) {
193 return true;
194 }
195 const unionTypes = getUnionTypes(type);
196 if (unionTypes !== undefined && unionTypes.every((tpe) => isOnlyType(tpe, isType))) {
197 return true;
198 }
199 const intersectionTypes = getIntersectionTypes(type);
200 if (intersectionTypes !== undefined && intersectionTypes.every((tpe) => isOnlyType(tpe, isType))) {
201 return true;
202 }
203 return false;
204}
205export function isSame(a, b) {
206 return (a !== undefined &&
207 b !== undefined &&
208 (a === b ||
209 (isOnlyBooleanish(a) && isOnlyBooleanish(b)) ||
210 (isOnlyStringish(a) && isOnlyStringish(b)) ||
211 (isOnlyNumberish(a) && isOnlyNumberish(b)) ||
212 (isOnlySymbolish(a) && isOnlySymbolish(b))));
213}
214export function isOnly(type) {
215 return [...new Set(getAllTypes(type))].length === 0;
216}
217export function isNull(type) {
218 return isTypeFlag(type, ts.TypeFlags.Null);
219}
220export function isOnlyNull(type) {
221 return isOnlyType(type, isNull);
222}
223export function hasNull(type) {
224 return hasType(type, isNull);
225}
226export function isUndefined(type) {
227 return isTypeFlag(type, ts.TypeFlags.Undefined);
228}
229export function isOnlyUndefined(type) {
230 return isOnlyType(type, isUndefined);
231}
232export function hasUndefined(type) {
233 return hasType(type, isUndefined);
234}
235export function isUndefinedish(type) {
236 return isUndefined(type) || isVoid(type);
237}
238export function isOnlyUndefinedish(type) {
239 return isOnlyType(type, isUndefinedish);
240}
241export function hasUndefinedish(type) {
242 return hasType(type, isUndefinedish);
243}
244export function isNullable(type) {
245 const types = getUnionTypes(type);
246 return (isNull(type) || isUndefined(type) || (types !== undefined && types.some((tpe) => isNull(tpe) || isUndefined(tpe))));
247}
248export function isNumber(type) {
249 return isTypeFlag(type, ts.TypeFlags.Number);
250}
251export function isOnlyNumber(type) {
252 return isOnlyType(type, isNumber);
253}
254export function hasNumber(type) {
255 return hasType(type, isNumber);
256}
257export function isNumberLike(type) {
258 return isTypeFlag(type, ts.TypeFlags.NumberLike);
259}
260export function isOnlyNumberLike(type) {
261 return isOnlyType(type, isNumberLike);
262}
263export function hasNumberLike(type) {
264 return hasType(type, isNumberLike);
265}
266export function isNumberLiteral(type) {
267 return isTypeFlag(type, ts.TypeFlags.NumberLiteral);
268}
269export function isOnlyNumberLiteral(type) {
270 return isOnlyType(type, isNumberLiteral);
271}
272export function hasNumberLiteral(type) {
273 return hasType(type, isNumberLiteral);
274}
275export function isNumberish(type) {
276 return hasTypeFlag(type, ts.TypeFlags.NumberLike);
277}
278export function isOnlyNumberish(type) {
279 return isOnlyType(type, isNumberish);
280}
281export function hasNumberish(type) {
282 return hasType(type, isNumberish);
283}
284export function isString(type) {
285 return isTypeFlag(type, ts.TypeFlags.String);
286}
287export function isOnlyString(type) {
288 return isOnlyType(type, isString);
289}
290export function hasString(type) {
291 return hasType(type, isString);
292}
293export function isStringLike(type) {
294 return isTypeFlag(type, ts.TypeFlags.StringLike);
295}
296export function isOnlyStringLike(type) {
297 return isOnlyType(type, isStringLike);
298}
299export function hasStringLike(type) {
300 return hasType(type, isStringLike);
301}
302export function isStringLiteral(type) {
303 return isTypeFlag(type, ts.TypeFlags.StringLiteral);
304}
305export function isOnlyStringLiteral(type) {
306 return isOnlyType(type, isStringLiteral);
307}
308export function hasStringLiteral(type) {
309 return hasType(type, isStringLiteral);
310}
311export function isStringish(type) {
312 return hasTypeFlag(type, ts.TypeFlags.StringLike);
313}
314export function isOnlyStringish(type) {
315 return isOnlyType(type, isStringish);
316}
317export function hasStringish(type) {
318 return hasType(type, isStringish);
319}
320export function isBoolean(type) {
321 return isTypeFlag(type, ts.TypeFlags.Boolean);
322}
323export function isOnlyBoolean(type) {
324 return isOnlyType(type, isBoolean);
325}
326export function hasBoolean(type) {
327 return hasType(type, isBoolean);
328}
329export function isBooleanLike(type) {
330 return isTypeFlag(type, ts.TypeFlags.BooleanLike);
331}
332export function isOnlyBooleanLike(type) {
333 return isOnlyType(type, isBooleanLike);
334}
335export function hasBooleanLike(type) {
336 return hasType(type, isBooleanLike);
337}
338export function isBooleanLiteral(type) {
339 return isTypeFlag(type, ts.TypeFlags.BooleanLiteral);
340}
341export function isOnlyBooleanLiteral(type) {
342 return isOnlyType(type, isBooleanLiteral);
343}
344export function hasBooleanLiteral(type) {
345 return hasType(type, isBooleanLiteral);
346}
347export function isBooleanFalse(type) {
348 return isTypeFlag(type, ts.TypeFlags.BooleanLiteral) && getIntrinsicName(type) === 'false';
349}
350export function isOnlyBooleanFalse(type) {
351 return isOnlyType(type, isBooleanFalse);
352}
353export function hasBooleanFalse(type) {
354 return hasType(type, isBooleanFalse);
355}
356export function isBooleanish(type) {
357 return hasTypeFlag(type, ts.TypeFlags.BooleanLike);
358}
359export function isOnlyBooleanish(type) {
360 return isOnlyType(type, isBooleanish);
361}
362export function hasBooleanish(type) {
363 return hasType(type, isBooleanish);
364}
365export function isSymbol(type) {
366 return isTypeFlag(type, ts.TypeFlags.ESSymbol);
367}
368export function isOnlySymbol(type) {
369 return isOnlyType(type, isSymbol);
370}
371export function hasSymbol(type) {
372 return hasType(type, isSymbol);
373}
374export function isSymbolLike(type) {
375 return isTypeFlag(type, ts.TypeFlags.ESSymbolLike);
376}
377export function isOnlySymbolLike(type) {
378 return isOnlyType(type, isSymbolLike);
379}
380export function hasSymbolLike(type) {
381 return hasType(type, isSymbolLike);
382}
383export function isSymbolish(type) {
384 return hasTypeFlag(type, ts.TypeFlags.ESSymbolLike);
385}
386export function isOnlySymbolish(type) {
387 return isOnlyType(type, isSymbolish);
388}
389export function hasSymbolish(type) {
390 return hasType(type, isSymbolish);
391}
392export function isPrimitive(type) {
393 return isUndefined(type) || isNull(type) || isNumber(type) || isBoolean(type) || isString(type) || isSymbol(type);
394}
395export function isOnlyPrimitive(type) {
396 return isOnlyType(type, isPrimitive);
397}
398export function hasPrimitive(type) {
399 return hasType(type, isPrimitive);
400}
401export function isPrimitiveLike(type) {
402 return (isUndefined(type) ||
403 isNull(type) ||
404 isNumberLike(type) ||
405 isBooleanLike(type) ||
406 isStringLike(type) ||
407 isSymbolLike(type));
408}
409export function isOnlyPrimitiveLike(type) {
410 return isOnlyType(type, isPrimitiveLike);
411}
412export function hasPrimitiveLike(type) {
413 return hasType(type, isPrimitiveLike);
414}
415export function isPrimitiveish(type) {
416 return (isUndefined(type) ||
417 isNull(type) ||
418 isNumberish(type) ||
419 isBooleanish(type) ||
420 isStringish(type) ||
421 isSymbolish(type) ||
422 isVoidish(type));
423}
424export function isOnlyPrimitiveish(type) {
425 return isOnlyType(type, isPrimitiveish);
426}
427export function hasPrimitiveish(type) {
428 return hasType(type, isPrimitive);
429}
430export function isOnlyObject(type) {
431 return isOnlyType(type, (value) => !isPrimitiveish(value));
432}
433export function isArray(type) {
434 const typeSymbol = getSymbol(type);
435 const typeArguments = getTypeArguments(type);
436 if (typeSymbol === undefined || typeArguments === undefined) {
437 return false;
438 }
439 return ((symbol_.getName(typeSymbol) === 'Array' || symbol_.getName(typeSymbol) === 'ReadonlyArray') &&
440 typeArguments.length === 1);
441}
442export function isOnlyArray(type) {
443 return isOnlyType(type, isArray);
444}
445export function hasArray(type) {
446 return hasType(type, isArray);
447}
448export function isArrayish(type) {
449 return isArray(type) || isTuple(type);
450}
451export function isOnlyArrayish(type) {
452 return isOnlyType(type, isArrayish);
453}
454export function hasArrayish(type) {
455 return hasType(type, isArrayish);
456}
457export function getArrayType(type) {
458 if (!isArray(type)) {
459 return undefined;
460 }
461 const typeArguments = getTypeArgumentsOrThrow(type);
462 return typeArguments[0];
463}
464export function getArrayTypeOrThrow(type) {
465 return utils.throwIfNullOrUndefined(getArrayType(type), 'array type');
466}
467export function getArrayTypes(type) {
468 return getTypes(type, isArray);
469}
470export function isVoid(type) {
471 return isTypeFlag(type, ts.TypeFlags.Void);
472}
473export function isOnlyVoid(type) {
474 return isOnlyType(type, isVoid);
475}
476export function hasVoid(type) {
477 return hasType(type, isVoid);
478}
479export function isVoidish(type) {
480 return isVoid(type) || isUndefined(type);
481}
482export function isOnlyVoidish(type) {
483 return isOnlyType(type, isVoidish);
484}
485export function hasVoidish(type) {
486 return hasType(type, isVoidish);
487}
488export function getCallSignatures(type) {
489 return type.getCallSignatures();
490}
491export function getNonNullableType(type) {
492 return type.getNonNullableType();
493}
494export function filterUnion(checker, type, filter) {
495 const types = getUnionTypes(type);
496 if (types === undefined) {
497 return type;
498 }
499 return checker.getUnionType(types.filter(filter));
500}
501
502//# sourceMappingURL=data:application/json;charset=utf8;base64,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O0FBQ0QsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFhO0lBQ3JDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3pDLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFhO0lBQ3RDLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQWE7SUFDN0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWE7SUFDOUMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUF1QixFQUFFLElBQWEsRUFBRSxNQUFrQztJQUNwRyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFHRCxPQUFRLE9BQWUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUMiLCJmaWxlIjoibmVvLW9uZS10cy11dGlscy9zcmMvdHlwZV8uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZSBuby1iaXR3aXNlXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgKiBhcyBndWFyZHMgZnJvbSAnLi9ndWFyZHMnO1xuaW1wb3J0ICogYXMgc3ltYm9sXyBmcm9tICcuL3N5bWJvbCc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxudHlwZSBUeXBlZE5vZGUgPSB0cy5Ob2RlICYgeyByZWFkb25seSB0eXBlPzogdHMuVHlwZU5vZGUgfTtcbnR5cGUgTWF5YmVUeXBlZE5vZGUgPSB0cy5Ob2RlICYgeyByZWFkb25seSB0eXBlPzogdHMuVHlwZU5vZGUgfTtcblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZSh0eXBlOiB0cy5UeXBlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gKHR5cGUgYXMgYW55KS5pbnRyaW5zaWNOYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZU5vZGUobm9kZTogVHlwZWROb2RlKTogdHMuVHlwZU5vZGU7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZU5vZGUobm9kZTogTWF5YmVUeXBlZE5vZGUpOiB0cy5UeXBlTm9kZSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlTm9kZShub2RlOiBUeXBlZE5vZGUgfCBNYXliZVR5cGVkTm9kZSk6IHRzLlR5cGVOb2RlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHV0aWxzLmdldFZhbHVlT3JVbmRlZmluZWQobm9kZS50eXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVOb2RlT3JUaHJvdyhub2RlOiBNYXliZVR5cGVkTm9kZSk6IHRzLlR5cGVOb2RlIHtcbiAgcmV0dXJuIHV0aWxzLnRocm93SWZOdWxsT3JVbmRlZmluZWQoZ2V0VHlwZU5vZGUobm9kZSksICd0eXBlIG5vZGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRleHR1YWxUeXBlKHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlciwgbm9kZTogdHMuRXhwcmVzc2lvbik6IHRzLlR5cGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCh0eXBlQ2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlRnJvbVR5cGVOb2RlKHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlciwgdHlwZU5vZGU6IHRzLlR5cGVOb2RlKTogdHMuVHlwZSB7XG4gIHJldHVybiB0eXBlQ2hlY2tlci5nZXRUeXBlRnJvbVR5cGVOb2RlKHR5cGVOb2RlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGUodHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLCBub2RlOiB0cy5Ob2RlKTogdHMuVHlwZSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgY29uc3QgdHlwZU5vZGUgPSB0cy5pc0Z1bmN0aW9uTGlrZShub2RlKSA/IHVuZGVmaW5lZCA6IChnZXRUeXBlTm9kZShub2RlIGFzIGFueSkgYXMgdHMuVHlwZU5vZGUgfCB1bmRlZmluZWQpO1xuICBpZiAodHlwZU5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0eXBlQ2hlY2tlci5nZXRUeXBlRnJvbVR5cGVOb2RlKHR5cGVOb2RlKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSB0eXBlQ2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihub2RlKTtcblxuICBpZiAoaXNBbnkodHlwZSkgJiYgZ3VhcmRzLmlzRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gZ2V0Q29udGV4dHVhbFR5cGUodHlwZUNoZWNrZXIsIG5vZGUpO1xuICAgIGlmIChjb250ZXh0dWFsVHlwZSAhPT0gdW5kZWZpbmVkICYmICFpc0FueShjb250ZXh0dWFsVHlwZSkpIHtcbiAgICAgIHJldHVybiBjb250ZXh0dWFsVHlwZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnN0cmFpbnQodHlwZTogdHMuVHlwZSk6IHRzLlR5cGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCh0eXBlLmdldENvbnN0cmFpbnQoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQXRMb2NhdGlvbih0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsIHN5bWJvbDogdHMuU3ltYm9sLCBub2RlOiB0cy5Ob2RlKTogdHMuVHlwZSB7XG4gIHJldHVybiB0eXBlQ2hlY2tlci5nZXRUeXBlT2ZTeW1ib2xBdExvY2F0aW9uKHN5bWJvbCwgbm9kZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlVG9UeXBlTm9kZShcbiAgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICB0eXBlOiB0cy5UeXBlLFxuICBub2RlPzogdHMuRGVjbGFyYXRpb24sXG4pOiB0cy5UeXBlTm9kZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlQ2hlY2tlci50eXBlVG9UeXBlTm9kZSh0eXBlLCBub2RlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVUb1R5cGVOb2RlT3JUaHJvdyh0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsIHR5cGU6IHRzLlR5cGUsIG5vZGU/OiB0cy5EZWNsYXJhdGlvbik6IHRzLlR5cGVOb2RlIHtcbiAgcmV0dXJuIHV0aWxzLnRocm93SWZOdWxsT3JVbmRlZmluZWQodHlwZVRvVHlwZU5vZGUodHlwZUNoZWNrZXIsIHR5cGUsIG5vZGUpLCAndHlwZSBub2RlJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTeW1ib2wodHlwZTogdHMuVHlwZSk6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB1dGlscy5nZXRWYWx1ZU9yVW5kZWZpbmVkKHR5cGUuZ2V0U3ltYm9sKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxpYXNTeW1ib2wodHlwZTogdHMuVHlwZSk6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB1dGlscy5nZXRWYWx1ZU9yVW5kZWZpbmVkKHR5cGUuYWxpYXNTeW1ib2wpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxpYXNUeXBlQXJndW1lbnRzKHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCh0eXBlLmFsaWFzVHlwZUFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGlhc1R5cGVBcmd1bWVudHNBcnJheSh0eXBlOiB0cy5UeXBlKTogcmVhZG9ubHkgdHMuVHlwZVtdIHtcbiAgcmV0dXJuIHV0aWxzLmdldEFycmF5KGdldEFsaWFzVHlwZUFyZ3VtZW50cyh0eXBlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTeW1ib2xPclRocm93KHR5cGU6IHRzLlR5cGUpOiB0cy5TeW1ib2wge1xuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXRTeW1ib2wodHlwZSksICdzeW1ib2wnKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFR5cGVGb3JtYXRGbGFncyhub2RlPzogdHMuTm9kZSk6IHRzLlR5cGVGb3JtYXRGbGFncyB7XG4gIGxldCBmb3JtYXRGbGFncyA9XG4gICAgdHMuVHlwZUZvcm1hdEZsYWdzLlVzZVR5cGVPZkZ1bmN0aW9uIHxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuTm9UcnVuY2F0aW9uIHxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuVXNlRnVsbHlRdWFsaWZpZWRUeXBlIHxcbiAgICB0cy5UeXBlRm9ybWF0RmxhZ3MuV3JpdGVUeXBlQXJndW1lbnRzT2ZTaWduYXR1cmU7XG5cbiAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCAmJiBub2RlLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVHlwZUFsaWFzRGVjbGFyYXRpb24pIHtcbiAgICBmb3JtYXRGbGFncyB8PSB0cy5UeXBlRm9ybWF0RmxhZ3MuSW5UeXBlQWxpYXM7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0RmxhZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5TeW1ib2xbXSB7XG4gIHJldHVybiB0eXBlLmdldFByb3BlcnRpZXMoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnN0cnVjdFNpZ25hdHVyZXModHlwZTogdHMuVHlwZSk6IHJlYWRvbmx5IHRzLlNpZ25hdHVyZVtdIHtcbiAgcmV0dXJuIHR5cGUuZ2V0Q29uc3RydWN0U2lnbmF0dXJlcygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHkodHlwZTogdHMuVHlwZSwgbmFtZTogc3RyaW5nKTogdHMuU3ltYm9sIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHV0aWxzLmdldFZhbHVlT3JVbmRlZmluZWQodHlwZS5nZXRQcm9wZXJ0eShuYW1lKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0KFxuICB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIHR5cGU6IHRzLlR5cGUsXG4gIG5vZGU/OiB0cy5Ob2RlLFxuICBmbGFnczogdHMuVHlwZUZvcm1hdEZsYWdzID0gZ2V0RGVmYXVsdFR5cGVGb3JtYXRGbGFncyhub2RlKSxcbik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcodHlwZSwgbm9kZSwgZmxhZ3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZVR5cGVzKHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCh0eXBlLmdldEJhc2VUeXBlcygpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VUeXBlc0FycmF5KHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10ge1xuICByZXR1cm4gdXRpbHMuZ2V0QXJyYXkoZ2V0QmFzZVR5cGVzKHR5cGUpKTtcbn1cblxuZnVuY3Rpb24gaXNUeXBlRmxhZyh0eXBlOiB0cy5UeXBlLCBmbGFnOiB0cy5UeXBlRmxhZ3MpOiBib29sZWFuIHtcbiAgcmV0dXJuICh0eXBlLmZsYWdzICYgZmxhZykgPT09IGZsYWc7XG59XG5mdW5jdGlvbiBpc09iamVjdEZsYWcodHlwZTogdHMuVHlwZSwgZmxhZzogdHMuT2JqZWN0RmxhZ3MpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT2JqZWN0VHlwZSh0eXBlKSAmJiAodHlwZS5vYmplY3RGbGFncyAmIGZsYWcpID09PSBmbGFnO1xufVxuZnVuY3Rpb24gaGFzVHlwZUZsYWcodHlwZTogdHMuVHlwZSwgZmxhZzogdHMuVHlwZUZsYWdzKTogYm9vbGVhbiB7XG4gIHJldHVybiAodHlwZS5mbGFncyAmIGZsYWcpICE9PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsVHlwZXModHlwZTogdHMuVHlwZSk6IHJlYWRvbmx5IHRzLlR5cGVbXSB7XG4gIGNvbnN0IHVuaW9uVHlwZXMgPSBnZXRVbmlvblR5cGVzKHR5cGUpO1xuICBpZiAodW5pb25UeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuaW9uVHlwZXMucmVkdWNlPHJlYWRvbmx5IHRzLlR5cGVbXT4oKGFjYywgdW5pb25UeXBlKSA9PiBhY2MuY29uY2F0KGdldEFsbFR5cGVzKHVuaW9uVHlwZSkpLCBbXSk7XG4gIH1cblxuICBjb25zdCBpbnRlcnNlY3Rpb25UeXBlcyA9IGdldEludGVyc2VjdGlvblR5cGVzKHR5cGUpO1xuICBpZiAoaW50ZXJzZWN0aW9uVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBpbnRlcnNlY3Rpb25UeXBlcy5yZWR1Y2U8cmVhZG9ubHkgdHMuVHlwZVtdPigoYWNjLCB1bmlvblR5cGUpID0+IGFjYy5jb25jYXQoZ2V0QWxsVHlwZXModW5pb25UeXBlKSksIFtdKTtcbiAgfVxuXG4gIHJldHVybiBbdHlwZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlcyh0eXBlOiB0cy5UeXBlLCBpc1R5cGU6ICh0eXBlOiB0cy5UeXBlKSA9PiBib29sZWFuKTogcmVhZG9ubHkgdHMuVHlwZVtdIHtcbiAgaWYgKGlzVHlwZSh0eXBlKSkge1xuICAgIHJldHVybiBbdHlwZV07XG4gIH1cblxuICBjb25zdCB1bmlvblR5cGVzID0gZ2V0VW5pb25UeXBlcyh0eXBlKTtcbiAgaWYgKHVuaW9uVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmlvblR5cGVzLnJlZHVjZTxyZWFkb25seSB0cy5UeXBlW10+KChhY2MsIHVuaW9uVHlwZSkgPT4gYWNjLmNvbmNhdChnZXRUeXBlcyh1bmlvblR5cGUsIGlzVHlwZSkpLCBbXSk7XG4gIH1cblxuICBjb25zdCBpbnRlcnNlY3Rpb25UeXBlcyA9IGdldEludGVyc2VjdGlvblR5cGVzKHR5cGUpO1xuICBpZiAoaW50ZXJzZWN0aW9uVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBpbnRlcnNlY3Rpb25UeXBlcy5yZWR1Y2U8cmVhZG9ubHkgdHMuVHlwZVtdPihcbiAgICAgIChhY2MsIHVuaW9uVHlwZSkgPT4gYWNjLmNvbmNhdChnZXRUeXBlcyh1bmlvblR5cGUsIGlzVHlwZSkpLFxuICAgICAgW10sXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3ltYm9saWModHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIShpc1ByaW1pdGl2ZWlzaCh0eXBlKSB8fCBpc0ludGVyc2VjdGlvbih0eXBlKSB8fCBpc1VuaW9uKHR5cGUpIHx8IGlzVHVwbGUodHlwZSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0VHlwZSh0eXBlOiB0cy5UeXBlKTogdHlwZSBpcyB0cy5PYmplY3RUeXBlIHtcbiAgcmV0dXJuIGlzVHlwZUZsYWcodHlwZSwgdHMuVHlwZUZsYWdzLk9iamVjdCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlUmVmZXJlbmNlKHR5cGU6IHRzLlR5cGUpOiB0eXBlIGlzIHRzLlR5cGVSZWZlcmVuY2Uge1xuICByZXR1cm4gaXNPYmplY3RGbGFnKHR5cGUsIHRzLk9iamVjdEZsYWdzLlJlZmVyZW5jZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R1cGxlVHlwZSh0eXBlOiB0cy5UeXBlKTogdHlwZSBpcyB0cy5UdXBsZVR5cGUge1xuICByZXR1cm4gaXNPYmplY3RGbGFnKHR5cGUsIHRzLk9iamVjdEZsYWdzLlR1cGxlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1R1cGxlKHR5cGU6IHRzLlR5cGUpOiB0eXBlIGlzIHRzLlR1cGxlVHlwZVJlZmVyZW5jZSB7XG4gIHJldHVybiBpc1R5cGVSZWZlcmVuY2UodHlwZSkgJiYgaXNUdXBsZVR5cGUodHlwZS50YXJnZXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1R1cGxlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNUdXBsZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHVwbGVUeXBlcyh0eXBlOiB0cy5UeXBlKTogcmVhZG9ubHkgdHMuVHlwZVtdIHtcbiAgcmV0dXJuIGdldFR5cGVzKHR5cGUsIGlzVHVwbGUpO1xufVxuLy8gSWYgdW5kZWZpbmVkID0+IG5vdCBhIHR1cGxlIHR5cGVcbmV4cG9ydCBmdW5jdGlvbiBnZXRUdXBsZUVsZW1lbnRzKHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNUdXBsZSh0eXBlKSA/IHV0aWxzLmdldEFycmF5KHR5cGUudHlwZUFyZ3VtZW50cykgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQXJndW1lbnRzKHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNUeXBlUmVmZXJlbmNlKHR5cGUpID8gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCh0eXBlLnR5cGVBcmd1bWVudHMpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUFyZ3VtZW50c0FycmF5KHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10ge1xuICByZXR1cm4gdXRpbHMuZ2V0QXJyYXkoZ2V0VHlwZUFyZ3VtZW50cyh0eXBlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQXJndW1lbnRzT3JUaHJvdyh0eXBlOiB0cy5UeXBlKTogcmVhZG9ubHkgdHMuVHlwZVtdIHtcbiAgcmV0dXJuIHV0aWxzLnRocm93SWZOdWxsT3JVbmRlZmluZWQoZ2V0VHlwZUFyZ3VtZW50cyh0eXBlKSwgJ3R5cGUgYXJndW1lbnRzJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FueSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuQW55KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JUeXBlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzQW55KHR5cGUpICYmIGdldEludHJpbnNpY05hbWUodHlwZSkgPT09ICdlcnJvcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaW9uKHR5cGU6IHRzLlR5cGUpOiB0eXBlIGlzIHRzLlVuaW9uVHlwZSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgcmV0dXJuICh0eXBlIGFzIGFueSkuaXNVbmlvbiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0eXBlLmlzVW5pb24oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaW9uVHlwZXModHlwZTogdHMuVHlwZSk6IHJlYWRvbmx5IHRzLlR5cGVbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc1VuaW9uKHR5cGUpID8gdXRpbHMuZ2V0QXJyYXkodHlwZS50eXBlcykgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pb25UeXBlc0FycmF5KHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10ge1xuICByZXR1cm4gdXRpbHMuZ2V0QXJyYXkoZ2V0VW5pb25UeXBlcyh0eXBlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyc2VjdGlvbih0eXBlOiB0cy5UeXBlKTogdHlwZSBpcyB0cy5JbnRlcnNlY3Rpb25UeXBlIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gKHR5cGUgYXMgYW55KS5pc0ludGVyc2VjdGlvbiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0eXBlLmlzSW50ZXJzZWN0aW9uKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25UeXBlcyh0eXBlOiB0cy5UeXBlKTogcmVhZG9ubHkgdHMuVHlwZVtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzSW50ZXJzZWN0aW9uKHR5cGUpID8gdXRpbHMuZ2V0QXJyYXkodHlwZS50eXBlcykgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25UeXBlc0FycmF5KHR5cGU6IHRzLlR5cGUpOiByZWFkb25seSB0cy5UeXBlW10ge1xuICByZXR1cm4gdXRpbHMuZ2V0QXJyYXkoZ2V0SW50ZXJzZWN0aW9uVHlwZXModHlwZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzVW5pb25UeXBlKHR5cGU6IHRzLlR5cGUsIGlzVHlwZTogKHR5cGU6IHRzLlR5cGUpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3QgdW5pb25UeXBlcyA9IGdldFVuaW9uVHlwZXModHlwZSk7XG5cbiAgcmV0dXJuIHVuaW9uVHlwZXMgIT09IHVuZGVmaW5lZCAmJiB1bmlvblR5cGVzLnNvbWUoaXNUeXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludGVyc2VjdGlvblR5cGUodHlwZTogdHMuVHlwZSwgaXNUeXBlOiAodHlwZTogdHMuVHlwZSkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCB0eXBlcyA9IGdldEludGVyc2VjdGlvblR5cGVzKHR5cGUpO1xuXG4gIHJldHVybiB0eXBlcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVzLnNvbWUoaXNUeXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1R5cGUodHlwZTogdHMuVHlwZSwgaXNUeXBlOiAodHlwZTogdHMuVHlwZSkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUeXBlKHR5cGUpIHx8IGhhc1VuaW9uVHlwZSh0eXBlLCBpc1R5cGUpIHx8IGhhc0ludGVyc2VjdGlvblR5cGUodHlwZSwgaXNUeXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seVR5cGUodHlwZTogdHMuVHlwZSwgaXNUeXBlOiAodHlwZTogdHMuVHlwZSkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZiAoaXNUeXBlKHR5cGUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB1bmlvblR5cGVzID0gZ2V0VW5pb25UeXBlcyh0eXBlKTtcbiAgaWYgKHVuaW9uVHlwZXMgIT09IHVuZGVmaW5lZCAmJiB1bmlvblR5cGVzLmV2ZXJ5KCh0cGUpID0+IGlzT25seVR5cGUodHBlLCBpc1R5cGUpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgaW50ZXJzZWN0aW9uVHlwZXMgPSBnZXRJbnRlcnNlY3Rpb25UeXBlcyh0eXBlKTtcbiAgaWYgKGludGVyc2VjdGlvblR5cGVzICE9PSB1bmRlZmluZWQgJiYgaW50ZXJzZWN0aW9uVHlwZXMuZXZlcnkoKHRwZSkgPT4gaXNPbmx5VHlwZSh0cGUsIGlzVHlwZSkpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWUoYTogdHMuVHlwZSB8IHVuZGVmaW5lZCwgYjogdHMuVHlwZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGEgIT09IHVuZGVmaW5lZCAmJlxuICAgIGIgIT09IHVuZGVmaW5lZCAmJlxuICAgIChhID09PSBiIHx8XG4gICAgICAoaXNPbmx5Qm9vbGVhbmlzaChhKSAmJiBpc09ubHlCb29sZWFuaXNoKGIpKSB8fFxuICAgICAgKGlzT25seVN0cmluZ2lzaChhKSAmJiBpc09ubHlTdHJpbmdpc2goYikpIHx8XG4gICAgICAoaXNPbmx5TnVtYmVyaXNoKGEpICYmIGlzT25seU51bWJlcmlzaChiKSkgfHxcbiAgICAgIChpc09ubHlTeW1ib2xpc2goYSkgJiYgaXNPbmx5U3ltYm9saXNoKGIpKSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBbLi4ubmV3IFNldChnZXRBbGxUeXBlcyh0eXBlKSldLmxlbmd0aCA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1R5cGVGbGFnKHR5cGUsIHRzLlR5cGVGbGFncy5OdWxsKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlOdWxsKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNOdWxsKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNOdWxsKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNOdWxsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHlwZUZsYWcodHlwZSwgdHMuVHlwZUZsYWdzLlVuZGVmaW5lZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5VW5kZWZpbmVkKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNVbmRlZmluZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1VuZGVmaW5lZCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzVW5kZWZpbmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZGlzaCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1VuZGVmaW5lZCh0eXBlKSB8fCBpc1ZvaWQodHlwZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5VW5kZWZpbmVkaXNoKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNVbmRlZmluZWRpc2gpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1VuZGVmaW5lZGlzaCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzVW5kZWZpbmVkaXNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbGFibGUodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICBjb25zdCB0eXBlcyA9IGdldFVuaW9uVHlwZXModHlwZSk7XG5cbiAgcmV0dXJuIChcbiAgICBpc051bGwodHlwZSkgfHwgaXNVbmRlZmluZWQodHlwZSkgfHwgKHR5cGVzICE9PSB1bmRlZmluZWQgJiYgdHlwZXMuc29tZSgodHBlKSA9PiBpc051bGwodHBlKSB8fCBpc1VuZGVmaW5lZCh0cGUpKSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHlwZUZsYWcodHlwZSwgdHMuVHlwZUZsYWdzLk51bWJlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5TnVtYmVyKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNOdW1iZXIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc051bWJlcih0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzTnVtYmVyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckxpa2UodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuTnVtYmVyTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5TnVtYmVyTGlrZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzTnVtYmVyTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzTnVtYmVyTGlrZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzTnVtYmVyTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJMaXRlcmFsKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHlwZUZsYWcodHlwZSwgdHMuVHlwZUZsYWdzLk51bWJlckxpdGVyYWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seU51bWJlckxpdGVyYWwodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc051bWJlckxpdGVyYWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc051bWJlckxpdGVyYWwodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc051bWJlckxpdGVyYWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyaXNoKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGVGbGFnKHR5cGUsIHRzLlR5cGVGbGFncy5OdW1iZXJMaWtlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlOdW1iZXJpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc051bWJlcmlzaCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzTnVtYmVyaXNoKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNOdW1iZXJpc2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuU3RyaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlTdHJpbmcodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc1N0cmluZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzU3RyaW5nKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNTdHJpbmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nTGlrZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1R5cGVGbGFnKHR5cGUsIHRzLlR5cGVGbGFncy5TdHJpbmdMaWtlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlTdHJpbmdMaWtlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNTdHJpbmdMaWtlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNTdHJpbmdMaWtlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNTdHJpbmdMaWtlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ0xpdGVyYWwodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuU3RyaW5nTGl0ZXJhbCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5U3RyaW5nTGl0ZXJhbCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzU3RyaW5nTGl0ZXJhbCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzU3RyaW5nTGl0ZXJhbCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzU3RyaW5nTGl0ZXJhbCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZUZsYWcodHlwZSwgdHMuVHlwZUZsYWdzLlN0cmluZ0xpa2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seVN0cmluZ2lzaCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzU3RyaW5naXNoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNTdHJpbmdpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc1N0cmluZ2lzaCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuQm9vbGVhbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5Qm9vbGVhbih0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzQm9vbGVhbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQm9vbGVhbih0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzQm9vbGVhbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuTGlrZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1R5cGVGbGFnKHR5cGUsIHRzLlR5cGVGbGFncy5Cb29sZWFuTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5Qm9vbGVhbkxpa2UodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc0Jvb2xlYW5MaWtlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNCb29sZWFuTGlrZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzQm9vbGVhbkxpa2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbkxpdGVyYWwodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuQm9vbGVhbkxpdGVyYWwpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUJvb2xlYW5MaXRlcmFsKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNCb29sZWFuTGl0ZXJhbCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQm9vbGVhbkxpdGVyYWwodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc0Jvb2xlYW5MaXRlcmFsKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW5GYWxzZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1R5cGVGbGFnKHR5cGUsIHRzLlR5cGVGbGFncy5Cb29sZWFuTGl0ZXJhbCkgJiYgZ2V0SW50cmluc2ljTmFtZSh0eXBlKSA9PT0gJ2ZhbHNlJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlCb29sZWFuRmFsc2UodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc0Jvb2xlYW5GYWxzZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQm9vbGVhbkZhbHNlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNCb29sZWFuRmFsc2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbmlzaCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuQm9vbGVhbkxpa2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUJvb2xlYW5pc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc0Jvb2xlYW5pc2gpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Jvb2xlYW5pc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc0Jvb2xlYW5pc2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTeW1ib2wodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNUeXBlRmxhZyh0eXBlLCB0cy5UeXBlRmxhZ3MuRVNTeW1ib2wpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seVN5bWJvbCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzU3ltYm9sKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNTeW1ib2wodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc1N5bWJvbCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTeW1ib2xMaWtlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHlwZUZsYWcodHlwZSwgdHMuVHlwZUZsYWdzLkVTU3ltYm9sTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5U3ltYm9sTGlrZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzU3ltYm9sTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzU3ltYm9sTGlrZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzU3ltYm9sTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTeW1ib2xpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZUZsYWcodHlwZSwgdHMuVHlwZUZsYWdzLkVTU3ltYm9sTGlrZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5U3ltYm9saXNoKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNTeW1ib2xpc2gpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1N5bWJvbGlzaCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzU3ltYm9saXNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVW5kZWZpbmVkKHR5cGUpIHx8IGlzTnVsbCh0eXBlKSB8fCBpc051bWJlcih0eXBlKSB8fCBpc0Jvb2xlYW4odHlwZSkgfHwgaXNTdHJpbmcodHlwZSkgfHwgaXNTeW1ib2wodHlwZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPbmx5UHJpbWl0aXZlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNQcmltaXRpdmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ByaW1pdGl2ZSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNUeXBlKHR5cGUsIGlzUHJpbWl0aXZlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZUxpa2UodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzVW5kZWZpbmVkKHR5cGUpIHx8XG4gICAgaXNOdWxsKHR5cGUpIHx8XG4gICAgaXNOdW1iZXJMaWtlKHR5cGUpIHx8XG4gICAgaXNCb29sZWFuTGlrZSh0eXBlKSB8fFxuICAgIGlzU3RyaW5nTGlrZSh0eXBlKSB8fFxuICAgIGlzU3ltYm9sTGlrZSh0eXBlKVxuICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seVByaW1pdGl2ZUxpa2UodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc1ByaW1pdGl2ZUxpa2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ByaW1pdGl2ZUxpa2UodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc1ByaW1pdGl2ZUxpa2UpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlaXNoKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc1VuZGVmaW5lZCh0eXBlKSB8fFxuICAgIGlzTnVsbCh0eXBlKSB8fFxuICAgIGlzTnVtYmVyaXNoKHR5cGUpIHx8XG4gICAgaXNCb29sZWFuaXNoKHR5cGUpIHx8XG4gICAgaXNTdHJpbmdpc2godHlwZSkgfHxcbiAgICBpc1N5bWJvbGlzaCh0eXBlKSB8fFxuICAgIGlzVm9pZGlzaCh0eXBlKVxuICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seVByaW1pdGl2ZWlzaCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzUHJpbWl0aXZlaXNoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcmltaXRpdmVpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc1ByaW1pdGl2ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlPYmplY3QodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCAodmFsdWUpID0+ICFpc1ByaW1pdGl2ZWlzaCh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHR5cGVTeW1ib2wgPSBnZXRTeW1ib2wodHlwZSk7XG4gIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBnZXRUeXBlQXJndW1lbnRzKHR5cGUpO1xuICBpZiAodHlwZVN5bWJvbCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVBcmd1bWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKHN5bWJvbF8uZ2V0TmFtZSh0eXBlU3ltYm9sKSA9PT0gJ0FycmF5JyB8fCBzeW1ib2xfLmdldE5hbWUodHlwZVN5bWJvbCkgPT09ICdSZWFkb25seUFycmF5JykgJiZcbiAgICB0eXBlQXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUFycmF5KHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNBcnJheSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQXJyYXkodHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc0FycmF5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5aXNoKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzQXJyYXkodHlwZSkgfHwgaXNUdXBsZSh0eXBlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlBcnJheWlzaCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc09ubHlUeXBlKHR5cGUsIGlzQXJyYXlpc2gpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc0FycmF5aXNoKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNBcnJheWlzaCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcnJheVR5cGUodHlwZTogdHMuVHlwZSk6IHRzLlR5cGUgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdHlwZUFyZ3VtZW50cyA9IGdldFR5cGVBcmd1bWVudHNPclRocm93KHR5cGUpO1xuXG4gIHJldHVybiB0eXBlQXJndW1lbnRzWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlUeXBlT3JUaHJvdyh0eXBlOiB0cy5UeXBlKTogdHMuVHlwZSB7XG4gIHJldHVybiB1dGlscy50aHJvd0lmTnVsbE9yVW5kZWZpbmVkKGdldEFycmF5VHlwZSh0eXBlKSwgJ2FycmF5IHR5cGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFycmF5VHlwZXModHlwZTogdHMuVHlwZSk6IHJlYWRvbmx5IHRzLlR5cGVbXSB7XG4gIHJldHVybiBnZXRUeXBlcyh0eXBlLCBpc0FycmF5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVm9pZCh0eXBlOiB0cy5UeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1R5cGVGbGFnKHR5cGUsIHRzLlR5cGVGbGFncy5Wb2lkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09ubHlWb2lkKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzT25seVR5cGUodHlwZSwgaXNWb2lkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNWb2lkKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc1R5cGUodHlwZSwgaXNWb2lkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1ZvaWRpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWb2lkKHR5cGUpIHx8IGlzVW5kZWZpbmVkKHR5cGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seVZvaWRpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPbmx5VHlwZSh0eXBlLCBpc1ZvaWRpc2gpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZvaWRpc2godHlwZTogdHMuVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzVHlwZSh0eXBlLCBpc1ZvaWRpc2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FsbFNpZ25hdHVyZXModHlwZTogdHMuVHlwZSk6IHJlYWRvbmx5IHRzLlNpZ25hdHVyZVtdIHtcbiAgcmV0dXJuIHR5cGUuZ2V0Q2FsbFNpZ25hdHVyZXMoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5vbk51bGxhYmxlVHlwZSh0eXBlOiB0cy5UeXBlKTogdHMuVHlwZSB7XG4gIHJldHVybiB0eXBlLmdldE5vbk51bGxhYmxlVHlwZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVW5pb24oY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsIHR5cGU6IHRzLlR5cGUsIGZpbHRlcjogKHR5cGU6IHRzLlR5cGUpID0+IGJvb2xlYW4pOiB0cy5UeXBlIHtcbiAgY29uc3QgdHlwZXMgPSBnZXRVbmlvblR5cGVzKHR5cGUpO1xuICBpZiAodHlwZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gKGNoZWNrZXIgYXMgYW55KS5nZXRVbmlvblR5cGUodHlwZXMuZmlsdGVyKGZpbHRlcikpO1xufVxuIl19