ts2famix 2.1.0-beta.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.eslintrc.json +24 -24
  2. package/LICENSE +24 -24
  3. package/README.md +78 -78
  4. package/dist/analyze.js +20 -10
  5. package/dist/analyze_functions/process_functions.js +109 -69
  6. package/dist/famix_functions/EntityDictionary.js +691 -606
  7. package/dist/famix_functions/helpers_creation.js +35 -19
  8. package/dist/fqn.js +351 -18
  9. package/dist/lib/famix/famix_JSON_exporter.js +1 -1
  10. package/dist/lib/famix/famix_base_element.js +1 -1
  11. package/dist/lib/famix/famix_repository.js +31 -12
  12. package/dist/lib/famix/index.js +18 -8
  13. package/dist/lib/famix/model/famix/access.js +1 -1
  14. package/dist/lib/famix/model/famix/accessor.js +1 -1
  15. package/dist/lib/famix/model/famix/alias.js +1 -1
  16. package/dist/lib/famix/model/famix/arrow_function.js +1 -1
  17. package/dist/lib/famix/model/famix/behavioral_entity.js +1 -1
  18. package/dist/lib/famix/model/famix/class.js +1 -1
  19. package/dist/lib/famix/model/famix/comment.js +1 -1
  20. package/dist/lib/famix/model/famix/concretisation.js +1 -1
  21. package/dist/lib/famix/model/famix/container_entity.js +1 -1
  22. package/dist/lib/famix/model/famix/decorator.js +1 -1
  23. package/dist/lib/famix/model/famix/entity.js +1 -1
  24. package/dist/lib/famix/model/famix/enum.js +1 -1
  25. package/dist/lib/famix/model/famix/enum_value.js +1 -1
  26. package/dist/lib/famix/model/famix/function.js +1 -1
  27. package/dist/lib/famix/model/famix/import_clause.js +1 -1
  28. package/dist/lib/famix/model/famix/index.js +1 -1
  29. package/dist/lib/famix/model/famix/indexed_file_anchor.js +1 -1
  30. package/dist/lib/famix/model/famix/inheritance.js +1 -1
  31. package/dist/lib/famix/model/famix/interface.js +1 -1
  32. package/dist/lib/famix/model/famix/invocation.js +1 -1
  33. package/dist/lib/famix/model/famix/method.js +1 -1
  34. package/dist/lib/famix/model/famix/module.js +2 -2
  35. package/dist/lib/famix/model/famix/named_entity.js +1 -1
  36. package/dist/lib/famix/model/famix/parameter.js +1 -1
  37. package/dist/lib/famix/model/famix/parameter_concretisation.js +1 -1
  38. package/dist/lib/famix/model/famix/parameter_type.js +1 -1
  39. package/dist/lib/famix/model/famix/parametric_arrow_function.js +1 -1
  40. package/dist/lib/famix/model/famix/parametric_class.js +1 -1
  41. package/dist/lib/famix/model/famix/parametric_function.js +1 -1
  42. package/dist/lib/famix/model/famix/parametric_interface.js +1 -1
  43. package/dist/lib/famix/model/famix/parametric_method.js +1 -1
  44. package/dist/lib/famix/model/famix/primitive_type.js +1 -1
  45. package/dist/lib/famix/model/famix/property.js +1 -1
  46. package/dist/lib/famix/model/famix/reference.js +1 -1
  47. package/dist/lib/famix/model/famix/scoping_entity.js +1 -1
  48. package/dist/lib/famix/model/famix/script_entity.js +1 -1
  49. package/dist/lib/famix/model/famix/source_anchor.js +1 -1
  50. package/dist/lib/famix/model/famix/source_language.js +1 -1
  51. package/dist/lib/famix/model/famix/sourced_entity.js +1 -1
  52. package/dist/lib/famix/model/famix/structural_entity.js +1 -1
  53. package/dist/lib/famix/model/famix/type.js +1 -1
  54. package/dist/lib/famix/model/famix/variable.js +1 -1
  55. package/dist/lib/ts-complex/cyclomatic-service.js +1 -1
  56. package/dist/refactorer/refactor-getter-setter.js +18 -8
  57. package/dist/ts2famix-cli-wrapper.js +18 -8
  58. package/dist/ts2famix-cli.js +18 -8
  59. package/dist/ts2famix-tsconfig.js +18 -8
  60. package/doc-uml/famix-typescript-model.puml +619 -607
  61. package/doc-uml/famix-typescript-model.svg +1 -1
  62. package/eslint.config.mjs +28 -28
  63. package/jest.config.json +1 -1
  64. package/package.json +70 -70
  65. package/src/analyze.ts +120 -120
  66. package/src/analyze_functions/process_functions.ts +1069 -1040
  67. package/src/famix_functions/EntityDictionary.ts +2061 -2016
  68. package/src/famix_functions/helpers_creation.ts +143 -135
  69. package/src/fqn.ts +416 -50
  70. package/src/generate_uml.sh +20 -20
  71. package/src/lib/famix/License.md +22 -22
  72. package/src/lib/famix/famix_JSON_exporter.ts +56 -56
  73. package/src/lib/famix/famix_base_element.ts +22 -22
  74. package/src/lib/famix/famix_repository.ts +288 -278
  75. package/src/lib/famix/index.ts +8 -8
  76. package/src/lib/famix/model/famix/access.ts +50 -50
  77. package/src/lib/famix/model/famix/accessor.ts +15 -15
  78. package/src/lib/famix/model/famix/alias.ts +39 -39
  79. package/src/lib/famix/model/famix/arrow_function.ts +15 -15
  80. package/src/lib/famix/model/famix/behavioral_entity.ts +97 -97
  81. package/src/lib/famix/model/famix/class.ts +85 -85
  82. package/src/lib/famix/model/famix/comment.ts +47 -47
  83. package/src/lib/famix/model/famix/concretisation.ts +40 -40
  84. package/src/lib/famix/model/famix/container_entity.ts +160 -160
  85. package/src/lib/famix/model/famix/decorator.ts +37 -37
  86. package/src/lib/famix/model/famix/entity.ts +15 -15
  87. package/src/lib/famix/model/famix/enum.ts +30 -30
  88. package/src/lib/famix/model/famix/enum_value.ts +28 -28
  89. package/src/lib/famix/model/famix/function.ts +15 -15
  90. package/src/lib/famix/model/famix/import_clause.ts +51 -51
  91. package/src/lib/famix/model/famix/index.ts +41 -41
  92. package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -46
  93. package/src/lib/famix/model/famix/inheritance.ts +40 -40
  94. package/src/lib/famix/model/famix/interface.ts +75 -75
  95. package/src/lib/famix/model/famix/invocation.ts +65 -65
  96. package/src/lib/famix/model/famix/method.ts +89 -89
  97. package/src/lib/famix/model/famix/module.ts +71 -71
  98. package/src/lib/famix/model/famix/named_entity.ts +95 -95
  99. package/src/lib/famix/model/famix/parameter.ts +28 -28
  100. package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -51
  101. package/src/lib/famix/model/famix/parameter_type.ts +58 -58
  102. package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -32
  103. package/src/lib/famix/model/famix/parametric_class.ts +49 -49
  104. package/src/lib/famix/model/famix/parametric_function.ts +32 -32
  105. package/src/lib/famix/model/famix/parametric_interface.ts +49 -49
  106. package/src/lib/famix/model/famix/parametric_method.ts +32 -32
  107. package/src/lib/famix/model/famix/primitive_type.ts +15 -15
  108. package/src/lib/famix/model/famix/property.ts +94 -94
  109. package/src/lib/famix/model/famix/reference.ts +40 -40
  110. package/src/lib/famix/model/famix/scoping_entity.ts +35 -35
  111. package/src/lib/famix/model/famix/script_entity.ts +34 -34
  112. package/src/lib/famix/model/famix/source_anchor.ts +30 -30
  113. package/src/lib/famix/model/famix/source_language.ts +35 -35
  114. package/src/lib/famix/model/famix/sourced_entity.ts +70 -70
  115. package/src/lib/famix/model/famix/structural_entity.ts +43 -43
  116. package/src/lib/famix/model/famix/type.ts +87 -87
  117. package/src/lib/famix/model/famix/variable.ts +27 -27
  118. package/src/lib/famix/package.json +28 -28
  119. package/src/lib/ts-complex/cyclomatic-service.ts +83 -83
  120. package/src/refactorer/refactor-getter-setter.ts +140 -140
  121. package/src/ts2famix-cli-wrapper.ts +21 -21
  122. package/src/ts2famix-cli.ts +60 -60
  123. package/tsconfig.check-tests.json +14 -14
  124. package/tsconfig.json +73 -72
  125. package/.vscode/settings.json +0 -4
  126. package/TODO +0 -1
  127. package/arwea-fix.json +0 -1
  128. package/bogus.ts +0 -3
  129. package/class-diagram.puml +0 -792
  130. package/debug.txt +0 -13332
  131. package/debuglog.txt +0 -12073
  132. package/dist/famix2puml.js +0 -126
  133. package/dist/getClasses-arrow-body.js +0 -43
  134. package/dist/lib/famix/src/famix_JSON_exporter.js +0 -55
  135. package/dist/lib/famix/src/famix_base_element.js +0 -18
  136. package/dist/lib/famix/src/famix_repository.js +0 -224
  137. package/dist/lib/famix/src/index.js +0 -31
  138. package/dist/lib/famix/src/model/famix/access.js +0 -40
  139. package/dist/lib/famix/src/model/famix/accessor.js +0 -17
  140. package/dist/lib/famix/src/model/famix/alias.js +0 -33
  141. package/dist/lib/famix/src/model/famix/arrowFunction.js +0 -17
  142. package/dist/lib/famix/src/model/famix/arrow_function.js +0 -17
  143. package/dist/lib/famix/src/model/famix/behavioral_entity.js +0 -79
  144. package/dist/lib/famix/src/model/famix/class.js +0 -71
  145. package/dist/lib/famix/src/model/famix/comment.js +0 -39
  146. package/dist/lib/famix/src/model/famix/concretisation.js +0 -31
  147. package/dist/lib/famix/src/model/famix/container_entity.js +0 -126
  148. package/dist/lib/famix/src/model/famix/decorator.js +0 -32
  149. package/dist/lib/famix/src/model/famix/entity.js +0 -17
  150. package/dist/lib/famix/src/model/famix/enum.js +0 -31
  151. package/dist/lib/famix/src/model/famix/enum_value.js +0 -25
  152. package/dist/lib/famix/src/model/famix/function.js +0 -17
  153. package/dist/lib/famix/src/model/famix/implicit_variable.js +0 -17
  154. package/dist/lib/famix/src/model/famix/import_clause.js +0 -41
  155. package/dist/lib/famix/src/model/famix/index.js +0 -86
  156. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +0 -38
  157. package/dist/lib/famix/src/model/famix/inheritance.js +0 -33
  158. package/dist/lib/famix/src/model/famix/interface.js +0 -64
  159. package/dist/lib/famix/src/model/famix/invocation.js +0 -54
  160. package/dist/lib/famix/src/model/famix/method.js +0 -67
  161. package/dist/lib/famix/src/model/famix/module.js +0 -60
  162. package/dist/lib/famix/src/model/famix/named_entity.js +0 -78
  163. package/dist/lib/famix/src/model/famix/parameter.js +0 -25
  164. package/dist/lib/famix/src/model/famix/parameterConcretisation.js +0 -44
  165. package/dist/lib/famix/src/model/famix/parameter_concretisation.js +0 -44
  166. package/dist/lib/famix/src/model/famix/parameter_type.js +0 -45
  167. package/dist/lib/famix/src/model/famix/parametricArrowFunction.js +0 -29
  168. package/dist/lib/famix/src/model/famix/parametric_arrow_function.js +0 -31
  169. package/dist/lib/famix/src/model/famix/parametric_class.js +0 -44
  170. package/dist/lib/famix/src/model/famix/parametric_function.js +0 -31
  171. package/dist/lib/famix/src/model/famix/parametric_interface.js +0 -44
  172. package/dist/lib/famix/src/model/famix/parametric_method.js +0 -31
  173. package/dist/lib/famix/src/model/famix/primitive_type.js +0 -17
  174. package/dist/lib/famix/src/model/famix/property.js +0 -73
  175. package/dist/lib/famix/src/model/famix/reference.js +0 -33
  176. package/dist/lib/famix/src/model/famix/scoping_entity.js +0 -36
  177. package/dist/lib/famix/src/model/famix/script_entity.js +0 -29
  178. package/dist/lib/famix/src/model/famix/source_anchor.js +0 -27
  179. package/dist/lib/famix/src/model/famix/source_language.js +0 -35
  180. package/dist/lib/famix/src/model/famix/sourced_entity.js +0 -60
  181. package/dist/lib/famix/src/model/famix/structural_entity.js +0 -39
  182. package/dist/lib/famix/src/model/famix/text_anchor.js +0 -38
  183. package/dist/lib/famix/src/model/famix/type.js +0 -73
  184. package/dist/lib/famix/src/model/famix/variable.js +0 -24
  185. package/fqn-model.json +0 -1
  186. package/iterateGenericTypes.ts +0 -69
  187. package/out/class-diagram/class-diagram.svg +0 -1
  188. package/sample.json +0 -1
  189. package/sample.ts +0 -1
  190. package/stats.txt +0 -3091
  191. package/tabby-debug-output.txt +0 -19433
  192. package/ts2famix.log +0 -22656
  193. package/validate-references.js +0 -103
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.indexOfSplitArray = indexOfSplitArray;
27
37
  exports.getSubTypeName = getSubTypeName;
@@ -108,17 +118,23 @@ function findAncestor(node) {
108
118
  */
109
119
  function findTypeAncestor(element) {
110
120
  let ancestor;
111
- ancestor = element.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration ||
112
- a.getKind() === ts_morph_1.SyntaxKind.Constructor ||
113
- a.getKind() === ts_morph_1.SyntaxKind.MethodSignature ||
114
- a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration ||
115
- a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression ||
116
- a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration ||
117
- a.getKind() === ts_morph_1.SyntaxKind.SourceFile ||
118
- a.getKindName() === "GetAccessor" ||
119
- a.getKindName() === "SetAccessor" ||
120
- a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration ||
121
- a.getKind() === ts_morph_1.SyntaxKind.InterfaceDeclaration);
121
+ const ancestors = element.getAncestors();
122
+ console.log(`Ancestors count: ${ancestors.length}`);
123
+ ancestor = ancestors.find(a => {
124
+ const kind = a.getKind();
125
+ const kindName = a.getKindName();
126
+ return kind === ts_morph_1.SyntaxKind.MethodDeclaration ||
127
+ kind === ts_morph_1.SyntaxKind.Constructor ||
128
+ kind === ts_morph_1.SyntaxKind.MethodSignature ||
129
+ kind === ts_morph_1.SyntaxKind.FunctionDeclaration ||
130
+ kind === ts_morph_1.SyntaxKind.FunctionExpression ||
131
+ kind === ts_morph_1.SyntaxKind.ModuleDeclaration ||
132
+ kind === ts_morph_1.SyntaxKind.SourceFile ||
133
+ kindName === "GetAccessor" ||
134
+ kindName === "SetAccessor" ||
135
+ kind === ts_morph_1.SyntaxKind.ClassDeclaration ||
136
+ kind === ts_morph_1.SyntaxKind.InterfaceDeclaration;
137
+ });
122
138
  if (!ancestor) {
123
139
  throw new Error(`Type ancestor not found for ${element.getKindName()}`);
124
140
  }
@@ -145,4 +161,4 @@ function replaceLastBetweenTags(input, replacement) {
145
161
  const afterTag = input.substring(closingTagIndex); // Include '>'
146
162
  return beforeTag + replacement + afterTag;
147
163
  }
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyc19jcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvaGVscGVyc19jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsOENBZUM7QUFFRCx3Q0FpQkM7QUFPRCw0Q0FHQztBQU9ELG9DQWdCQztBQU9ELDRDQWtCQztBQUVELHdDQU1DO0FBRUQsd0RBaUJDO0FBdElELGdFQUFrRDtBQUNsRCx3Q0FBb0M7QUFDcEMsdUNBQWtVO0FBU2xVOzs7R0FHRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLE1BQXdCO0lBQ3RELE1BQU0sRUFBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDckQsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3BFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDZCxNQUFNO1lBQ1YsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTyxDQUFDLENBQUMsQ0FBQyxvREFBb0Q7UUFDbEUsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsa0VBQWtFO0FBQ2pGLENBQUM7QUFFRCxTQUFnQixjQUFjLENB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QyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7U0FBTSxDQUFDO1FBQ0osT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsV0FBbUI7SUFDckUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1QyxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLENBQUMsa0RBQWtEO0lBQ3BFLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV6RCxJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLENBQUMsd0RBQXdEO0lBQzFFLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjO0lBRWpFLE9BQU8sU0FBUyxHQUFHLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEZhbWl4IGZyb20gXCIuLi9saWIvZmFtaXgvbW9kZWwvZmFtaXhcIjtcclxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2FuYWx5emVcIjtcclxuaW1wb3J0IHsgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiwgSWRlbnRpZmllciwgRnVuY3Rpb25EZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24sIE1ldGhvZFNpZ25hdHVyZSwgUHJvcGVydHlEZWNsYXJhdGlvbiwgUHJvcGVydHlTaWduYXR1cmUsIFZhcmlhYmxlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uLCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBFbnVtTWVtYmVyLCBUeXBlQWxpYXNEZWNsYXJhdGlvbiwgTm9kZSwgU3ludGF4S2luZCwgRnVuY3Rpb25FeHByZXNzaW9uIH0gZnJvbSBcInRzLW1vcnBoXCI7XHJcbmltcG9ydCB7IFRTTW9ycGhUeXBlRGVjbGFyYXRpb24gfSBmcm9tIFwiLi9FbnRpdHlEaWN0aW9uYXJ5XCI7XHJcblxyXG5pbnRlcmZhY2UgU2VhcmNoUGFyYW1ldGVycyB7XHJcbiAgICBzZWFyY2hBcnJheTogc3RyaW5nW107XHJcbiAgICB0YXJnZXRBcnJheTogc3RyaW5nW107XHJcbiAgICBzdGFydD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gd29ya3MgbGlrZSBpbmRleE9mLCBidXQgaXQgd29ya3Mgd2l0aCBhcnJheXMgb2YgZ3JhcGhlbWUgY2x1c3RlcnMuXHJcbiAqIEBwYXJhbSB0YXJnZXRBcnJheVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGluZGV4T2ZTcGxpdEFycmF5KHBhcmFtczogU2VhcmNoUGFyYW1ldGVycyk6IG51bWJlciB7XHJcbiAgICBjb25zdCB7c2VhcmNoQXJyYXksIHRhcmdldEFycmF5LCBzdGFydCA9IDB9ID0gcGFyYW1zO1xyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IHNlYXJjaEFycmF5Lmxlbmd0aCAtIHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWFyY2hBcnJheVtpICsgal0gIT09IHRhcmdldEFycmF5W2pdKSB7XHJcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpOyAvLyBSZXR1cm4gdGhlIGluZGV4IHdoZXJlIHRoZSB0YXJnZXQgYXJyYXkgd2FzIGZvdW5kXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xOyAvLyBSZXR1cm4gLTEgaWYgdGhlIHRhcmdldCBhcnJheSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZWFyY2ggYXJyYXlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN1YlR5cGVOYW1lKGZteE5hbWVkRW50aXR5OiBGYW1peC5OYW1lZEVudGl0eSkge1xyXG4gICAgY29uc3QgbmFtZSA9IGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguQ2xhc3MgPyAnQ2xhc3MnIDpcclxuICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkludGVyZmFjZSA/ICdJbnRlcmZhY2UnIDpcclxuICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5GdW5jdGlvbiA/ICdGdW5jdGlvbicgOlxyXG4gICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5FbnVtID8gJ0VudW0nIDpcclxuICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkVudW1WYWx1ZSA/ICdFbnVtVmFsdWUnIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5BbGlhcyA/ICdBbGlhcycgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5WYXJpYWJsZSA/ICdWYXJpYWJsZScgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguVHlwZSA/ICdUeXBlJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguTWV0aG9kID8gJ01ldGhvZCcgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5EZWNvcmF0b3IgPyAnRGVjb3JhdG9yJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5BY2Nlc3NvciA/ICdBY2Nlc3NvcicgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LlBhcmFtZXRlciA/ICdQYXJhbWV0ZXInIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguUHJvcGVydHkgPyAnUHJvcGVydHknIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmFtZWRFbnRpdHknO1xyXG4gICAgbG9nZ2VyLmRlYnVnKGAke2ZteE5hbWVkRW50aXR5Lm5hbWV9IGlzIG9mIHR5cGUgJHtuYW1lfWApO1xyXG4gICAgcmV0dXJuIG5hbWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBzaWduYXR1cmUgb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gdGV4dCBBIG1ldGhvZCBvciBhIGZ1bmN0aW9uIHNvdXJjZSBjb2RlXHJcbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2lnbmF0dXJlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBlbmRTaWduYXR1cmVUZXh0ID0gdGV4dC5pbmRleE9mKFwie1wiKTtcclxuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBlbmRTaWduYXR1cmVUZXh0KS50cmltKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kcyB0aGUgYW5jZXN0b3Igb2YgYSBub2RlXHJcbiAqIEBwYXJhbSBub2RlIEEgbm9kZVxyXG4gKiBAcmV0dXJucyBUaGUgYW5jZXN0b3Igb2YgdGhlIG5vZGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQW5jZXN0b3Iobm9kZTogSWRlbnRpZmllcik6IE5vZGUge1xyXG4gICAgbGV0IGFuY2VzdG9yOiBOb2RlIHwgdW5kZWZpbmVkO1xyXG4gICAgYW5jZXN0b3IgPSBub2RlLmdldEFuY2VzdG9ycygpLmZpbmQoYSA9PiBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5NZXRob2REZWNsYXJhdGlvbiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Db25zdHJ1Y3RvciB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Tb3VyY2VGaWxlIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJHZXRBY2Nlc3NvclwiIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJTZXRBY2Nlc3NvclwiIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkNsYXNzRGVjbGFyYXRpb24pO1xyXG4gICAgaWYgKCFhbmNlc3Rvcikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3Igbm90IGZvdW5kIGZvciAke25vZGUuZ2V0VGV4dCgpfWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFuY2VzdG9yXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kcyB0aGUgYW5jZXN0b3Igb2YgYSB0cy1tb3JwaCBlbGVtZW50XHJcbiAqIEBwYXJhbSBlbGVtZW50IEEgdHMtbW9ycGggZWxlbWVudFxyXG4gKiBAcmV0dXJucyBUaGUgYW5jZXN0b3Igb2YgdGhlIHRzLW1vcnBoIGVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHlwZUFuY2VzdG9yKGVsZW1lbnQ6IFRTTW9ycGhUeXBlRGVjbGFyYXRpb24pOiBOb2RlIHtcclxuICAgIGxldCBhbmNlc3RvcjogTm9kZSB8IHVuZGVmaW5lZDtcclxuICAgIGFuY2VzdG9yID0gZWxlbWVudC5nZXRBbmNlc3RvcnMoKS5maW5kKGEgPT4gXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb24gfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuQ29uc3RydWN0b3IgfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuTWV0aG9kU2lnbmF0dXJlIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLk1vZHVsZURlY2xhcmF0aW9uIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLlNvdXJjZUZpbGUgfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kTmFtZSgpID09PSBcIkdldEFjY2Vzc29yXCIgfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kTmFtZSgpID09PSBcIlNldEFjY2Vzc29yXCIgfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbik7XHJcbiAgICBpZiAoIWFuY2VzdG9yKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlIGFuY2VzdG9yIG5vdCBmb3VuZCBmb3IgJHtlbGVtZW50LmdldEtpbmROYW1lKCl9YCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYW5jZXN0b3I7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhcnJheXNBcmVFcXVhbChhcnJheTE6IHN0cmluZ1tdLCBhcnJheTI6IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJyYXkxICYmIGFycmF5MiApIHtcclxuICAgICAgICByZXR1cm4gYXJyYXkxLmxlbmd0aCA9PT0gYXJyYXkyLmxlbmd0aCAmJiBhcnJheTEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IGFycmF5MltpbmRleF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlTGFzdEJldHdlZW5UYWdzKGlucHV0OiBzdHJpbmcsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbGFzdFRhZ0luZGV4ID0gaW5wdXQubGFzdEluZGV4T2YoJzwnKTtcclxuICAgIFxyXG4gICAgaWYgKGxhc3RUYWdJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gaW5wdXQ7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHRhZ3MgYXJlIGZvdW5kXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xvc2luZ1RhZ0luZGV4ID0gaW5wdXQuaW5kZXhPZignPicsIGxhc3RUYWdJbmRleCk7XHJcbiAgICBcclxuICAgIGlmIChjbG9zaW5nVGFnSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIGlucHV0OyAvLyBSZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyBpZiBubyBjbG9zaW5nIHRhZyBpcyBmb3VuZFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJlZm9yZVRhZyA9IGlucHV0LnN1YnN0cmluZygwLCBsYXN0VGFnSW5kZXggKyAxKTsgLy8gSW5jbHVkZSAnPCdcclxuICAgIGNvbnN0IGFmdGVyVGFnID0gaW5wdXQuc3Vic3RyaW5nKGNsb3NpbmdUYWdJbmRleCk7IC8vIEluY2x1ZGUgJz4nXHJcblxyXG4gICAgcmV0dXJuIGJlZm9yZVRhZyArIHJlcGxhY2VtZW50ICsgYWZ0ZXJUYWc7XHJcbn1cclxuIl19
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyc19jcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvaGVscGVyc19jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWVBLDhDQWVDO0FBRUQsd0NBaUJDO0FBT0QsNENBR0M7QUFPRCxvQ0FnQkM7QUFPRCw0Q0EwQkM7QUFFRCx3Q0FNQztBQUVELHdEQWlCQztBQTlJRCxnRUFBa0Q7QUFDbEQsd0NBQW9DO0FBQ3BDLHVDQUFrVTtBQVNsVTs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxNQUF3QjtJQUN0RCxNQUFNLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2QsTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0RBQW9EO1FBQ2xFLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtFQUFrRTtBQUNqRixDQUFDO0FBRUQsU0FB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LElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRyxDQUFDO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEcsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLEtBQWEsRUFBRSxXQUFtQjtJQUNyRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVDLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUMsQ0FBQyxrREFBa0Q7SUFDcEUsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXpELElBQUksZUFBZSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsQ0FBQyx3REFBd0Q7SUFDMUUsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWM7SUFDdEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGNBQWM7SUFFakUsT0FBTyxTQUFTLEdBQUcsV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRmFtaXggZnJvbSBcIi4uL2xpYi9mYW1peC9tb2RlbC9mYW1peFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2FuYWx5emVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yRGVjbGFyYXRpb24sIElkZW50aWZpZXIsIEZ1bmN0aW9uRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIFByb3BlcnR5RGVjbGFyYXRpb24sIFByb3BlcnR5U2lnbmF0dXJlLCBWYXJpYWJsZURlY2xhcmF0aW9uLCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgRW51bU1lbWJlciwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIE5vZGUsIFN5bnRheEtpbmQsIEZ1bmN0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJ0cy1tb3JwaFwiO1xuaW1wb3J0IHsgVFNNb3JwaFR5cGVEZWNsYXJhdGlvbiB9IGZyb20gXCIuL0VudGl0eURpY3Rpb25hcnlcIjtcblxuaW50ZXJmYWNlIFNlYXJjaFBhcmFtZXRlcnMge1xuICAgIHNlYXJjaEFycmF5OiBzdHJpbmdbXTtcbiAgICB0YXJnZXRBcnJheTogc3RyaW5nW107XG4gICAgc3RhcnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIGluZGV4T2YsIGJ1dCBpdCB3b3JrcyB3aXRoIGFycmF5cyBvZiBncmFwaGVtZSBjbHVzdGVycy5cbiAqIEBwYXJhbSB0YXJnZXRBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZlNwbGl0QXJyYXkocGFyYW1zOiBTZWFyY2hQYXJhbWV0ZXJzKTogbnVtYmVyIHtcbiAgICBjb25zdCB7c2VhcmNoQXJyYXksIHRhcmdldEFycmF5LCBzdGFydCA9IDB9ID0gcGFyYW1zO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBzZWFyY2hBcnJheS5sZW5ndGggLSB0YXJnZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZm91bmQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoc2VhcmNoQXJyYXlbaSArIGpdICE9PSB0YXJnZXRBcnJheVtqXSkge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gaTsgLy8gUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0aGUgdGFyZ2V0IGFycmF5IHdhcyBmb3VuZFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTsgLy8gUmV0dXJuIC0xIGlmIHRoZSB0YXJnZXQgYXJyYXkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VhcmNoIGFycmF5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJUeXBlTmFtZShmbXhOYW1lZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHkpIHtcbiAgICBjb25zdCBuYW1lID0gZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5DbGFzcyA/ICdDbGFzcycgOlxuICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkludGVyZmFjZSA/ICdJbnRlcmZhY2UnIDpcbiAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguRnVuY3Rpb24gPyAnRnVuY3Rpb24nIDpcbiAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkVudW0gPyAnRW51bScgOlxuICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkVudW1WYWx1ZSA/ICdFbnVtVmFsdWUnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguQWxpYXMgPyAnQWxpYXMnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LlZhcmlhYmxlID8gJ1ZhcmlhYmxlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguVHlwZSA/ICdUeXBlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4Lk1ldGhvZCA/ICdNZXRob2QnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkRlY29yYXRvciA/ICdEZWNvcmF0b3InIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5BY2Nlc3NvciA/ICdBY2Nlc3NvcicgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0ZXIgPyAnUGFyYW1ldGVyJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5Qcm9wZXJ0eSA/ICdQcm9wZXJ0eScgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmFtZWRFbnRpdHknO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtmbXhOYW1lZEVudGl0eS5uYW1lfSBpcyBvZiB0eXBlICR7bmFtZX1gKTtcbiAgICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzaWduYXR1cmUgb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxuICogQHBhcmFtIHRleHQgQSBtZXRob2Qgb3IgYSBmdW5jdGlvbiBzb3VyY2UgY29kZVxuICogQHJldHVybnMgVGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kIG9yIHRoZSBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNpZ25hdHVyZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuZFNpZ25hdHVyZVRleHQgPSB0ZXh0LmluZGV4T2YoXCJ7XCIpO1xuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBlbmRTaWduYXR1cmVUZXh0KS50cmltKCk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGFuY2VzdG9yIG9mIGEgbm9kZVxuICogQHBhcmFtIG5vZGUgQSBub2RlXG4gKiBAcmV0dXJucyBUaGUgYW5jZXN0b3Igb2YgdGhlIG5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBbmNlc3Rvcihub2RlOiBJZGVudGlmaWVyKTogTm9kZSB7XG4gICAgbGV0IGFuY2VzdG9yOiBOb2RlIHwgdW5kZWZpbmVkO1xuICAgIGFuY2VzdG9yID0gbm9kZS5nZXRBbmNlc3RvcnMoKS5maW5kKGEgPT4gXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Db25zdHJ1Y3RvciB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuU291cmNlRmlsZSB8fCBcbiAgICAgICAgYS5nZXRLaW5kTmFtZSgpID09PSBcIkdldEFjY2Vzc29yXCIgfHwgXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJTZXRBY2Nlc3NvclwiIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcbiAgICBpZiAoIWFuY2VzdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3Igbm90IGZvdW5kIGZvciAke25vZGUuZ2V0VGV4dCgpfWApO1xuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3Jcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgYW5jZXN0b3Igb2YgYSB0cy1tb3JwaCBlbGVtZW50XG4gKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcbiAqIEByZXR1cm5zIFRoZSBhbmNlc3RvciBvZiB0aGUgdHMtbW9ycGggZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFR5cGVBbmNlc3RvcihlbGVtZW50OiBOb2RlKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGFuY2VzdG9yOiBOb2RlIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGVsZW1lbnQuZ2V0QW5jZXN0b3JzKCk7XG4gICAgY29uc29sZS5sb2coYEFuY2VzdG9ycyBjb3VudDogJHthbmNlc3RvcnMubGVuZ3RofWApO1xuXG4gICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZmluZChhID0+IHtcbiAgICAgICAgY29uc3Qga2luZCA9IGEuZ2V0S2luZCgpO1xuICAgICAgICBjb25zdCBraW5kTmFtZSA9IGEuZ2V0S2luZE5hbWUoKTtcbiAgICAgICAgcmV0dXJuIGtpbmQgPT09IFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb24gfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuQ29uc3RydWN0b3IgfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuTWV0aG9kU2lnbmF0dXJlIHx8XG4gICAgICAgICAgICAgICBraW5kID09PSBTeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uIHx8XG4gICAgICAgICAgICAgICBraW5kID09PSBTeW50YXhLaW5kLk1vZHVsZURlY2xhcmF0aW9uIHx8XG4gICAgICAgICAgICAgICBraW5kID09PSBTeW50YXhLaW5kLlNvdXJjZUZpbGUgfHxcbiAgICAgICAgICAgICAgIGtpbmROYW1lID09PSBcIkdldEFjY2Vzc29yXCIgfHxcbiAgICAgICAgICAgICAgIGtpbmROYW1lID09PSBcIlNldEFjY2Vzc29yXCIgfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbiB8fFxuICAgICAgICAgICAgICAga2luZCA9PT0gU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbjtcbiAgICB9KTtcblxuICAgIGlmICghYW5jZXN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlIGFuY2VzdG9yIG5vdCBmb3VuZCBmb3IgJHtlbGVtZW50LmdldEtpbmROYW1lKCl9YCk7XG4gICAgfSBcblxuICAgIHJldHVybiBhbmNlc3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0FyZUVxdWFsKGFycmF5MTogc3RyaW5nW10sIGFycmF5Mjogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoYXJyYXkxICYmIGFycmF5MiApIHtcbiAgICAgICAgcmV0dXJuIGFycmF5MS5sZW5ndGggPT09IGFycmF5Mi5sZW5ndGggJiYgYXJyYXkxLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBhcnJheTJbaW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUxhc3RCZXR3ZWVuVGFncyhpbnB1dDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0VGFnSW5kZXggPSBpbnB1dC5sYXN0SW5kZXhPZignPCcpO1xuICAgIFxuICAgIGlmIChsYXN0VGFnSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDsgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdGFncyBhcmUgZm91bmRcbiAgICB9XG5cbiAgICBjb25zdCBjbG9zaW5nVGFnSW5kZXggPSBpbnB1dC5pbmRleE9mKCc+JywgbGFzdFRhZ0luZGV4KTtcbiAgICBcbiAgICBpZiAoY2xvc2luZ1RhZ0luZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIGNsb3NpbmcgdGFnIGlzIGZvdW5kXG4gICAgfVxuXG4gICAgY29uc3QgYmVmb3JlVGFnID0gaW5wdXQuc3Vic3RyaW5nKDAsIGxhc3RUYWdJbmRleCArIDEpOyAvLyBJbmNsdWRlICc8J1xuICAgIGNvbnN0IGFmdGVyVGFnID0gaW5wdXQuc3Vic3RyaW5nKGNsb3NpbmdUYWdJbmRleCk7IC8vIEluY2x1ZGUgJz4nXG5cbiAgICByZXR1cm4gYmVmb3JlVGFnICsgcmVwbGFjZW1lbnQgKyBhZnRlclRhZztcbn1cbiJdfQ==