ts2famix 2.0.3 → 2.1.0-beta.1

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 (190) hide show
  1. package/.eslintrc.json +24 -24
  2. package/.vscode/settings.json +4 -0
  3. package/LICENSE +24 -24
  4. package/README.md +78 -78
  5. package/TODO +1 -0
  6. package/arwea-fix.json +1 -0
  7. package/bogus.ts +3 -0
  8. package/class-diagram.puml +792 -0
  9. package/debug.txt +13332 -0
  10. package/debuglog.txt +12073 -0
  11. package/dist/analyze.js +2 -2
  12. package/dist/analyze_functions/process_functions.js +84 -64
  13. package/dist/famix2puml.js +126 -0
  14. package/dist/famix_functions/EntityDictionary.js +865 -503
  15. package/dist/famix_functions/helpers_creation.js +1 -1
  16. package/dist/fqn.js +44 -11
  17. package/dist/getClasses-arrow-body.js +43 -0
  18. package/dist/lib/famix/famix_JSON_exporter.js +1 -1
  19. package/dist/lib/famix/famix_base_element.js +1 -1
  20. package/dist/lib/famix/famix_repository.js +57 -2
  21. package/dist/lib/famix/index.js +1 -1
  22. package/dist/lib/famix/model/famix/access.js +1 -1
  23. package/dist/lib/famix/model/famix/accessor.js +1 -1
  24. package/dist/lib/famix/model/famix/alias.js +1 -1
  25. package/dist/lib/famix/model/famix/arrow_function.js +1 -1
  26. package/dist/lib/famix/model/famix/behavioral_entity.js +1 -1
  27. package/dist/lib/famix/model/famix/class.js +1 -1
  28. package/dist/lib/famix/model/famix/comment.js +1 -1
  29. package/dist/lib/famix/model/famix/concretisation.js +1 -1
  30. package/dist/lib/famix/model/famix/container_entity.js +1 -1
  31. package/dist/lib/famix/model/famix/decorator.js +1 -1
  32. package/dist/lib/famix/model/famix/entity.js +1 -1
  33. package/dist/lib/famix/model/famix/enum.js +1 -1
  34. package/dist/lib/famix/model/famix/enum_value.js +1 -1
  35. package/dist/lib/famix/model/famix/function.js +1 -1
  36. package/dist/lib/famix/model/famix/import_clause.js +1 -1
  37. package/dist/lib/famix/model/famix/index.js +1 -1
  38. package/dist/lib/famix/model/famix/indexed_file_anchor.js +1 -1
  39. package/dist/lib/famix/model/famix/inheritance.js +1 -1
  40. package/dist/lib/famix/model/famix/interface.js +1 -1
  41. package/dist/lib/famix/model/famix/invocation.js +1 -1
  42. package/dist/lib/famix/model/famix/method.js +1 -1
  43. package/dist/lib/famix/model/famix/module.js +1 -1
  44. package/dist/lib/famix/model/famix/named_entity.js +1 -1
  45. package/dist/lib/famix/model/famix/parameter.js +1 -1
  46. package/dist/lib/famix/model/famix/parameter_concretisation.js +1 -1
  47. package/dist/lib/famix/model/famix/parameter_type.js +1 -1
  48. package/dist/lib/famix/model/famix/parametric_arrow_function.js +1 -1
  49. package/dist/lib/famix/model/famix/parametric_class.js +1 -1
  50. package/dist/lib/famix/model/famix/parametric_function.js +1 -1
  51. package/dist/lib/famix/model/famix/parametric_interface.js +1 -1
  52. package/dist/lib/famix/model/famix/parametric_method.js +1 -1
  53. package/dist/lib/famix/model/famix/primitive_type.js +1 -1
  54. package/dist/lib/famix/model/famix/property.js +1 -1
  55. package/dist/lib/famix/model/famix/reference.js +1 -1
  56. package/dist/lib/famix/model/famix/scoping_entity.js +1 -1
  57. package/dist/lib/famix/model/famix/script_entity.js +1 -1
  58. package/dist/lib/famix/model/famix/source_anchor.js +1 -1
  59. package/dist/lib/famix/model/famix/source_language.js +1 -1
  60. package/dist/lib/famix/model/famix/sourced_entity.js +1 -1
  61. package/dist/lib/famix/model/famix/structural_entity.js +1 -1
  62. package/dist/lib/famix/model/famix/type.js +1 -1
  63. package/dist/lib/famix/model/famix/variable.js +1 -1
  64. package/dist/lib/famix/src/famix_JSON_exporter.js +55 -0
  65. package/dist/lib/famix/src/famix_base_element.js +18 -0
  66. package/dist/lib/famix/src/famix_repository.js +224 -0
  67. package/dist/lib/famix/src/index.js +31 -0
  68. package/dist/lib/famix/src/model/famix/access.js +40 -0
  69. package/dist/lib/famix/src/model/famix/accessor.js +17 -0
  70. package/dist/lib/famix/src/model/famix/alias.js +33 -0
  71. package/dist/lib/famix/src/model/famix/arrowFunction.js +17 -0
  72. package/dist/lib/famix/src/model/famix/arrow_function.js +17 -0
  73. package/dist/lib/famix/src/model/famix/behavioral_entity.js +79 -0
  74. package/dist/lib/famix/src/model/famix/class.js +71 -0
  75. package/dist/lib/famix/src/model/famix/comment.js +39 -0
  76. package/dist/lib/famix/src/model/famix/concretisation.js +31 -0
  77. package/dist/lib/famix/src/model/famix/container_entity.js +126 -0
  78. package/dist/lib/famix/src/model/famix/decorator.js +32 -0
  79. package/dist/lib/famix/src/model/famix/entity.js +17 -0
  80. package/dist/lib/famix/src/model/famix/enum.js +31 -0
  81. package/dist/lib/famix/src/model/famix/enum_value.js +25 -0
  82. package/dist/lib/famix/src/model/famix/function.js +17 -0
  83. package/dist/lib/famix/src/model/famix/implicit_variable.js +17 -0
  84. package/dist/lib/famix/src/model/famix/import_clause.js +41 -0
  85. package/dist/lib/famix/src/model/famix/index.js +86 -0
  86. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +38 -0
  87. package/dist/lib/famix/src/model/famix/inheritance.js +33 -0
  88. package/dist/lib/famix/src/model/famix/interface.js +64 -0
  89. package/dist/lib/famix/src/model/famix/invocation.js +54 -0
  90. package/dist/lib/famix/src/model/famix/method.js +67 -0
  91. package/dist/lib/famix/src/model/famix/module.js +60 -0
  92. package/dist/lib/famix/src/model/famix/named_entity.js +78 -0
  93. package/dist/lib/famix/src/model/famix/parameter.js +25 -0
  94. package/dist/lib/famix/src/model/famix/parameterConcretisation.js +44 -0
  95. package/dist/lib/famix/src/model/famix/parameter_concretisation.js +44 -0
  96. package/dist/lib/famix/src/model/famix/parameter_type.js +45 -0
  97. package/dist/lib/famix/src/model/famix/parametricArrowFunction.js +29 -0
  98. package/dist/lib/famix/src/model/famix/parametric_arrow_function.js +31 -0
  99. package/dist/lib/famix/src/model/famix/parametric_class.js +44 -0
  100. package/dist/lib/famix/src/model/famix/parametric_function.js +31 -0
  101. package/dist/lib/famix/src/model/famix/parametric_interface.js +44 -0
  102. package/dist/lib/famix/src/model/famix/parametric_method.js +31 -0
  103. package/dist/lib/famix/src/model/famix/primitive_type.js +17 -0
  104. package/dist/lib/famix/src/model/famix/property.js +73 -0
  105. package/dist/lib/famix/src/model/famix/reference.js +33 -0
  106. package/dist/lib/famix/src/model/famix/scoping_entity.js +36 -0
  107. package/dist/lib/famix/src/model/famix/script_entity.js +29 -0
  108. package/dist/lib/famix/src/model/famix/source_anchor.js +27 -0
  109. package/dist/lib/famix/src/model/famix/source_language.js +35 -0
  110. package/dist/lib/famix/src/model/famix/sourced_entity.js +60 -0
  111. package/dist/lib/famix/src/model/famix/structural_entity.js +39 -0
  112. package/dist/lib/famix/src/model/famix/text_anchor.js +38 -0
  113. package/dist/lib/famix/src/model/famix/type.js +73 -0
  114. package/dist/lib/famix/src/model/famix/variable.js +24 -0
  115. package/dist/lib/ts-complex/cyclomatic-service.js +1 -1
  116. package/dist/refactorer/refactor-getter-setter.js +1 -1
  117. package/dist/ts2famix-cli-wrapper.js +1 -1
  118. package/dist/ts2famix-cli.js +1 -1
  119. package/doc-uml/famix-typescript-model.puml +607 -607
  120. package/eslint.config.mjs +28 -0
  121. package/fqn-model.json +1 -0
  122. package/iterateGenericTypes.ts +69 -0
  123. package/out/class-diagram/class-diagram.svg +1 -0
  124. package/package.json +70 -66
  125. package/sample.json +1 -0
  126. package/sample.ts +1 -0
  127. package/src/analyze.ts +120 -120
  128. package/src/analyze_functions/process_functions.ts +1040 -1019
  129. package/src/famix_functions/EntityDictionary.ts +2016 -1593
  130. package/src/famix_functions/helpers_creation.ts +135 -135
  131. package/src/fqn.ts +50 -16
  132. package/src/generate_uml.sh +20 -20
  133. package/src/lib/famix/License.md +22 -22
  134. package/src/lib/famix/famix_JSON_exporter.ts +56 -56
  135. package/src/lib/famix/famix_base_element.ts +22 -22
  136. package/src/lib/famix/famix_repository.ts +278 -243
  137. package/src/lib/famix/index.ts +8 -8
  138. package/src/lib/famix/model/famix/access.ts +50 -50
  139. package/src/lib/famix/model/famix/accessor.ts +15 -15
  140. package/src/lib/famix/model/famix/alias.ts +39 -39
  141. package/src/lib/famix/model/famix/arrow_function.ts +15 -15
  142. package/src/lib/famix/model/famix/behavioral_entity.ts +97 -97
  143. package/src/lib/famix/model/famix/class.ts +85 -85
  144. package/src/lib/famix/model/famix/comment.ts +47 -47
  145. package/src/lib/famix/model/famix/concretisation.ts +40 -40
  146. package/src/lib/famix/model/famix/container_entity.ts +160 -160
  147. package/src/lib/famix/model/famix/decorator.ts +37 -37
  148. package/src/lib/famix/model/famix/entity.ts +15 -15
  149. package/src/lib/famix/model/famix/enum.ts +30 -30
  150. package/src/lib/famix/model/famix/enum_value.ts +28 -28
  151. package/src/lib/famix/model/famix/function.ts +15 -15
  152. package/src/lib/famix/model/famix/import_clause.ts +51 -51
  153. package/src/lib/famix/model/famix/index.ts +41 -41
  154. package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -46
  155. package/src/lib/famix/model/famix/inheritance.ts +40 -40
  156. package/src/lib/famix/model/famix/interface.ts +75 -75
  157. package/src/lib/famix/model/famix/invocation.ts +65 -65
  158. package/src/lib/famix/model/famix/method.ts +89 -89
  159. package/src/lib/famix/model/famix/module.ts +71 -71
  160. package/src/lib/famix/model/famix/named_entity.ts +95 -95
  161. package/src/lib/famix/model/famix/parameter.ts +28 -28
  162. package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -51
  163. package/src/lib/famix/model/famix/parameter_type.ts +58 -58
  164. package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -32
  165. package/src/lib/famix/model/famix/parametric_class.ts +49 -49
  166. package/src/lib/famix/model/famix/parametric_function.ts +32 -32
  167. package/src/lib/famix/model/famix/parametric_interface.ts +49 -49
  168. package/src/lib/famix/model/famix/parametric_method.ts +32 -32
  169. package/src/lib/famix/model/famix/primitive_type.ts +15 -15
  170. package/src/lib/famix/model/famix/property.ts +94 -94
  171. package/src/lib/famix/model/famix/reference.ts +40 -40
  172. package/src/lib/famix/model/famix/scoping_entity.ts +35 -35
  173. package/src/lib/famix/model/famix/script_entity.ts +34 -34
  174. package/src/lib/famix/model/famix/source_anchor.ts +30 -30
  175. package/src/lib/famix/model/famix/source_language.ts +35 -35
  176. package/src/lib/famix/model/famix/sourced_entity.ts +70 -70
  177. package/src/lib/famix/model/famix/structural_entity.ts +43 -43
  178. package/src/lib/famix/model/famix/type.ts +87 -87
  179. package/src/lib/famix/model/famix/variable.ts +27 -27
  180. package/src/lib/famix/package.json +28 -28
  181. package/src/lib/ts-complex/cyclomatic-service.ts +83 -83
  182. package/src/refactorer/refactor-getter-setter.ts +140 -140
  183. package/src/ts2famix-cli-wrapper.ts +21 -21
  184. package/src/ts2famix-cli.ts +60 -60
  185. package/stats.txt +3091 -0
  186. package/tabby-debug-output.txt +19433 -0
  187. package/ts2famix.log +22656 -0
  188. package/tsconfig.check-tests.json +14 -14
  189. package/tsconfig.json +72 -72
  190. package/validate-references.js +103 -0
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
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
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const fs = __importStar(require("fs"));
30
+ const yargs_1 = __importDefault(require("yargs"));
31
+ const argv = yargs_1.default
32
+ .example('ts-node src/famix2puml.ts -i JSONModels/projectName.json -o PUMLModels/projectName.puml', 'creates a PlantUML class diagram from a JSON-format model of a typescript project')
33
+ .alias('i', 'input')
34
+ .nargs('i', 1)
35
+ .alias('o', 'output')
36
+ .nargs('o', 1)
37
+ .demandOption('input').demandOption('output').parseSync();
38
+ const INHERITANCE_LINK_COLOR = 'blue';
39
+ const jsonFileName = argv.input;
40
+ const pumlFileName = argv.output.substring(argv.output.indexOf("/") + 1, argv.output.lastIndexOf('.'));
41
+ const parsedModel = JSON.parse(fs.readFileSync(jsonFileName, 'utf-8'));
42
+ const classNameMap = new Map();
43
+ const associations = new Array();
44
+ // maps all class names to their id
45
+ parsedModel.forEach(element => {
46
+ // map has id as key and unique (plantuml) class name
47
+ classNameMap.set(element.id, uniqueElementName(element));
48
+ const nameWithoutPrefix = element.FM3.split('.')[1];
49
+ // special case association
50
+ if (nameWithoutPrefix.endsWith('Inheritance')) {
51
+ const subclass = element['subclass'].ref;
52
+ const superclass = element['superclass'].ref;
53
+ associations.push({ from: subclass, to: superclass, name: nameWithoutPrefix });
54
+ }
55
+ });
56
+ // generates plantuml
57
+ let plantUMLOutString = `@startuml ${pumlFileName}
58
+ skinparam style strictuml
59
+ title Object diagram for ${jsonFileName}
60
+ `;
61
+ parsedModel.forEach(element => {
62
+ plantUMLOutString += `${toPlantUML(element)}\n`;
63
+ });
64
+ // creates associations
65
+ associations.forEach(association => {
66
+ // inheritance is a special case, show it in UML even though it doesn't make 100% sense in object diagrams
67
+ const isInheritance = association.name.startsWith('Inheritance');
68
+ if (isInheritance) {
69
+ plantUMLOutString += `${classNameMap.get(association.from)} --|> ${classNameMap.get(association.to)} #line:${INHERITANCE_LINK_COLOR}\n`;
70
+ }
71
+ else {
72
+ plantUMLOutString += `${classNameMap.get(association.from)} ..> "${association.name}" ${classNameMap.get(association.to)}\n`;
73
+ }
74
+ });
75
+ plantUMLOutString += '@enduml';
76
+ // writes to output file
77
+ fs.writeFile(argv.output, plantUMLOutString, (err) => {
78
+ if (err) {
79
+ throw err;
80
+ }
81
+ });
82
+ function uniqueElementName(element) {
83
+ return `${element.FM3}${element.id}`;
84
+ }
85
+ function toPlantUML(element) {
86
+ let plantUMLString = '';
87
+ const optionalName = element.name || '';
88
+ const nameWithoutPrefix = element.FM3.split('.')[1];
89
+ plantUMLString += `object "${optionalName}:${nameWithoutPrefix}" as ${uniqueElementName(element)} {\n`;
90
+ plantUMLString += `id = ${element.id}\n`;
91
+ plantUMLString += propertiesToPlantUML(element);
92
+ plantUMLString += '}\n';
93
+ return plantUMLString;
94
+ }
95
+ function propertiesToPlantUML(element) {
96
+ let plantUMLString = '';
97
+ for (const property in element) {
98
+ const attribute = element[property];
99
+ const isOneToManyReference = typeof attribute !== 'string' && attribute.length; // array but not a string
100
+ switch (property) {
101
+ // ignores these properties
102
+ case 'subclass':
103
+ case 'superclass':
104
+ case 'FM3':
105
+ case 'id':
106
+ case 'name':
107
+ break;
108
+ default:
109
+ if (isOneToManyReference) {
110
+ attribute.forEach((composite, index) => {
111
+ associations.push({ from: element.id, to: composite.ref, name: `${property}[${index}]` });
112
+ });
113
+ }
114
+ else if (typeof attribute === 'object') {
115
+ associations.push({ from: element.id, to: attribute.ref, name: property });
116
+ }
117
+ else { // typeof string, boolean, number, etc
118
+ // treats it as a simple attribute
119
+ plantUMLString += `${property} = ${element[property]}\n`;
120
+ }
121
+ break;
122
+ }
123
+ }
124
+ return plantUMLString;
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaXgycHVtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYW1peDJwdW1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsa0RBQTBCO0FBRTFCLE1BQU0sSUFBSSxHQUFHLGVBQUs7S0FDYixPQUFPLENBQUMseUZBQXlGLEVBQUUsbUZBQW1GLENBQUM7S0FDdkwsS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7S0FDbkIsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDYixLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUNwQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUNiLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFOUQsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLENBQUM7QUFldEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQWUsQ0FBQztBQUMxQyxNQUFNLFlBQVksR0FBSSxJQUFJLENBQUMsTUFBaUIsQ0FBQyxTQUFTLENBQUUsSUFBSSxDQUFDLE1BQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFDLENBQUMsRUFBRyxJQUFJLENBQUMsTUFBaUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6SSxNQUFNLFdBQVcsR0FBa0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxFQUFlLENBQUM7QUFFOUMsbUNBQW1DO0FBQ25DLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVB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LGtDQUFrQztvQkFDbEMsY0FBYyxJQUFJLEdBQUcsUUFBUSxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUM3RCxDQUFDO2dCQUVELE1BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sY0FBYyxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XHJcblxyXG5jb25zdCBhcmd2ID0geWFyZ3NcclxuICAgIC5leGFtcGxlKCd0cy1ub2RlIHNyYy9mYW1peDJwdW1sLnRzIC1pIEpTT05Nb2RlbHMvcHJvamVjdE5hbWUuanNvbiAtbyBQVU1MTW9kZWxzL3Byb2plY3ROYW1lLnB1bWwnLCAnY3JlYXRlcyBhIFBsYW50VU1MIGNsYXNzIGRpYWdyYW0gZnJvbSBhIEpTT04tZm9ybWF0IG1vZGVsIG9mIGEgdHlwZXNjcmlwdCBwcm9qZWN0JylcclxuICAgIC5hbGlhcygnaScsICdpbnB1dCcpXHJcbiAgICAubmFyZ3MoJ2knLCAxKVxyXG4gICAgLmFsaWFzKCdvJywgJ291dHB1dCcpXHJcbiAgICAubmFyZ3MoJ28nLCAxKVxyXG4gICAgLmRlbWFuZE9wdGlvbignaW5wdXQnKS5kZW1hbmRPcHRpb24oJ291dHB1dCcpLnBhcnNlU3luYygpO1xyXG5cclxuY29uc3QgSU5IRVJJVEFOQ0VfTElOS19DT0xPUiA9ICdibHVlJztcclxuXHJcbi8vIGFwcHJveGltYXRpb24gZm9yIGNvZGUgY29tcGxldGlvblxyXG5pbnRlcmZhY2UgRmFtaXhUeXBlU2NyaXB0RWxlbWVudCB7XHJcbiAgICBGTTM6IHN0cmluZ1xyXG4gICAgbmFtZTogc3RyaW5nXHJcbiAgICBpZD86IHN0cmluZ1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQXNzb2NpYXRpb24ge1xyXG4gICAgZnJvbTogc3RyaW5nO1xyXG4gICAgdG86IHN0cmluZztcclxuICAgIG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QganNvbkZpbGVOYW1lID0gYXJndi5pbnB1dCBhcyBzdHJpbmc7XHJcbmNvbnN0IHB1bWxGaWxlTmFtZSA9IChhcmd2Lm91dHB1dCBhcyBzdHJpbmcpLnN1YnN0cmluZygoYXJndi5vdXRwdXQgYXMgc3RyaW5nKS5pbmRleE9mKFwiL1wiKSsxLCAoYXJndi5vdXRwdXQgYXMgc3RyaW5nKS5sYXN0SW5kZXhPZignLicpKTtcclxuY29uc3QgcGFyc2VkTW9kZWw6IEFycmF5PEZhbWl4VHlwZVNjcmlwdEVsZW1lbnQ+ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVOYW1lLCAndXRmLTgnKSk7XHJcbmNvbnN0IGNsYXNzTmFtZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbmNvbnN0IGFzc29jaWF0aW9ucyA9IG5ldyBBcnJheTxBc3NvY2lhdGlvbj4oKTtcclxuXHJcbi8vIG1hcHMgYWxsIGNsYXNzIG5hbWVzIHRvIHRoZWlyIGlkXHJcbnBhcnNlZE1vZGVsLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAvLyBtYXAgaGFzIGlkIGFzIGtleSBhbmQgdW5pcXVlIChwbGFudHVtbCkgY2xhc3MgbmFtZVxyXG4gICAgY2xhc3NOYW1lTWFwLnNldChlbGVtZW50LmlkLCB1bmlxdWVFbGVtZW50TmFtZShlbGVtZW50KSk7XHJcbiAgICBjb25zdCBuYW1lV2l0aG91dFByZWZpeCA9IGVsZW1lbnQuRk0zLnNwbGl0KCcuJylbMV07XHJcbiAgICAvLyBzcGVjaWFsIGNhc2UgYXNzb2NpYXRpb25cclxuICAgIGlmIChuYW1lV2l0aG91dFByZWZpeC5lbmRzV2l0aCgnSW5oZXJpdGFuY2UnKSkge1xyXG4gICAgICAgIGNvbnN0IHN1YmNsYXNzID0gZWxlbWVudFsnc3ViY2xhc3MnXS5yZWY7XHJcbiAgICAgICAgY29uc3Qgc3VwZXJjbGFzcyA9IGVsZW1lbnRbJ3N1cGVyY2xhc3MnXS5yZWY7XHJcbiAgICAgICAgYXNzb2NpYXRpb25zLnB1c2goeyBmcm9tOiBzdWJjbGFzcywgdG86IHN1cGVyY2xhc3MsIG5hbWU6IG5hbWVXaXRob3V0UHJlZml4IH0pO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbi8vIGdlbmVyYXRlcyBwbGFudHVtbFxyXG5sZXQgcGxhbnRVTUxPdXRTdHJpbmcgPSBgQHN0YXJ0dW1sICR7cHVtbEZpbGVOYW1lfVxyXG5za2lucGFyYW0gc3R5bGUgc3RyaWN0dW1sXHJcbnRpdGxlIE9iamVjdCBkaWFncmFtIGZvciAke2pzb25GaWxlTmFtZX1cclxuYDtcclxucGFyc2VkTW9kZWwuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgIHBsYW50VU1MT3V0U3RyaW5nICs9IGAke3RvUGxhbnRVTUwoZWxlbWVudCl9XFxuYDtcclxufSk7XHJcblxyXG4vLyBjcmVhdGVzIGFzc29jaWF0aW9uc1xyXG5hc3NvY2lhdGlvbnMuZm9yRWFjaChhc3NvY2lhdGlvbiA9PiB7XHJcbiAgICAvLyBpbmhlcml0YW5jZSBpcyBhIHNwZWNpYWwgY2FzZSwgc2hvdyBpdCBpbiBVTUwgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBtYWtlIDEwMCUgc2Vuc2UgaW4gb2JqZWN0IGRpYWdyYW1zXHJcbiAgICBjb25zdCBpc0luaGVyaXRhbmNlID0gYXNzb2NpYXRpb24ubmFtZS5zdGFydHNXaXRoKCdJbmhlcml0YW5jZScpO1xyXG4gICAgaWYgKGlzSW5oZXJpdGFuY2UpIHtcclxuICAgICAgICBwbGFudFVNTE91dFN0cmluZyArPSBgJHtjbGFzc05hbWVNYXAuZ2V0KGFzc29jaWF0aW9uLmZyb20pfSAtLXw+ICR7Y2xhc3NOYW1lTWFwLmdldChhc3NvY2lhdGlvbi50byl9ICNsaW5lOiR7SU5IRVJJVEFOQ0VfTElOS19DT0xPUn1cXG5gO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBwbGFudFVNTE91dFN0cmluZyArPSBgJHtjbGFzc05hbWVNYXAuZ2V0KGFzc29jaWF0aW9uLmZyb20pfSAuLj4gXCIke2Fzc29jaWF0aW9uLm5hbWV9XCIgJHtjbGFzc05hbWVNYXAuZ2V0KGFzc29jaWF0aW9uLnRvKX1cXG5gO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbnBsYW50VU1MT3V0U3RyaW5nICs9ICdAZW5kdW1sJztcclxuXHJcbi8vIHdyaXRlcyB0byBvdXRwdXQgZmlsZVxyXG5mcy53cml0ZUZpbGUoYXJndi5vdXRwdXQgYXMgc3RyaW5nLCBwbGFudFVNTE91dFN0cmluZywgKGVycikgPT4ge1xyXG4gICAgaWYgKGVycikgeyB0aHJvdyBlcnI7IH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiB1bmlxdWVFbGVtZW50TmFtZShlbGVtZW50OiBGYW1peFR5cGVTY3JpcHRFbGVtZW50KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtlbGVtZW50LkZNM30ke2VsZW1lbnQuaWR9YDtcclxufVxyXG5cclxuZnVuY3Rpb24gdG9QbGFudFVNTChlbGVtZW50OiBGYW1peFR5cGVTY3JpcHRFbGVtZW50KSB7XHJcbiAgICBsZXQgcGxhbnRVTUxTdHJpbmcgPSAnJztcclxuICAgIGNvbnN0IG9wdGlvbmFsTmFtZSA9IGVsZW1lbnQubmFtZSB8fCAnJztcclxuICAgIGNvbnN0IG5hbWVXaXRob3V0UHJlZml4ID0gZWxlbWVudC5GTTMuc3BsaXQoJy4nKVsxXTtcclxuICAgIHBsYW50VU1MU3RyaW5nICs9IGBvYmplY3QgXCIke29wdGlvbmFsTmFtZX06JHtuYW1lV2l0aG91dFByZWZpeH1cIiBhcyAke3VuaXF1ZUVsZW1lbnROYW1lKGVsZW1lbnQpfSB7XFxuYDtcclxuICAgIHBsYW50VU1MU3RyaW5nICs9IGBpZCA9ICR7ZWxlbWVudC5pZH1cXG5gO1xyXG4gICAgcGxhbnRVTUxTdHJpbmcgKz0gcHJvcGVydGllc1RvUGxhbnRVTUwoZWxlbWVudCk7XHJcbiAgICBwbGFudFVNTFN0cmluZyArPSAnfVxcbic7XHJcbiAgICByZXR1cm4gcGxhbnRVTUxTdHJpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb3BlcnRpZXNUb1BsYW50VU1MKGVsZW1lbnQ6IEZhbWl4VHlwZVNjcmlwdEVsZW1lbnQpIHtcclxuICAgIGxldCBwbGFudFVNTFN0cmluZyA9ICcnO1xyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWxlbWVudFtwcm9wZXJ0eV07XHJcbiAgICAgICAgY29uc3QgaXNPbmVUb01hbnlSZWZlcmVuY2UgPSB0eXBlb2YgYXR0cmlidXRlICE9PSAnc3RyaW5nJyAmJiBhdHRyaWJ1dGUubGVuZ3RoOyAvLyBhcnJheSBidXQgbm90IGEgc3RyaW5nXHJcblxyXG4gICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlcyB0aGVzZSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGNhc2UgJ3N1YmNsYXNzJzpcclxuICAgICAgICAgICAgY2FzZSAnc3VwZXJjbGFzcyc6XHJcbiAgICAgICAgICAgIGNhc2UgJ0ZNMyc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2lkJzpcclxuICAgICAgICAgICAgY2FzZSAnbmFtZSc6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNPbmVUb01hbnlSZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZm9yRWFjaCgoY29tcG9zaXRlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGZyb206IGVsZW1lbnQuaWQsIHRvOiBjb21wb3NpdGUucmVmLCBuYW1lOiBgJHtwcm9wZXJ0eX1bJHtpbmRleH1dYCB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGZyb206IGVsZW1lbnQuaWQsIHRvOiBhdHRyaWJ1dGUucmVmLCBuYW1lOiBwcm9wZXJ0eSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB0eXBlb2Ygc3RyaW5nLCBib29sZWFuLCBudW1iZXIsIGV0Y1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyZWF0cyBpdCBhcyBhIHNpbXBsZSBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgICAgICAgICBwbGFudFVNTFN0cmluZyArPSBgJHtwcm9wZXJ0eX0gPSAke2VsZW1lbnRbcHJvcGVydHldfVxcbmA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBsYW50VU1MU3RyaW5nO1xyXG59XHJcbiJdfQ==