1 | import ts from 'typescript';
|
2 | import * as utils from './utils';
|
3 | export function getNameNode(node) {
|
4 | return utils.getValueOrUndefined(node.name);
|
5 | }
|
6 | export function getNameNodeOrThrow(node) {
|
7 | return utils.throwIfNullOrUndefined(getNameNode(node), 'name');
|
8 | }
|
9 | export function getName(node) {
|
10 | const name = getNameNode(node);
|
11 | if (name === undefined || ts.isObjectBindingPattern(name) || ts.isArrayBindingPattern(name)) {
|
12 | return undefined;
|
13 | }
|
14 | return name.getText();
|
15 | }
|
16 | export function getNameOrThrow(node) {
|
17 | return utils.throwIfNullOrUndefined(getName(node), 'name');
|
18 | }
|
19 | export function getPropertyNameNode(node) {
|
20 | return utils.getValueOrUndefined(node.propertyName);
|
21 | }
|
22 | export function getDotDotDotToken(node) {
|
23 | return utils.getValueOrUndefined(node.dotDotDotToken);
|
24 | }
|
25 | export function getText(node) {
|
26 | return node.getText();
|
27 | }
|
28 | export function getParentSyntaxList(node) {
|
29 | const parent = utils.getValueOrUndefined(node.parent);
|
30 | if (parent === undefined) {
|
31 | return undefined;
|
32 | }
|
33 | const { pos, end } = node;
|
34 | for (const child of parent.getChildren()) {
|
35 | if (child.pos > end || child === node) {
|
36 | return undefined;
|
37 | }
|
38 | if (child.kind === ts.SyntaxKind.SyntaxList && child.pos <= pos && child.end >= end) {
|
39 | return child;
|
40 | }
|
41 | }
|
42 | return undefined;
|
43 | }
|
44 | export function getParent(node) {
|
45 | const parent = utils.getValueOrUndefined(node.parent);
|
46 | return parent === undefined ? undefined : node.parent;
|
47 | }
|
48 | export function* getAncestors(node) {
|
49 | let parent = getParent(node);
|
50 | while (parent !== undefined) {
|
51 | yield parent;
|
52 | parent = getParent(parent);
|
53 | }
|
54 | }
|
55 | export function* getDescendants(node) {
|
56 | let children = getChildren(node);
|
57 | while (children.length > 0) {
|
58 | const mutableNextChildren = [];
|
59 | for (const child of children) {
|
60 | yield child;
|
61 | mutableNextChildren.push(...getChildren(child));
|
62 | }
|
63 | children = mutableNextChildren;
|
64 | }
|
65 | }
|
66 | export function* getDescendantsByKind(node, kind) {
|
67 | for (const descendant of getDescendants(node)) {
|
68 | if (descendant.kind === kind) {
|
69 | yield descendant;
|
70 | }
|
71 | }
|
72 | }
|
73 | function getTarget(symbol) {
|
74 | const target = symbol.target;
|
75 | return target === undefined ? symbol : target;
|
76 | }
|
77 | export function getSymbol(typeChecker, node) {
|
78 | const symbol = utils.getValueOrUndefined(node.symbol);
|
79 | if (symbol !== undefined) {
|
80 | return getTarget(symbol);
|
81 | }
|
82 | const typeCheckerSymbol = utils.getValueOrUndefined(typeChecker.getSymbolAtLocation(node));
|
83 | if (typeCheckerSymbol !== undefined) {
|
84 | return getTarget(typeCheckerSymbol);
|
85 | }
|
86 | const nameNode = getNameNode(node);
|
87 | if (nameNode !== undefined) {
|
88 | return getSymbol(typeChecker, nameNode);
|
89 | }
|
90 | return undefined;
|
91 | }
|
92 | export function getSymbolOrThrow(typeChecker, node) {
|
93 | return utils.throwIfNullOrUndefined(getSymbol(typeChecker, node), 'symbol');
|
94 | }
|
95 | function getChildren(node) {
|
96 | return node.getChildren();
|
97 | }
|
98 | export function getFirstChild(node) {
|
99 | const children = getChildren(node);
|
100 | return utils.getValueOrUndefined(children[0]);
|
101 | }
|
102 | export function getFirstChildByKind(node, kind) {
|
103 | const children = getChildren(node);
|
104 | return children.find((value) => value.kind === kind);
|
105 | }
|
106 | export function getFirstAncestorByKind(node, kind) {
|
107 | for (const ancestor of getAncestors(node)) {
|
108 | if (ancestor.kind === kind) {
|
109 | return ancestor;
|
110 | }
|
111 | }
|
112 | return undefined;
|
113 | }
|
114 | export function getFirstAncestorByKindOrThrow(node, kind) {
|
115 | return utils.throwIfNullOrUndefined(getFirstAncestorByKind(node, kind), 'ancestor');
|
116 | }
|
117 | export function getFirstAncestorByTest(node, isNode) {
|
118 | for (const ancestor of getAncestors(node)) {
|
119 | if (isNode(ancestor)) {
|
120 | return ancestor;
|
121 | }
|
122 | }
|
123 | return undefined;
|
124 | }
|
125 | export function getFirstAncestorByTestOrThrow(node, isNode) {
|
126 | return utils.throwIfNullOrUndefined(getFirstAncestorByTest(node, isNode), 'ancestor');
|
127 | }
|
128 | export function getFirstDescendantByKind(node, kind) {
|
129 | for (const ancestor of getDescendants(node)) {
|
130 | if (ancestor.kind === kind) {
|
131 | return ancestor;
|
132 | }
|
133 | }
|
134 | return undefined;
|
135 | }
|
136 | function hasNodeFlag(node, flag) {
|
137 | return (node.flags & flag) !== 0;
|
138 | }
|
139 | export function isGlobalAugmentation(node) {
|
140 | return hasNodeFlag(node, ts.NodeFlags.GlobalAugmentation);
|
141 | }
|
142 | export function getSourceFile(node) {
|
143 | return node.getSourceFile();
|
144 | }
|
145 | export function getPos(node) {
|
146 | return node.pos;
|
147 | }
|
148 | export function getEnd(node) {
|
149 | return node.end;
|
150 | }
|
151 | export function getChildAtPos(node, pos) {
|
152 | if (pos < getPos(node) || pos >= getEnd(node)) {
|
153 | return undefined;
|
154 | }
|
155 | return getChildren(node).find((child) => pos >= getPos(child) && pos < getEnd(child));
|
156 | }
|
157 | export function getDescendantAtPos(nodeIn, pos) {
|
158 | let node;
|
159 | while (true) {
|
160 | const nextNode = getChildAtPos(node === undefined ? nodeIn : node, pos);
|
161 | if (nextNode === undefined) {
|
162 | return node;
|
163 | }
|
164 | node = nextNode;
|
165 | }
|
166 | }
|
167 | export function isPartOfTypeNode(node) {
|
168 | return ts.isPartOfTypeNode(node);
|
169 | }
|
170 |
|
171 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksR0FBRyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQWE7SUFFNUMsT0FBUSxFQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLXRzLXV0aWxzL3NyYy9ub2RlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGUgbm8tYW55XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxudHlwZSBOYW1lZE5vZGUgPSB0cy5Ob2RlICYgeyByZWFkb25seSBuYW1lOiB0cy5JZGVudGlmaWVyIH07XG50eXBlIE5hbWVhYmxlTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU/OiB0cy5JZGVudGlmaWVyIH07XG5leHBvcnQgdHlwZSBQcm9wZXJ0eU5hbWVkTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU6IHRzLlByb3BlcnR5TmFtZSB9O1xudHlwZSBQcm9wZXJ0eU5hbWVhYmxlTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU/OiB0cy5Qcm9wZXJ0eU5hbWUgfTtcbnR5cGUgQmluZGluZ05hbWVkTm9kZSA9IHRzLk5vZGUgJiB7IHJlYWRvbmx5IG5hbWU6IHRzLkJpbmRpbmdOYW1lIH07XG50eXBlIEJpbmRpbmdOYW1lYWJsZU5vZGUgPSB0cy5Ob2RlICYgeyByZWFkb25seSBuYW1lPzogdHMuQmluZGluZ05hbWUgfTtcbmV4cG9ydCB0eXBlIEFueU5hbWVhYmxlTm9kZSA9IE5hbWVhYmxlTm9kZSB8IFByb3BlcnR5TmFtZWFibGVOb2RlIHwgQmluZGluZ05hbWVhYmxlTm9kZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVOb2RlKG5vZGU6IE5hbWVkTm9kZSk6IHRzLklkZW50aWZpZXI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogUHJvcGVydHlOYW1lZE5vZGUpOiB0cy5Qcm9wZXJ0eU5hbWU7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogQmluZGluZ05hbWVkTm9kZSk6IHRzLkJpbmRpbmdOYW1lO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVOb2RlKG5vZGU6IE5hbWVhYmxlTm9kZSk6IHRzLklkZW50aWZpZXIgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogUHJvcGVydHlOYW1lYWJsZU5vZGUpOiB0cy5Qcm9wZXJ0eU5hbWUgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGUobm9kZTogQmluZGluZ05hbWVhYmxlTm9kZSk6IHRzLkJpbmRpbmdOYW1lIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVOb2RlKG5vZGU6IEFueU5hbWVhYmxlTm9kZSk6IHRzLklkZW50aWZpZXIgfCB0cy5Qcm9wZXJ0eU5hbWUgfCB0cy5CaW5kaW5nTmFtZSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lTm9kZShub2RlOiBhbnkpOiB0cy5JZGVudGlmaWVyIHwgdHMuUHJvcGVydHlOYW1lIHwgdHMuQmluZGluZ05hbWUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLm5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IE5hbWVhYmxlTm9kZSB8IE5hbWVkTm9kZSk6IHRzLklkZW50aWZpZXI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IFByb3BlcnR5TmFtZWFibGVOb2RlIHwgUHJvcGVydHlOYW1lZE5vZGUpOiB0cy5Qcm9wZXJ0eU5hbWU7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IEJpbmRpbmdOYW1lYWJsZU5vZGUgfCBCaW5kaW5nTmFtZWROb2RlKTogdHMuQmluZGluZ05hbWU7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZU5vZGVPclRocm93KG5vZGU6IGFueSk6IHRzLklkZW50aWZpZXIgfCB0cy5Qcm9wZXJ0eU5hbWUgfCB0cy5CaW5kaW5nTmFtZSB7XG4gIHJldHVybiB1dGlscy50aHJvd0lmTnVsbE9yVW5kZWZpbmVkKGdldE5hbWVOb2RlKG5vZGUpLCAnbmFtZScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZShub2RlOiBOYW1lZE5vZGUgfCBQcm9wZXJ0eU5hbWVkTm9kZSk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lKFxuICBub2RlOiBOYW1lYWJsZU5vZGUgfCBQcm9wZXJ0eU5hbWVhYmxlTm9kZSB8IEJpbmRpbmdOYW1lYWJsZU5vZGUgfCBCaW5kaW5nTmFtZWROb2RlLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWUobm9kZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbmFtZSA9IGdldE5hbWVOb2RlKG5vZGUpIGFzIHRzLklkZW50aWZpZXIgfCB0cy5Qcm9wZXJ0eU5hbWUgfCB0cy5CaW5kaW5nTmFtZSB8IHVuZGVmaW5lZDtcbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB0cy5pc09iamVjdEJpbmRpbmdQYXR0ZXJuKG5hbWUpIHx8IHRzLmlzQXJyYXlCaW5kaW5nUGF0dGVybihuYW1lKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gbmFtZS5nZXRUZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lT3JUaHJvdyhcbiAgbm9kZTogTmFtZWFibGVOb2RlIHwgTmFtZWROb2RlIHwgUHJvcGVydHlOYW1lYWJsZU5vZGUgfCBQcm9wZXJ0eU5hbWVkTm9kZSB8IEJpbmRpbmdOYW1lYWJsZU5vZGUgfCBCaW5kaW5nTmFtZWROb2RlLFxuKTogc3RyaW5nIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXROYW1lKG5vZGUgYXMgYW55KSwgJ25hbWUnKTtcbn1cblxudHlwZSBQcm9wZXJ0eU5hbWVOYW1lYWJsZU5vZGU8VCBleHRlbmRzIHRzLlByb3BlcnR5TmFtZT4gPSB0cy5Ob2RlICYgeyByZWFkb25seSBwcm9wZXJ0eU5hbWU/OiBUIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eU5hbWVOb2RlPFQgZXh0ZW5kcyB0cy5Qcm9wZXJ0eU5hbWU+KG5vZGU6IFByb3BlcnR5TmFtZU5hbWVhYmxlTm9kZTxUPik6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLnByb3BlcnR5TmFtZSk7XG59XG5cbnR5cGUgRG90RG90RG90VG9rZW5Ob2RlID0gdHMuTm9kZSAmIHsgcmVhZG9ubHkgZG90RG90RG90VG9rZW4/OiB0cy5Eb3REb3REb3RUb2tlbiB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG90RG90RG90VG9rZW4obm9kZTogRG90RG90RG90VG9rZW5Ob2RlKTogdHMuRG90RG90RG90VG9rZW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLmRvdERvdERvdFRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHQobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gIHJldHVybiBub2RlLmdldFRleHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFN5bnRheExpc3Qobm9kZTogdHMuTm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSB1dGlscy5nZXRWYWx1ZU9yVW5kZWZpbmVkKG5vZGUucGFyZW50KTtcbiAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHsgcG9zLCBlbmQgfSA9IG5vZGU7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIHBhcmVudC5nZXRDaGlsZHJlbigpKSB7XG4gICAgaWYgKGNoaWxkLnBvcyA+IGVuZCB8fCBjaGlsZCA9PT0gbm9kZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5TeW50YXhMaXN0ICYmIGNoaWxkLnBvcyA8PSBwb3MgJiYgY2hpbGQuZW5kID49IGVuZCkge1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7IC8vIHNob3VsZG4ndCBoYXBwZW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiBUTm9kZSxcbik6IFROb2RlIGV4dGVuZHMgeyByZWFkb25seSBwYXJlbnQ/OiBpbmZlciBUUGFyZW50IHwgbnVsbCB9ID8gVFBhcmVudCA6IG5ldmVyIHtcbiAgY29uc3QgcGFyZW50ID0gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZChub2RlLnBhcmVudCk7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gcGFyZW50ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAobm9kZS5wYXJlbnQgYXMgYW55KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBnZXRBbmNlc3RvcnMobm9kZTogdHMuTm9kZSk6IEl0ZXJhYmxlSXRlcmF0b3I8dHMuTm9kZT4ge1xuICBsZXQgcGFyZW50ID0gZ2V0UGFyZW50KG5vZGUpIGFzIHRzLk5vZGUgfCB1bmRlZmluZWQ7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICB3aGlsZSAocGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICB5aWVsZCBwYXJlbnQ7XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50KHBhcmVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBnZXREZXNjZW5kYW50cyhub2RlOiB0cy5Ob2RlKTogSXRlcmFibGVJdGVyYXRvcjx0cy5Ob2RlPiB7XG4gIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG5vZGUpO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgd2hpbGUgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBtdXRhYmxlTmV4dENoaWxkcmVuOiB0cy5Ob2RlW10gPSBbXTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB5aWVsZCBjaGlsZDtcbiAgICAgIG11dGFibGVOZXh0Q2hpbGRyZW4ucHVzaCguLi5nZXRDaGlsZHJlbihjaGlsZCkpO1xuICAgIH1cblxuICAgIGNoaWxkcmVuID0gbXV0YWJsZU5leHRDaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGdldERlc2NlbmRhbnRzQnlLaW5kPFROb2RlIGV4dGVuZHMgdHMuTm9kZT4oXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGtpbmQ6IFROb2RlIGV4dGVuZHMgeyByZWFkb25seSBraW5kOiBpbmZlciBUS2luZCB9ID8gVEtpbmQgOiBuZXZlcixcbik6IEl0ZXJhYmxlSXRlcmF0b3I8VE5vZGU+IHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gIGZvciAoY29uc3QgZGVzY2VuZGFudCBvZiBnZXREZXNjZW5kYW50cyhub2RlKSkge1xuICAgIGlmIChkZXNjZW5kYW50LmtpbmQgPT09IGtpbmQpIHtcbiAgICAgIHlpZWxkIGRlc2NlbmRhbnQgYXMgVE5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldChzeW1ib2w6IHRzLlN5bWJvbCk6IHRzLlN5bWJvbCB7XG4gIGNvbnN0IHRhcmdldCA9IChzeW1ib2wgYXMgYW55KS50YXJnZXQ7XG5cbiAgcmV0dXJuIHRhcmdldCA9PT0gdW5kZWZpbmVkID8gc3ltYm9sIDogdGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ltYm9sKHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlciwgbm9kZTogdHMuTm9kZSk6IHRzLlN5bWJvbCB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgY29uc3Qgc3ltYm9sID0gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCgobm9kZSBhcyBhbnkpLnN5bWJvbCk7XG4gIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRUYXJnZXQoc3ltYm9sKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGVDaGVja2VyU3ltYm9sID0gdXRpbHMuZ2V0VmFsdWVPclVuZGVmaW5lZCh0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpKTtcbiAgaWYgKHR5cGVDaGVja2VyU3ltYm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0VGFyZ2V0KHR5cGVDaGVja2VyU3ltYm9sKTtcbiAgfVxuXG4gIGNvbnN0IG5hbWVOb2RlID0gZ2V0TmFtZU5vZGUobm9kZSk7XG4gIGlmIChuYW1lTm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGdldFN5bWJvbCh0eXBlQ2hlY2tlciwgbmFtZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLCBub2RlOiB0cy5Ob2RlKTogdHMuU3ltYm9sIHtcbiAgcmV0dXJuIHV0aWxzLnRocm93SWZOdWxsT3JVbmRlZmluZWQoZ2V0U3ltYm9sKHR5cGVDaGVja2VyLCBub2RlKSwgJ3N5bWJvbCcpO1xufVxuXG5mdW5jdGlvbiBnZXRDaGlsZHJlbihub2RlOiB0cy5Ob2RlKTogcmVhZG9ubHkgdHMuTm9kZVtdIHtcbiAgcmV0dXJuIG5vZGUuZ2V0Q2hpbGRyZW4oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0Q2hpbGQobm9kZTogdHMuTm9kZSk6IHRzLk5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG5vZGUpO1xuXG4gIHJldHVybiB1dGlscy5nZXRWYWx1ZU9yVW5kZWZpbmVkKGNoaWxkcmVuWzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0Q2hpbGRCeUtpbmQ8VE5vZGUgZXh0ZW5kcyB0cy5Ob2RlPihcbiAgbm9kZTogdHMuTm9kZSxcbiAga2luZDogVE5vZGUgZXh0ZW5kcyB7IHJlYWRvbmx5IGtpbmQ6IGluZmVyIFRLaW5kIH0gPyBUS2luZCA6IG5ldmVyLFxuKTogVE5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG5vZGUpO1xuXG4gIHJldHVybiBjaGlsZHJlbi5maW5kKCh2YWx1ZSk6IHZhbHVlIGlzIFROb2RlID0+IHZhbHVlLmtpbmQgPT09IGtpbmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RBbmNlc3RvckJ5S2luZDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiB0cy5Ob2RlLFxuICBraW5kOiBUTm9kZSBleHRlbmRzIHsgcmVhZG9ubHkga2luZDogaW5mZXIgVEtpbmQgfSA/IFRLaW5kIDogbmV2ZXIsXG4pOiBUTm9kZSB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGdldEFuY2VzdG9ycyhub2RlKSkge1xuICAgIGlmIChhbmNlc3Rvci5raW5kID09PSBraW5kKSB7XG4gICAgICByZXR1cm4gYW5jZXN0b3IgYXMgVE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0QW5jZXN0b3JCeUtpbmRPclRocm93PFROb2RlIGV4dGVuZHMgdHMuTm9kZT4oXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGtpbmQ6IFROb2RlIGV4dGVuZHMgeyByZWFkb25seSBraW5kOiBpbmZlciBUS2luZCB9ID8gVEtpbmQgOiBuZXZlcixcbik6IFROb2RlIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXRGaXJzdEFuY2VzdG9yQnlLaW5kPFROb2RlPihub2RlLCBraW5kIGFzIGFueSksICdhbmNlc3RvcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RBbmNlc3RvckJ5VGVzdDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiB0cy5Ob2RlLFxuICBpc05vZGU6ICh2YWx1ZTogdHMuTm9kZSkgPT4gdmFsdWUgaXMgVE5vZGUsXG4pOiBUTm9kZSB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGdldEFuY2VzdG9ycyhub2RlKSkge1xuICAgIGlmIChpc05vZGUoYW5jZXN0b3IpKSB7XG4gICAgICByZXR1cm4gYW5jZXN0b3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0QW5jZXN0b3JCeVRlc3RPclRocm93PFROb2RlIGV4dGVuZHMgdHMuTm9kZT4oXG4gIG5vZGU6IHRzLk5vZGUsXG4gIGlzTm9kZTogKHZhbHVlOiB0cy5Ob2RlKSA9PiB2YWx1ZSBpcyBUTm9kZSxcbik6IFROb2RlIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gdXRpbHMudGhyb3dJZk51bGxPclVuZGVmaW5lZChnZXRGaXJzdEFuY2VzdG9yQnlUZXN0PFROb2RlPihub2RlLCBpc05vZGUpLCAnYW5jZXN0b3InKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0RGVzY2VuZGFudEJ5S2luZDxUTm9kZSBleHRlbmRzIHRzLk5vZGU+KFxuICBub2RlOiB0cy5Ob2RlLFxuICBraW5kOiBUTm9kZSBleHRlbmRzIHsgcmVhZG9ubHkga2luZDogaW5mZXIgVEtpbmQgfSA/IFRLaW5kIDogbmV2ZXIsXG4pOiBUTm9kZSB8IHVuZGVmaW5lZCB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGdldERlc2NlbmRhbnRzKG5vZGUpKSB7XG4gICAgaWYgKGFuY2VzdG9yLmtpbmQgPT09IGtpbmQpIHtcbiAgICAgIHJldHVybiBhbmNlc3RvciBhcyBUTm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNOb2RlRmxhZyhub2RlOiB0cy5Ob2RlLCBmbGFnOiB0cy5Ob2RlRmxhZ3MpOiBib29sZWFuIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuIChub2RlLmZsYWdzICYgZmxhZykgIT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JhbEF1Z21lbnRhdGlvbihub2RlOiB0cy5Ob2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNOb2RlRmxhZyhub2RlLCB0cy5Ob2RlRmxhZ3MuR2xvYmFsQXVnbWVudGF0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUZpbGUobm9kZTogdHMuTm9kZSk6IHRzLlNvdXJjZUZpbGUge1xuICByZXR1cm4gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3Mobm9kZTogdHMuTm9kZSk6IG51bWJlciB7XG4gIHJldHVybiBub2RlLnBvcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVuZChub2RlOiB0cy5Ob2RlKTogbnVtYmVyIHtcbiAgcmV0dXJuIG5vZGUuZW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRBdFBvcyhub2RlOiB0cy5Ob2RlLCBwb3M6IG51bWJlcik6IHRzLk5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zIDwgZ2V0UG9zKG5vZGUpIHx8IHBvcyA+PSBnZXRFbmQobm9kZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGdldENoaWxkcmVuKG5vZGUpLmZpbmQoKGNoaWxkKSA9PiBwb3MgPj0gZ2V0UG9zKGNoaWxkKSAmJiBwb3MgPCBnZXRFbmQoY2hpbGQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2NlbmRhbnRBdFBvcyhub2RlSW46IHRzLk5vZGUsIHBvczogbnVtYmVyKTogdHMuTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGxldCBub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBuZXh0Tm9kZSA9IGdldENoaWxkQXRQb3Mobm9kZSA9PT0gdW5kZWZpbmVkID8gbm9kZUluIDogbm9kZSwgcG9zKTtcbiAgICBpZiAobmV4dE5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnRPZlR5cGVOb2RlKG5vZGU6IHRzLk5vZGUpOiBib29sZWFuIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICByZXR1cm4gKHRzIGFzIGFueSkuaXNQYXJ0T2ZUeXBlTm9kZShub2RlKTtcbn1cbiJdfQ==
|