@skyux/docs-tools 5.0.0-beta.7 → 6.0.0-beta.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 (183) hide show
  1. package/README.md +8 -0
  2. package/esm2020/docs-tools.module.mjs +40 -0
  3. package/esm2020/modules/anatomy/anatomy-item.component.mjs +17 -0
  4. package/esm2020/modules/anatomy/anatomy.component.mjs +24 -0
  5. package/esm2020/modules/anatomy/anatomy.module.mjs +21 -0
  6. package/{esm2015/modules/code-examples/code-example-module-dependencies.js → esm2020/modules/code-examples/code-example-module-dependencies.mjs} +0 -0
  7. package/{esm2015/modules/code-examples/code-example-theme.js → esm2020/modules/code-examples/code-example-theme.mjs} +1 -1
  8. package/esm2020/modules/code-examples/code-example.component.mjs +68 -0
  9. package/esm2020/modules/code-examples/code-example.mjs +2 -0
  10. package/esm2020/modules/code-examples/code-examples-editor.service.mjs +292 -0
  11. package/esm2020/modules/code-examples/code-examples.component.mjs +97 -0
  12. package/esm2020/modules/code-examples/code-examples.module.mjs +43 -0
  13. package/{esm2015/modules/demo/demo-content-alignment.js → esm2020/modules/demo/demo-content-alignment.mjs} +0 -0
  14. package/{esm2015/modules/demo/demo-control-panel-change.js → esm2020/modules/demo/demo-control-panel-change.mjs} +0 -0
  15. package/esm2020/modules/demo/demo-control-panel-checkbox.component.mjs +80 -0
  16. package/{esm2015/modules/demo/demo-control-panel-radio-choice.js → esm2020/modules/demo/demo-control-panel-radio-choice.mjs} +1 -1
  17. package/esm2020/modules/demo/demo-control-panel-radio-group.component.mjs +75 -0
  18. package/esm2020/modules/demo/demo-control-panel-section.component.mjs +22 -0
  19. package/esm2020/modules/demo/demo-control-panel.component.mjs +85 -0
  20. package/esm2020/modules/demo/demo.component.mjs +53 -0
  21. package/esm2020/modules/demo/demo.module.mjs +69 -0
  22. package/esm2020/modules/demo-page/demo-page-dom-adapter.service.mjs +75 -0
  23. package/esm2020/modules/demo-page/demo-page-module-info.component.mjs +14 -0
  24. package/esm2020/modules/demo-page/demo-page-section.component.mjs +43 -0
  25. package/esm2020/modules/demo-page/demo-page-summary.component.mjs +21 -0
  26. package/esm2020/modules/demo-page/demo-page-title.service.mjs +28 -0
  27. package/esm2020/modules/demo-page/demo-page-type-definitions.component.mjs +35 -0
  28. package/esm2020/modules/demo-page/demo-page.component.mjs +134 -0
  29. package/esm2020/modules/demo-page/demo-page.module.mjs +88 -0
  30. package/esm2020/modules/design-guidelines/design-guideline-thumbnail.component.mjs +27 -0
  31. package/esm2020/modules/design-guidelines/design-guideline.component.mjs +33 -0
  32. package/esm2020/modules/design-guidelines/design-guidelines.component.mjs +11 -0
  33. package/esm2020/modules/design-guidelines/design-guidelines.module.mjs +34 -0
  34. package/esm2020/modules/heading-anchor/heading-anchor.component.mjs +21 -0
  35. package/esm2020/modules/heading-anchor/heading-anchor.module.mjs +20 -0
  36. package/esm2020/modules/markdown/markdown.module.mjs +17 -0
  37. package/esm2020/modules/markdown/markdown.pipe.mjs +20 -0
  38. package/esm2020/modules/module-info/module-info.component.mjs +77 -0
  39. package/esm2020/modules/module-info/module-info.module.mjs +42 -0
  40. package/esm2020/modules/safe-html/safe-html.component.mjs +20 -0
  41. package/esm2020/modules/safe-html/safe-html.module.mjs +18 -0
  42. package/{esm2015/modules/shared/docs-tools-component-info.js → esm2020/modules/shared/docs-tools-component-info.mjs} +0 -0
  43. package/{esm2015/modules/shared/docs-tools-options.js → esm2020/modules/shared/docs-tools-options.mjs} +1 -1
  44. package/esm2020/modules/shared/docs-tools-supportal.service.mjs +23 -0
  45. package/esm2020/modules/shared/sky-docs-tools-resources.module.mjs +53 -0
  46. package/{esm2015/modules/source-code/source-code-file.js → esm2020/modules/source-code/source-code-file.mjs} +1 -1
  47. package/esm2020/modules/source-code/source-code-provider.mjs +13 -0
  48. package/esm2020/modules/source-code/source-code.service.mjs +42 -0
  49. package/esm2020/modules/thumbnail/thumbnail.component.mjs +28 -0
  50. package/esm2020/modules/thumbnail/thumbnail.module.mjs +19 -0
  51. package/{esm2015/modules/type-definitions/anchor-link-service-config.js → esm2020/modules/type-definitions/anchor-link-service-config.mjs} +0 -0
  52. package/{esm2015/modules/type-definitions/anchor-link-service-format.js → esm2020/modules/type-definitions/anchor-link-service-format.mjs} +0 -0
  53. package/{esm2015/modules/type-definitions/anchor-link.js → esm2020/modules/type-definitions/anchor-link.mjs} +0 -0
  54. package/esm2020/modules/type-definitions/anchor-link.service.mjs +106 -0
  55. package/esm2020/modules/type-definitions/call-signature-definition.component.mjs +45 -0
  56. package/esm2020/modules/type-definitions/call-signature-definition.mjs +2 -0
  57. package/esm2020/modules/type-definitions/class-definition.component.mjs +20 -0
  58. package/esm2020/modules/type-definitions/class-definition.mjs +2 -0
  59. package/esm2020/modules/type-definitions/comment-tags.mjs +2 -0
  60. package/esm2020/modules/type-definitions/directive-definition.component.mjs +20 -0
  61. package/esm2020/modules/type-definitions/directive-definition.mjs +2 -0
  62. package/esm2020/modules/type-definitions/entry-child-definition.mjs +2 -0
  63. package/{esm2015/modules/type-definitions/entry-definition.js → esm2020/modules/type-definitions/entry-definition.mjs} +1 -1
  64. package/esm2020/modules/type-definitions/enumeration-definition.component.mjs +19 -0
  65. package/esm2020/modules/type-definitions/enumeration-definition.mjs +2 -0
  66. package/{esm2015/modules/type-definitions/enumeration-member-definition.js → esm2020/modules/type-definitions/enumeration-member-definition.mjs} +1 -1
  67. package/esm2020/modules/type-definitions/index-signature-definition.mjs +2 -0
  68. package/esm2020/modules/type-definitions/interface-definition.component.mjs +36 -0
  69. package/esm2020/modules/type-definitions/interface-definition.mjs +2 -0
  70. package/esm2020/modules/type-definitions/interface-property-definition.mjs +2 -0
  71. package/esm2020/modules/type-definitions/method-definition.mjs +2 -0
  72. package/esm2020/modules/type-definitions/method-definitions.component.mjs +56 -0
  73. package/esm2020/modules/type-definitions/parameter-definition.mjs +2 -0
  74. package/esm2020/modules/type-definitions/pipe-definition.component.mjs +20 -0
  75. package/esm2020/modules/type-definitions/pipe-definition.mjs +2 -0
  76. package/{esm2015/modules/type-definitions/property-decorator.js → esm2020/modules/type-definitions/property-decorator.mjs} +1 -1
  77. package/esm2020/modules/type-definitions/property-definition.mjs +2 -0
  78. package/esm2020/modules/type-definitions/property-definitions.component.mjs +62 -0
  79. package/esm2020/modules/type-definitions/type-alias-definition.component.mjs +36 -0
  80. package/esm2020/modules/type-definitions/type-alias-definition.mjs +2 -0
  81. package/esm2020/modules/type-definitions/type-anchor-links.pipe.mjs +27 -0
  82. package/esm2020/modules/type-definitions/type-definition.mjs +2 -0
  83. package/esm2020/modules/type-definitions/type-definitions-format.service.mjs +242 -0
  84. package/esm2020/modules/type-definitions/type-definitions-provider.mjs +10 -0
  85. package/esm2020/modules/type-definitions/type-definitions.mjs +2 -0
  86. package/esm2020/modules/type-definitions/type-definitions.module.mjs +102 -0
  87. package/esm2020/modules/type-definitions/type-definitions.service.mjs +103 -0
  88. package/esm2020/modules/type-definitions/type-parameter-definition.mjs +2 -0
  89. package/esm2020/modules/type-definitions/typedoc-adapter.service.mjs +521 -0
  90. package/esm2020/modules/type-definitions/typedoc-types.mjs +2 -0
  91. package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
  92. package/{esm2015/skyux-docs-tools.js → esm2020/skyux-docs-tools.mjs} +0 -0
  93. package/fesm2015/skyux-docs-tools.mjs +3086 -0
  94. package/fesm2015/skyux-docs-tools.mjs.map +1 -0
  95. package/fesm2020/skyux-docs-tools.mjs +3070 -0
  96. package/fesm2020/skyux-docs-tools.mjs.map +1 -0
  97. package/modules/code-examples/code-example.d.ts +1 -0
  98. package/modules/code-examples/code-examples.component.d.ts +2 -1
  99. package/modules/demo-page/demo-page-type-definitions.component.d.ts +2 -1
  100. package/modules/demo-page/demo-page.component.d.ts +5 -1
  101. package/modules/type-definitions/type-definitions.service.d.ts +1 -1
  102. package/modules/type-definitions/typedoc-types.d.ts +5 -3
  103. package/package.json +35 -22
  104. package/bundles/skyux-docs-tools.umd.js +0 -3686
  105. package/bundles/skyux-docs-tools.umd.js.map +0 -1
  106. package/documentation.json +0 -10696
  107. package/esm2015/docs-tools.module.js +0 -40
  108. package/esm2015/modules/anatomy/anatomy-item.component.js +0 -22
  109. package/esm2015/modules/anatomy/anatomy.component.js +0 -29
  110. package/esm2015/modules/anatomy/anatomy.module.js +0 -39
  111. package/esm2015/modules/code-examples/code-example.component.js +0 -68
  112. package/esm2015/modules/code-examples/code-example.js +0 -2
  113. package/esm2015/modules/code-examples/code-examples-editor.service.js +0 -295
  114. package/esm2015/modules/code-examples/code-examples.component.js +0 -98
  115. package/esm2015/modules/code-examples/code-examples.module.js +0 -51
  116. package/esm2015/modules/demo/demo-control-panel-checkbox.component.js +0 -84
  117. package/esm2015/modules/demo/demo-control-panel-radio-group.component.js +0 -80
  118. package/esm2015/modules/demo/demo-control-panel-section.component.js +0 -27
  119. package/esm2015/modules/demo/demo-control-panel.component.js +0 -86
  120. package/esm2015/modules/demo/demo.component.js +0 -58
  121. package/esm2015/modules/demo/demo.module.js +0 -69
  122. package/esm2015/modules/demo-page/demo-page-dom-adapter.service.js +0 -75
  123. package/esm2015/modules/demo-page/demo-page-module-info.component.js +0 -14
  124. package/esm2015/modules/demo-page/demo-page-section.component.js +0 -47
  125. package/esm2015/modules/demo-page/demo-page-summary.component.js +0 -26
  126. package/esm2015/modules/demo-page/demo-page-title.service.js +0 -28
  127. package/esm2015/modules/demo-page/demo-page-type-definitions.component.js +0 -37
  128. package/esm2015/modules/demo-page/demo-page.component.js +0 -140
  129. package/esm2015/modules/demo-page/demo-page.module.js +0 -88
  130. package/esm2015/modules/design-guidelines/design-guideline-thumbnail.component.js +0 -32
  131. package/esm2015/modules/design-guidelines/design-guideline.component.js +0 -38
  132. package/esm2015/modules/design-guidelines/design-guidelines.component.js +0 -15
  133. package/esm2015/modules/design-guidelines/design-guidelines.module.js +0 -44
  134. package/esm2015/modules/heading-anchor/heading-anchor.component.js +0 -26
  135. package/esm2015/modules/heading-anchor/heading-anchor.module.js +0 -34
  136. package/esm2015/modules/markdown/markdown.module.js +0 -25
  137. package/esm2015/modules/markdown/markdown.pipe.js +0 -20
  138. package/esm2015/modules/module-info/module-info.component.js +0 -82
  139. package/esm2015/modules/module-info/module-info.module.js +0 -46
  140. package/esm2015/modules/safe-html/safe-html.component.js +0 -24
  141. package/esm2015/modules/safe-html/safe-html.module.js +0 -26
  142. package/esm2015/modules/shared/docs-tools-supportal.service.js +0 -23
  143. package/esm2015/modules/shared/sky-docs-tools-resources.module.js +0 -41
  144. package/esm2015/modules/source-code/source-code-provider.js +0 -13
  145. package/esm2015/modules/source-code/source-code.service.js +0 -42
  146. package/esm2015/modules/thumbnail/thumbnail.component.js +0 -33
  147. package/esm2015/modules/thumbnail/thumbnail.module.js +0 -30
  148. package/esm2015/modules/type-definitions/anchor-link.service.js +0 -98
  149. package/esm2015/modules/type-definitions/call-signature-definition.component.js +0 -51
  150. package/esm2015/modules/type-definitions/call-signature-definition.js +0 -2
  151. package/esm2015/modules/type-definitions/class-definition.component.js +0 -25
  152. package/esm2015/modules/type-definitions/class-definition.js +0 -2
  153. package/esm2015/modules/type-definitions/comment-tags.js +0 -2
  154. package/esm2015/modules/type-definitions/directive-definition.component.js +0 -25
  155. package/esm2015/modules/type-definitions/directive-definition.js +0 -2
  156. package/esm2015/modules/type-definitions/entry-child-definition.js +0 -2
  157. package/esm2015/modules/type-definitions/enumeration-definition.component.js +0 -23
  158. package/esm2015/modules/type-definitions/enumeration-definition.js +0 -2
  159. package/esm2015/modules/type-definitions/index-signature-definition.js +0 -2
  160. package/esm2015/modules/type-definitions/interface-definition.component.js +0 -38
  161. package/esm2015/modules/type-definitions/interface-definition.js +0 -2
  162. package/esm2015/modules/type-definitions/interface-property-definition.js +0 -2
  163. package/esm2015/modules/type-definitions/method-definition.js +0 -2
  164. package/esm2015/modules/type-definitions/method-definitions.component.js +0 -62
  165. package/esm2015/modules/type-definitions/parameter-definition.js +0 -2
  166. package/esm2015/modules/type-definitions/pipe-definition.component.js +0 -25
  167. package/esm2015/modules/type-definitions/pipe-definition.js +0 -2
  168. package/esm2015/modules/type-definitions/property-definition.js +0 -2
  169. package/esm2015/modules/type-definitions/property-definitions.component.js +0 -69
  170. package/esm2015/modules/type-definitions/type-alias-definition.component.js +0 -39
  171. package/esm2015/modules/type-definitions/type-alias-definition.js +0 -2
  172. package/esm2015/modules/type-definitions/type-anchor-links.pipe.js +0 -27
  173. package/esm2015/modules/type-definitions/type-definition.js +0 -2
  174. package/esm2015/modules/type-definitions/type-definitions-format.service.js +0 -241
  175. package/esm2015/modules/type-definitions/type-definitions-provider.js +0 -10
  176. package/esm2015/modules/type-definitions/type-definitions.js +0 -2
  177. package/esm2015/modules/type-definitions/type-definitions.module.js +0 -102
  178. package/esm2015/modules/type-definitions/type-definitions.service.js +0 -93
  179. package/esm2015/modules/type-definitions/type-parameter-definition.js +0 -2
  180. package/esm2015/modules/type-definitions/typedoc-adapter.service.js +0 -477
  181. package/esm2015/modules/type-definitions/typedoc-types.js +0 -2
  182. package/fesm2015/skyux-docs-tools.js +0 -3203
  183. package/fesm2015/skyux-docs-tools.js.map +0 -1
@@ -0,0 +1,521 @@
1
+ import { Injectable, Optional } from '@angular/core';
2
+ import orderBy from 'lodash.orderby';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./type-definitions-provider";
5
+ /**
6
+ * Converts TypeDoc types into SKY UX docs-tools types, to be supplied to the various definitions components.
7
+ */
8
+ export class SkyDocsTypeDocAdapterService {
9
+ constructor(typeDefinitionsProvider) {
10
+ this.typeDefinitionsProvider = typeDefinitionsProvider;
11
+ }
12
+ toClassDefinition(entry) {
13
+ const definition = {
14
+ anchorId: this.getAnchorId(entry),
15
+ name: entry.name,
16
+ };
17
+ const tags = this.getCommentTags(entry.comment);
18
+ this.applyCommentTagValues(definition, tags);
19
+ const methods = this.getClassMethods(entry);
20
+ if (methods.length) {
21
+ definition.methods = methods;
22
+ }
23
+ const properties = this.getClassProperties(entry);
24
+ if (properties.length) {
25
+ definition.properties = properties;
26
+ }
27
+ return definition;
28
+ }
29
+ toDirectiveDefinition(entry) {
30
+ const definition = {
31
+ anchorId: this.getAnchorId(entry),
32
+ name: entry.name,
33
+ selector: this.getSelector(entry),
34
+ };
35
+ const tags = this.getCommentTags(entry.comment);
36
+ this.applyCommentTagValues(definition, tags);
37
+ const properties = this.getClassProperties(entry);
38
+ const eventProperties = properties.filter((p) => p.decorator?.name === 'Output');
39
+ if (eventProperties.length) {
40
+ definition.eventProperties = eventProperties;
41
+ }
42
+ const inputProperties = properties.filter((p) => p.decorator?.name === 'Input');
43
+ if (inputProperties.length) {
44
+ definition.inputProperties = inputProperties;
45
+ }
46
+ return definition;
47
+ }
48
+ toEnumerationDefinition(entry) {
49
+ const members = this.getEnumerationMembers(entry);
50
+ const definition = {
51
+ anchorId: this.getAnchorId(entry),
52
+ members,
53
+ name: entry.name,
54
+ };
55
+ const tags = this.getCommentTags(entry.comment);
56
+ this.applyCommentTagValues(definition, tags);
57
+ return definition;
58
+ }
59
+ toInterfaceDefinition(entry) {
60
+ const properties = this.getInterfaceProperties(entry);
61
+ const definition = {
62
+ anchorId: this.getAnchorId(entry),
63
+ name: entry.name,
64
+ properties,
65
+ };
66
+ const tags = this.getCommentTags(entry.comment);
67
+ this.applyCommentTagValues(definition, tags);
68
+ const typeParameters = this.getTypeParameterDefinitions(entry.typeParameter);
69
+ if (typeParameters.length) {
70
+ definition.typeParameters = typeParameters;
71
+ }
72
+ return definition;
73
+ }
74
+ toPipeDefinition(entry) {
75
+ const methods = this.getClassMethods(entry);
76
+ const transformMethod = methods.find((m) => m.name === 'transform');
77
+ const definition = {
78
+ anchorId: this.getAnchorId(entry),
79
+ name: entry.name,
80
+ transformMethod,
81
+ };
82
+ const tags = this.getCommentTags(entry.comment);
83
+ this.applyCommentTagValues(definition, tags);
84
+ return definition;
85
+ }
86
+ toTypeAliasDefinition(entry) {
87
+ const definition = {
88
+ anchorId: this.getAnchorId(entry),
89
+ name: entry.name,
90
+ type: this.getTypeDefinition({
91
+ comment: entry.comment,
92
+ type: entry.type,
93
+ }),
94
+ };
95
+ const tags = this.getCommentTags(entry.type.declaration?.signatures
96
+ ? entry.type.declaration.signatures[0].comment
97
+ : entry.comment);
98
+ this.applyCommentTagValues(definition, tags);
99
+ const typeParameters = this.getTypeParameterDefinitions(entry.typeParameter);
100
+ if (typeParameters.length) {
101
+ definition.typeParameters = typeParameters;
102
+ }
103
+ return definition;
104
+ }
105
+ getSelector(entry) {
106
+ const decoratorSource = entry.decorators[0].arguments.obj;
107
+ return decoratorSource.indexOf('selector: `') > -1
108
+ ? decoratorSource
109
+ .split('selector: `')[1]
110
+ .split('`')[0]
111
+ .replace(/\s\s+/g, ' ')
112
+ : decoratorSource.split("selector: '")[1].split("'")[0];
113
+ }
114
+ getClassProperties(entry) {
115
+ if (!entry.children) {
116
+ return [];
117
+ }
118
+ const definitions = entry.children
119
+ .filter((child) => child.kindString === 'Property' || child.kindString === 'Accessor')
120
+ .map((child) => {
121
+ let definition = {
122
+ isOptional: true,
123
+ name: this.getPropertyName(child),
124
+ type: this.getTypeDefinition(child),
125
+ };
126
+ let defaultValue;
127
+ /* Ensure we are properly capturing definitions which use a getter/setter. Final check is a sanity check */
128
+ if (child.kindString === 'Accessor' &&
129
+ !child.comment?.shortText &&
130
+ (child.setSignature?.length > 0 || child.getSignature.length > 0)) {
131
+ const mainTags = this.getCommentTags(child.comment);
132
+ this.applyCommentTagValues(definition, mainTags);
133
+ if (child.getSignature?.length > 0) {
134
+ const getTags = this.getCommentTags(child.getSignature[0].comment);
135
+ definition.isOptional = !getTags.extras.required;
136
+ this.applyCommentTagValues(definition, getTags);
137
+ defaultValue = this.getDefaultValue(child, getTags);
138
+ }
139
+ if (child.setSignature?.length > 0) {
140
+ const setTags = this.getCommentTags(child.setSignature[0].comment);
141
+ this.applyCommentTagValues(definition, setTags);
142
+ definition.isOptional =
143
+ definition.isOptional && !setTags.extras.required;
144
+ defaultValue = defaultValue || this.getDefaultValue(child, setTags);
145
+ }
146
+ else {
147
+ definition.isOptional = !mainTags.extras.required;
148
+ defaultValue = this.getDefaultValue(child, mainTags);
149
+ }
150
+ }
151
+ else {
152
+ let tags;
153
+ if (child.kindString === 'Property' &&
154
+ !child.comment?.shortText &&
155
+ child.type.declaration?.signatures?.length > 0 &&
156
+ child.type.declaration.signatures[0].comment) {
157
+ tags = this.getCommentTags(child.type.declaration.signatures[0].comment);
158
+ definition.isOptional = !tags.extras.required;
159
+ this.applyCommentTagValues(definition, tags);
160
+ }
161
+ tags = this.getCommentTags(child.comment);
162
+ definition.isOptional =
163
+ definition.isOptional && !tags.extras.required;
164
+ this.applyCommentTagValues(definition, tags);
165
+ defaultValue = this.getDefaultValue(child, tags);
166
+ }
167
+ if (defaultValue) {
168
+ definition.defaultValue = defaultValue;
169
+ }
170
+ const decorator = this.getDecorator(child);
171
+ if (decorator) {
172
+ definition.decorator = decorator;
173
+ }
174
+ if (!definition.description) {
175
+ const constructor = entry.children.find((child) => child.kindString === 'Constructor');
176
+ if (constructor) {
177
+ const signature = constructor.signatures.find((signature) => signature.kindString === 'Constructor signature');
178
+ /* Sanity check */
179
+ /* istanbul ignore else */
180
+ if (signature) {
181
+ const matchingParam = signature.parameters?.find((parameter) => parameter.name === child.name);
182
+ if (matchingParam) {
183
+ const matchingParamTags = this.getCommentTags(matchingParam.comment);
184
+ this.applyCommentTagValues(definition, matchingParamTags);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ return definition;
190
+ });
191
+ return orderBy(definitions, ['isOptional', 'name'], ['asc', 'asc']);
192
+ }
193
+ getClassMethods(entry) {
194
+ if (!entry.children) {
195
+ return [];
196
+ }
197
+ const methods = entry.children
198
+ .filter((child) => child.kindString === 'Method' && /^ng/.test(child.name) === false)
199
+ .map((child) => {
200
+ const definition = {
201
+ name: this.getPropertyName(child),
202
+ type: this.getTypeDefinition(child),
203
+ };
204
+ // Comments for methods are stored in a different location.
205
+ const comment = child.signatures[0].comment;
206
+ const tags = this.getCommentTags(comment);
207
+ this.applyCommentTagValues(definition, tags);
208
+ const typeParameters = this.getTypeParameterDefinitions(child.signatures[0].typeParameter);
209
+ if (typeParameters.length) {
210
+ definition.typeParameters = typeParameters;
211
+ }
212
+ return definition;
213
+ });
214
+ return orderBy(methods, ['name'], ['asc']);
215
+ }
216
+ getInterfaceProperties(entry) {
217
+ if (!entry.children && !entry.indexSignature) {
218
+ return [];
219
+ }
220
+ const definitions = entry.children?.map((child) => {
221
+ let tags;
222
+ if (child.kindString === 'Method' && child.signatures.length > 0) {
223
+ tags = this.getCommentTags(child.signatures[0].comment);
224
+ }
225
+ else {
226
+ tags = this.getCommentTags(child.comment);
227
+ }
228
+ const definition = {
229
+ isOptional: tags.extras.required ? false : !!child.flags?.isOptional,
230
+ name: this.getPropertyName(child),
231
+ type: this.getTypeDefinition(child),
232
+ };
233
+ this.applyCommentTagValues(definition, tags);
234
+ return definition;
235
+ }) || [];
236
+ const sorted = orderBy(definitions, ['isOptional', 'name'], ['asc', 'asc']);
237
+ // Add any index signatures, e.g. `[_: string]: any`
238
+ if (entry.indexSignature) {
239
+ const indexSignature = entry.indexSignature;
240
+ const definition = {
241
+ isOptional: true,
242
+ name: indexSignature.name,
243
+ type: {
244
+ indexSignature: this.getIndexSignatureDefinition(indexSignature),
245
+ },
246
+ };
247
+ const tags = this.getCommentTags(indexSignature.comment);
248
+ this.applyCommentTagValues(definition, tags);
249
+ sorted.push(definition);
250
+ }
251
+ return sorted;
252
+ }
253
+ getEnumerationMembers(entry) {
254
+ if (!entry.children) {
255
+ return [];
256
+ }
257
+ return entry.children.map((child) => {
258
+ const definition = {
259
+ name: child.name,
260
+ };
261
+ const tags = this.getCommentTags(child.comment);
262
+ this.applyCommentTagValues(definition, tags);
263
+ return definition;
264
+ });
265
+ }
266
+ getTypeDefinition(child) {
267
+ let definition;
268
+ const kindString = child.kindString;
269
+ switch (kindString) {
270
+ case 'Accessor':
271
+ if (child.setSignature) {
272
+ return this.getTypeDefinition(child.setSignature[0].parameters[0]);
273
+ }
274
+ return this.getTypeDefinition(child.getSignature[0]);
275
+ case 'Method':
276
+ definition = {
277
+ callSignature: this.getCallSignatureDefinition(child.signatures[0], this.getCommentTags(child.comment)),
278
+ name: child.signatures[0].name,
279
+ };
280
+ return definition;
281
+ default:
282
+ let name = child.type.name || child.type.elementType?.name || child.type.value;
283
+ definition = {
284
+ type: child.type.type,
285
+ };
286
+ if (name) {
287
+ definition.name = name;
288
+ }
289
+ // Union?
290
+ if (child.type.types) {
291
+ definition.unionTypes = child.type.types.map((t) => this.getTypeDefinition({ type: t }));
292
+ }
293
+ // Convert reflection types.
294
+ if (child.type.type === 'reflection') {
295
+ const declaration = child.type.declaration;
296
+ /*istanbul ignore else */
297
+ if (declaration) {
298
+ if (declaration.signatures) {
299
+ definition.callSignature = this.getCallSignatureDefinition(declaration.signatures[0], this.getCommentTags(child.comment));
300
+ }
301
+ else if (declaration.indexSignature) {
302
+ const indexSignature = declaration.indexSignature;
303
+ definition.indexSignature =
304
+ this.getIndexSignatureDefinition(indexSignature);
305
+ } /* istanbul ignore else */
306
+ else if (declaration.children) {
307
+ definition.typeLiteral = {
308
+ properties: this.getInterfaceProperties({
309
+ children: declaration.children,
310
+ }),
311
+ };
312
+ }
313
+ }
314
+ }
315
+ if (child.type.type === 'typeOperator') {
316
+ definition.name = `${child.type.operator} ${child.type.target.name}`;
317
+ }
318
+ if (child.type.typeArguments) {
319
+ definition.typeArguments = this.getTypeArgumentDefinitions(child.type);
320
+ }
321
+ return definition;
322
+ }
323
+ }
324
+ getParameterDefinitions(callSignature, parentTags) {
325
+ if (!callSignature.parameters) {
326
+ return [];
327
+ }
328
+ const parameters = callSignature.parameters.map((p) => {
329
+ const tags = this.getParameterCommentTags(p, parentTags);
330
+ const defaultValue = this.getDefaultValue(p, tags);
331
+ const typeArguments = this.getTypeArgumentDefinitions(p.type);
332
+ const parameter = {
333
+ isOptional: !!(defaultValue || !!p.flags?.isOptional),
334
+ name: p.name,
335
+ type: this.getTypeDefinition(p),
336
+ };
337
+ if (defaultValue !== undefined) {
338
+ parameter.defaultValue = defaultValue;
339
+ }
340
+ if (tags.description) {
341
+ parameter.description = tags.description;
342
+ }
343
+ if (typeArguments.length) {
344
+ parameter.typeArguments = typeArguments;
345
+ }
346
+ return parameter;
347
+ });
348
+ return parameters;
349
+ }
350
+ getTypeArgumentDefinitions(typeConfig) {
351
+ if (!typeConfig || !typeConfig.typeArguments) {
352
+ return [];
353
+ }
354
+ return typeConfig.typeArguments.map((typeArgument) => {
355
+ return this.getTypeDefinition({ type: typeArgument });
356
+ });
357
+ }
358
+ getCallSignatureDefinition(callSignature, tags) {
359
+ const definition = {
360
+ returnType: this.getTypeDefinition(callSignature),
361
+ };
362
+ const parameters = this.getParameterDefinitions(callSignature, tags);
363
+ if (parameters.length) {
364
+ definition.parameters = parameters;
365
+ }
366
+ return definition;
367
+ }
368
+ getIndexSignatureDefinition(signature) {
369
+ return {
370
+ key: {
371
+ name: signature.parameters[0].name,
372
+ type: this.getTypeDefinition(signature.parameters[0]),
373
+ },
374
+ type: this.getTypeDefinition(signature),
375
+ };
376
+ }
377
+ getTypeParameterDefinitions(typeParameters) {
378
+ if (!typeParameters) {
379
+ return [];
380
+ }
381
+ return typeParameters.map((typeParam) => {
382
+ const definition = {
383
+ name: typeParam.name,
384
+ };
385
+ if (typeParam.type) {
386
+ definition.type = this.getTypeDefinition({
387
+ type: typeParam.type,
388
+ });
389
+ }
390
+ return definition;
391
+ });
392
+ }
393
+ getCommentTags(comment) {
394
+ let codeExample;
395
+ let codeExampleLanguage = 'markup';
396
+ let deprecationWarning;
397
+ let defaultValue;
398
+ let description = '';
399
+ let parameters;
400
+ const extras = {};
401
+ if (comment) {
402
+ if (comment.tags) {
403
+ comment.tags.forEach((tag) => {
404
+ switch (tag.tag) {
405
+ case 'deprecated':
406
+ deprecationWarning = tag.text.trim();
407
+ break;
408
+ case 'default':
409
+ case 'defaultValue':
410
+ defaultValue = tag.text.trim();
411
+ break;
412
+ case 'example':
413
+ codeExample = tag.text.trim().split('```')[1].trim();
414
+ const language = codeExample.split('\n')[0];
415
+ if (language === 'markup' || language === 'typescript') {
416
+ codeExample = codeExample.slice(language.length).trim();
417
+ codeExampleLanguage = language;
418
+ }
419
+ break;
420
+ case 'param':
421
+ parameters = parameters || [];
422
+ parameters.push({
423
+ name: tag.param,
424
+ description: tag.text.trim(),
425
+ });
426
+ break;
427
+ default:
428
+ extras[tag.tag] = tag.text;
429
+ break;
430
+ }
431
+ });
432
+ }
433
+ description = (comment.shortText || comment.text || '').trim();
434
+ }
435
+ return {
436
+ codeExample,
437
+ codeExampleLanguage,
438
+ defaultValue,
439
+ deprecationWarning,
440
+ description,
441
+ extras,
442
+ parameters,
443
+ };
444
+ }
445
+ /**
446
+ * Parameter descriptions are derived from the parent's (function/method) comment.
447
+ */
448
+ getParameterCommentTags(parameter, parentTags) {
449
+ const tags = this.getCommentTags(parameter.comment);
450
+ const paramTags = parentTags.parameters;
451
+ const tagParam = paramTags
452
+ ? paramTags.find((param) => param.name === parameter.name)
453
+ : undefined;
454
+ if (!tagParam || !tagParam.description) {
455
+ return tags;
456
+ }
457
+ return {
458
+ ...tags,
459
+ ...{
460
+ description: tagParam.description,
461
+ },
462
+ };
463
+ }
464
+ /**
465
+ * Applies comment tag (e.g. `@param`) values to the provided definition, if the value is defined.
466
+ */
467
+ applyCommentTagValues(definition, tags) {
468
+ if (tags.codeExample) {
469
+ definition.codeExample = tags.codeExample;
470
+ definition.codeExampleLanguage = tags.codeExampleLanguage;
471
+ }
472
+ if (tags.deprecationWarning !== undefined) {
473
+ definition.deprecationWarning = tags.deprecationWarning;
474
+ }
475
+ if (tags.description) {
476
+ definition.description = tags.description;
477
+ }
478
+ }
479
+ getDecorator(child) {
480
+ const name = child.decorators && child.decorators[0] && child.decorators[0].name;
481
+ if (name) {
482
+ return { name };
483
+ }
484
+ }
485
+ getPropertyName(property) {
486
+ const decorators = property.decorators && property.decorators[0];
487
+ // Use the Input's bound property name, if found.
488
+ // e.g. @Input('foobar')
489
+ return decorators?.arguments?.bindingPropertyName
490
+ ? decorators.arguments.bindingPropertyName.replace(/(\'|\")/g, '')
491
+ : property.name;
492
+ }
493
+ getDefaultValue(child, tags) {
494
+ if (tags.defaultValue) {
495
+ return tags.defaultValue;
496
+ }
497
+ // TypeDoc version 0.20.x stopped auto-generating initializers for the default value
498
+ // (and replaced them with "...") due to the complicated logic it required.
499
+ // See: https://github.com/TypeStrong/typedoc/issues/1552
500
+ if (child.defaultValue === '...') {
501
+ return;
502
+ }
503
+ return child.defaultValue;
504
+ }
505
+ getAnchorId(entry) {
506
+ return (entry.anchorId ||
507
+ this.typeDefinitionsProvider?.anchorIds[entry.name] ||
508
+ '');
509
+ }
510
+ }
511
+ SkyDocsTypeDocAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyDocsTypeDocAdapterService, deps: [{ token: i1.SkyDocsTypeDefinitionsProvider, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
512
+ SkyDocsTypeDocAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyDocsTypeDocAdapterService, providedIn: 'any' });
513
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SkyDocsTypeDocAdapterService, decorators: [{
514
+ type: Injectable,
515
+ args: [{
516
+ providedIn: 'any',
517
+ }]
518
+ }], ctorParameters: function () { return [{ type: i1.SkyDocsTypeDefinitionsProvider, decorators: [{
519
+ type: Optional
520
+ }] }]; } });
521
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRvYy1hZGFwdGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2NzLXRvb2xzL3NyYy9tb2R1bGVzL3R5cGUtZGVmaW5pdGlvbnMvdHlwZWRvYy1hZGFwdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFnRHJELE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDOzs7QUFFckM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLFlBQ3NCLHVCQUF3RDtRQUF4RCw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQWlDO0lBQzNFLENBQUM7SUFFRyxpQkFBaUIsQ0FBQyxLQUFtQjtRQUMxQyxNQUFNLFVBQVUsR0FBMkI7WUFDekMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2pDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtTQUNqQixDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixVQUFVLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUM5QjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDckIsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7U0FDcEM7UUFFRCxPQUFPLFVBQVUs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OzZIQUE1Qiw0QkFBNEIsY0FGM0IsS0FBSzsyRkFFTiw0QkFBNEI7a0JBSHhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCOzswQkFHSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU2t5RG9jc0NhbGxTaWduYXR1cmVEZWZpbml0aW9uIH0gZnJvbSAnLi9jYWxsLXNpZ25hdHVyZS1kZWZpbml0aW9uJztcblxuaW1wb3J0IHsgU2t5RG9jc0NsYXNzRGVmaW5pdGlvbiB9IGZyb20gJy4vY2xhc3MtZGVmaW5pdGlvbic7XG5cbmltcG9ydCB7IFNreURvY3NDbGFzc1Byb3BlcnR5RGVmaW5pdGlvbiB9IGZyb20gJy4vcHJvcGVydHktZGVmaW5pdGlvbic7XG5cbmltcG9ydCB7IFNreURvY3NDb21tZW50VGFncyB9IGZyb20gJy4vY29tbWVudC10YWdzJztcblxuaW1wb3J0IHsgU2t5RG9jc0RpcmVjdGl2ZURlZmluaXRpb24gfSBmcm9tICcuL2RpcmVjdGl2ZS1kZWZpbml0aW9uJztcblxuaW1wb3J0IHsgU2t5RG9jc0VudW1lcmF0aW9uRGVmaW5pdGlvbiB9IGZyb20gJy4vZW51bWVyYXRpb24tZGVmaW5pdGlvbic7XG5cbmltcG9ydCB7IFNreURvY3NFbnVtZXJhdGlvbk1lbWJlckRlZmluaXRpb24gfSBmcm9tICcuL2VudW1lcmF0aW9uLW1lbWJlci1kZWZpbml0aW9uJztcblxuaW1wb3J0IHsgU2t5RG9jc0luZGV4U2lnbmF0dXJlRGVmaW5pdGlvbiB9IGZyb20gJy4vaW5kZXgtc2lnbmF0dXJlLWRlZmluaXRpb24nO1xuXG5pbXBvcnQgeyBTa3lEb2NzSW50ZXJmYWNlRGVmaW5pdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlLWRlZmluaXRpb24nO1xuXG5pbXBvcnQgeyBTa3lEb2NzSW50ZXJmYWNlUHJvcGVydHlEZWZpbml0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2UtcHJvcGVydHktZGVmaW5pdGlvbic7XG5cbmltcG9ydCB7IFNreURvY3NDbGFzc01ldGhvZERlZmluaXRpb24gfSBmcm9tICcuL21ldGhvZC1kZWZpbml0aW9uJztcblxuaW1wb3J0IHsgU2t5RG9jc1BhcmFtZXRlckRlZmluaXRpb24gfSBmcm9tICcuL3BhcmFtZXRlci1kZWZpbml0aW9uJztcblxuaW1wb3J0IHsgU2t5RG9jc1BpcGVEZWZpbml0aW9uIH0gZnJvbSAnLi9waXBlLWRlZmluaXRpb24nO1xuXG5pbXBvcnQgeyBTa3lEb2NzUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIH0gZnJvbSAnLi9wcm9wZXJ0eS1kZWNvcmF0b3InO1xuXG5pbXBvcnQgeyBTa3lEb2NzVHlwZUFsaWFzRGVmaW5pdGlvbiB9IGZyb20gJy4vdHlwZS1hbGlhcy1kZWZpbml0aW9uJztcblxuaW1wb3J0IHsgU2t5RG9jc1R5cGVEZWZpbml0aW9uIH0gZnJvbSAnLi90eXBlLWRlZmluaXRpb24nO1xuXG5pbXBvcnQgeyBTa3lEb2NzVHlwZURlZmluaXRpb25zUHJvdmlkZXIgfSBmcm9tICcuL3R5cGUtZGVmaW5pdGlvbnMtcHJvdmlkZXInO1xuXG5pbXBvcnQgeyBTa3lEb2NzVHlwZVBhcmFtZXRlckRlZmluaXRpb24gfSBmcm9tICcuL3R5cGUtcGFyYW1ldGVyLWRlZmluaXRpb24nO1xuXG5pbXBvcnQge1xuICBUeXBlRG9jQ29tbWVudCxcbiAgVHlwZURvY0VudHJ5LFxuICBUeXBlRG9jRW50cnlDaGlsZCxcbiAgVHlwZURvY1BhcmFtZXRlcixcbiAgVHlwZURvY1NpZ25hdHVyZSxcbiAgVHlwZURvY1R5cGUsXG4gIFR5cGVEb2NUeXBlUGFyYW1ldGVyLFxufSBmcm9tICcuL3R5cGVkb2MtdHlwZXMnO1xuXG5pbXBvcnQgb3JkZXJCeSBmcm9tICdsb2Rhc2gub3JkZXJieSc7XG5cbi8qKlxuICogQ29udmVydHMgVHlwZURvYyB0eXBlcyBpbnRvIFNLWSBVWCBkb2NzLXRvb2xzIHR5cGVzLCB0byBiZSBzdXBwbGllZCB0byB0aGUgdmFyaW91cyBkZWZpbml0aW9ucyBjb21wb25lbnRzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdhbnknLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lEb2NzVHlwZURvY0FkYXB0ZXJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB0eXBlRGVmaW5pdGlvbnNQcm92aWRlcj86IFNreURvY3NUeXBlRGVmaW5pdGlvbnNQcm92aWRlclxuICApIHt9XG5cbiAgcHVibGljIHRvQ2xhc3NEZWZpbml0aW9uKGVudHJ5OiBUeXBlRG9jRW50cnkpOiBTa3lEb2NzQ2xhc3NEZWZpbml0aW9uIHtcbiAgICBjb25zdCBkZWZpbml0aW9uOiBTa3lEb2NzQ2xhc3NEZWZpbml0aW9uID0ge1xuICAgICAgYW5jaG9ySWQ6IHRoaXMuZ2V0QW5jaG9ySWQoZW50cnkpLFxuICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0Q29tbWVudFRhZ3MoZW50cnkuY29tbWVudCk7XG4gICAgdGhpcy5hcHBseUNvbW1lbnRUYWdWYWx1ZXMoZGVmaW5pdGlvbiwgdGFncyk7XG5cbiAgICBjb25zdCBtZXRob2RzID0gdGhpcy5nZXRDbGFzc01ldGhvZHMoZW50cnkpO1xuICAgIGlmIChtZXRob2RzLmxlbmd0aCkge1xuICAgICAgZGVmaW5pdGlvbi5tZXRob2RzID0gbWV0aG9kcztcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDbGFzc1Byb3BlcnRpZXMoZW50cnkpO1xuICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgZGVmaW5pdGlvbi5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyB0b0RpcmVjdGl2ZURlZmluaXRpb24oXG4gICAgZW50cnk6IFR5cGVEb2NFbnRyeVxuICApOiBTa3lEb2NzRGlyZWN0aXZlRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbjogU2t5RG9jc0RpcmVjdGl2ZURlZmluaXRpb24gPSB7XG4gICAgICBhbmNob3JJZDogdGhpcy5nZXRBbmNob3JJZChlbnRyeSksXG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgc2VsZWN0b3I6IHRoaXMuZ2V0U2VsZWN0b3IoZW50cnkpLFxuICAgIH07XG5cbiAgICBjb25zdCB0YWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhlbnRyeS5jb21tZW50KTtcbiAgICB0aGlzLmFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhkZWZpbml0aW9uLCB0YWdzKTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldENsYXNzUHJvcGVydGllcyhlbnRyeSk7XG5cbiAgICBjb25zdCBldmVudFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmZpbHRlcihcbiAgICAgIChwKSA9PiBwLmRlY29yYXRvcj8ubmFtZSA9PT0gJ091dHB1dCdcbiAgICApO1xuICAgIGlmIChldmVudFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICBkZWZpbml0aW9uLmV2ZW50UHJvcGVydGllcyA9IGV2ZW50UHJvcGVydGllcztcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmZpbHRlcihcbiAgICAgIChwKSA9PiBwLmRlY29yYXRvcj8ubmFtZSA9PT0gJ0lucHV0J1xuICAgICk7XG4gICAgaWYgKGlucHV0UHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgIGRlZmluaXRpb24uaW5wdXRQcm9wZXJ0aWVzID0gaW5wdXRQcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgcHVibGljIHRvRW51bWVyYXRpb25EZWZpbml0aW9uKFxuICAgIGVudHJ5OiBUeXBlRG9jRW50cnlcbiAgKTogU2t5RG9jc0VudW1lcmF0aW9uRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgbWVtYmVycyA9IHRoaXMuZ2V0RW51bWVyYXRpb25NZW1iZXJzKGVudHJ5KTtcbiAgICBjb25zdCBkZWZpbml0aW9uOiBTa3lEb2NzRW51bWVyYXRpb25EZWZpbml0aW9uID0ge1xuICAgICAgYW5jaG9ySWQ6IHRoaXMuZ2V0QW5jaG9ySWQoZW50cnkpLFxuICAgICAgbWVtYmVycyxcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgfTtcblxuICAgIGNvbnN0IHRhZ3MgPSB0aGlzLmdldENvbW1lbnRUYWdzKGVudHJ5LmNvbW1lbnQpO1xuICAgIHRoaXMuYXBwbHlDb21tZW50VGFnVmFsdWVzKGRlZmluaXRpb24sIHRhZ3MpO1xuXG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICBwdWJsaWMgdG9JbnRlcmZhY2VEZWZpbml0aW9uKFxuICAgIGVudHJ5OiBUeXBlRG9jRW50cnlcbiAgKTogU2t5RG9jc0ludGVyZmFjZURlZmluaXRpb24ge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldEludGVyZmFjZVByb3BlcnRpZXMoZW50cnkpO1xuICAgIGNvbnN0IGRlZmluaXRpb246IFNreURvY3NJbnRlcmZhY2VEZWZpbml0aW9uID0ge1xuICAgICAgYW5jaG9ySWQ6IHRoaXMuZ2V0QW5jaG9ySWQoZW50cnkpLFxuICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgfTtcblxuICAgIGNvbnN0IHRhZ3MgPSB0aGlzLmdldENvbW1lbnRUYWdzKGVudHJ5LmNvbW1lbnQpO1xuICAgIHRoaXMuYXBwbHlDb21tZW50VGFnVmFsdWVzKGRlZmluaXRpb24sIHRhZ3MpO1xuXG4gICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLmdldFR5cGVQYXJhbWV0ZXJEZWZpbml0aW9ucyhcbiAgICAgIGVudHJ5LnR5cGVQYXJhbWV0ZXJcbiAgICApO1xuICAgIGlmICh0eXBlUGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIGRlZmluaXRpb24udHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyB0b1BpcGVEZWZpbml0aW9uKGVudHJ5OiBUeXBlRG9jRW50cnkpOiBTa3lEb2NzUGlwZURlZmluaXRpb24ge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB0aGlzLmdldENsYXNzTWV0aG9kcyhlbnRyeSk7XG4gICAgY29uc3QgdHJhbnNmb3JtTWV0aG9kID0gbWV0aG9kcy5maW5kKChtKSA9PiBtLm5hbWUgPT09ICd0cmFuc2Zvcm0nKTtcbiAgICBjb25zdCBkZWZpbml0aW9uOiBTa3lEb2NzUGlwZURlZmluaXRpb24gPSB7XG4gICAgICBhbmNob3JJZDogdGhpcy5nZXRBbmNob3JJZChlbnRyeSksXG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgdHJhbnNmb3JtTWV0aG9kLFxuICAgIH07XG5cbiAgICBjb25zdCB0YWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhlbnRyeS5jb21tZW50KTtcbiAgICB0aGlzLmFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhkZWZpbml0aW9uLCB0YWdzKTtcblxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgcHVibGljIHRvVHlwZUFsaWFzRGVmaW5pdGlvbihcbiAgICBlbnRyeTogVHlwZURvY0VudHJ5XG4gICk6IFNreURvY3NUeXBlQWxpYXNEZWZpbml0aW9uIHtcbiAgICBjb25zdCBkZWZpbml0aW9uOiBTa3lEb2NzVHlwZUFsaWFzRGVmaW5pdGlvbiA9IHtcbiAgICAgIGFuY2hvcklkOiB0aGlzLmdldEFuY2hvcklkKGVudHJ5KSxcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLmdldFR5cGVEZWZpbml0aW9uKHtcbiAgICAgICAgY29tbWVudDogZW50cnkuY29tbWVudCxcbiAgICAgICAgdHlwZTogZW50cnkudHlwZSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCB0YWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhcbiAgICAgIGVudHJ5LnR5cGUuZGVjbGFyYXRpb24/LnNpZ25hdHVyZXNcbiAgICAgICAgPyBlbnRyeS50eXBlLmRlY2xhcmF0aW9uLnNpZ25hdHVyZXNbMF0uY29tbWVudFxuICAgICAgICA6IGVudHJ5LmNvbW1lbnRcbiAgICApO1xuICAgIHRoaXMuYXBwbHlDb21tZW50VGFnVmFsdWVzKGRlZmluaXRpb24sIHRhZ3MpO1xuXG4gICAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSB0aGlzLmdldFR5cGVQYXJhbWV0ZXJEZWZpbml0aW9ucyhcbiAgICAgIGVudHJ5LnR5cGVQYXJhbWV0ZXJcbiAgICApO1xuICAgIGlmICh0eXBlUGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIGRlZmluaXRpb24udHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVycztcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0b3IoZW50cnk6IFR5cGVEb2NFbnRyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGVjb3JhdG9yU291cmNlID0gZW50cnkuZGVjb3JhdG9yc1swXS5hcmd1bWVudHMub2JqO1xuICAgIHJldHVybiBkZWNvcmF0b3JTb3VyY2UuaW5kZXhPZignc2VsZWN0b3I6IGAnKSA+IC0xXG4gICAgICA/IGRlY29yYXRvclNvdXJjZVxuICAgICAgICAgIC5zcGxpdCgnc2VsZWN0b3I6IGAnKVsxXVxuICAgICAgICAgIC5zcGxpdCgnYCcpWzBdXG4gICAgICAgICAgLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKVxuICAgICAgOiBkZWNvcmF0b3JTb3VyY2Uuc3BsaXQoXCJzZWxlY3RvcjogJ1wiKVsxXS5zcGxpdChcIidcIilbMF07XG4gIH1cblxuICBwcml2YXRlIGdldENsYXNzUHJvcGVydGllcyhcbiAgICBlbnRyeTogVHlwZURvY0VudHJ5XG4gICk6IFNreURvY3NDbGFzc1Byb3BlcnR5RGVmaW5pdGlvbltdIHtcbiAgICBpZiAoIWVudHJ5LmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSBlbnRyeS5jaGlsZHJlblxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNoaWxkKSA9PlxuICAgICAgICAgIGNoaWxkLmtpbmRTdHJpbmcgPT09ICdQcm9wZXJ0eScgfHwgY2hpbGQua2luZFN0cmluZyA9PT0gJ0FjY2Vzc29yJ1xuICAgICAgKVxuICAgICAgLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgbGV0IGRlZmluaXRpb246IFNreURvY3NDbGFzc1Byb3BlcnR5RGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICBpc09wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgIG5hbWU6IHRoaXMuZ2V0UHJvcGVydHlOYW1lKGNoaWxkKSxcbiAgICAgICAgICB0eXBlOiB0aGlzLmdldFR5cGVEZWZpbml0aW9uKGNoaWxkKSxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogc3RyaW5nO1xuXG4gICAgICAgIC8qIEVuc3VyZSB3ZSBhcmUgcHJvcGVybHkgY2FwdHVyaW5nIGRlZmluaXRpb25zIHdoaWNoIHVzZSBhIGdldHRlci9zZXR0ZXIuIEZpbmFsIGNoZWNrIGlzIGEgc2FuaXR5IGNoZWNrICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjaGlsZC5raW5kU3RyaW5nID09PSAnQWNjZXNzb3InICYmXG4gICAgICAgICAgIWNoaWxkLmNvbW1lbnQ/LnNob3J0VGV4dCAmJlxuICAgICAgICAgIChjaGlsZC5zZXRTaWduYXR1cmU/Lmxlbmd0aCA+IDAgfHwgY2hpbGQuZ2V0U2lnbmF0dXJlLmxlbmd0aCA+IDApXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1haW5UYWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhjaGlsZC5jb21tZW50KTtcblxuICAgICAgICAgIHRoaXMuYXBwbHlDb21tZW50VGFnVmFsdWVzKGRlZmluaXRpb24sIG1haW5UYWdzKTtcblxuICAgICAgICAgIGlmIChjaGlsZC5nZXRTaWduYXR1cmU/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGdldFRhZ3MgPSB0aGlzLmdldENvbW1lbnRUYWdzKGNoaWxkLmdldFNpZ25hdHVyZVswXS5jb21tZW50KTtcblxuICAgICAgICAgICAgZGVmaW5pdGlvbi5pc09wdGlvbmFsID0gIWdldFRhZ3MuZXh0cmFzLnJlcXVpcmVkO1xuXG4gICAgICAgICAgICB0aGlzLmFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhkZWZpbml0aW9uLCBnZXRUYWdzKTtcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGNoaWxkLCBnZXRUYWdzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2hpbGQuc2V0U2lnbmF0dXJlPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzZXRUYWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhjaGlsZC5zZXRTaWduYXR1cmVbMF0uY29tbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMuYXBwbHlDb21tZW50VGFnVmFsdWVzKGRlZmluaXRpb24sIHNldFRhZ3MpO1xuXG4gICAgICAgICAgICBkZWZpbml0aW9uLmlzT3B0aW9uYWwgPVxuICAgICAgICAgICAgICBkZWZpbml0aW9uLmlzT3B0aW9uYWwgJiYgIXNldFRhZ3MuZXh0cmFzLnJlcXVpcmVkO1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlIHx8IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGNoaWxkLCBzZXRUYWdzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmaW5pdGlvbi5pc09wdGlvbmFsID0gIW1haW5UYWdzLmV4dHJhcy5yZXF1aXJlZDtcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGNoaWxkLCBtYWluVGFncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCB0YWdzOiBTa3lEb2NzQ29tbWVudFRhZ3MgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hpbGQua2luZFN0cmluZyA9PT0gJ1Byb3BlcnR5JyAmJlxuICAgICAgICAgICAgIWNoaWxkLmNvbW1lbnQ/LnNob3J0VGV4dCAmJlxuICAgICAgICAgICAgY2hpbGQudHlwZS5kZWNsYXJhdGlvbj8uc2lnbmF0dXJlcz8ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgY2hpbGQudHlwZS5kZWNsYXJhdGlvbi5zaWduYXR1cmVzWzBdLmNvbW1lbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRhZ3MgPSB0aGlzLmdldENvbW1lbnRUYWdzKFxuICAgICAgICAgICAgICBjaGlsZC50eXBlLmRlY2xhcmF0aW9uLnNpZ25hdHVyZXNbMF0uY29tbWVudFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGVmaW5pdGlvbi5pc09wdGlvbmFsID0gIXRhZ3MuZXh0cmFzLnJlcXVpcmVkO1xuICAgICAgICAgICAgdGhpcy5hcHBseUNvbW1lbnRUYWdWYWx1ZXMoZGVmaW5pdGlvbiwgdGFncyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFncyA9IHRoaXMuZ2V0Q29tbWVudFRhZ3MoY2hpbGQuY29tbWVudCk7XG5cbiAgICAgICAgICBkZWZpbml0aW9uLmlzT3B0aW9uYWwgPVxuICAgICAgICAgICAgZGVmaW5pdGlvbi5pc09wdGlvbmFsICYmICF0YWdzLmV4dHJhcy5yZXF1aXJlZDtcblxuICAgICAgICAgIHRoaXMuYXBwbHlDb21tZW50VGFnVmFsdWVzKGRlZmluaXRpb24sIHRhZ3MpO1xuXG4gICAgICAgICAgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoY2hpbGQsIHRhZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGRlZmluaXRpb24uZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb3JhdG9yID0gdGhpcy5nZXREZWNvcmF0b3IoY2hpbGQpO1xuICAgICAgICBpZiAoZGVjb3JhdG9yKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbi5kZWNvcmF0b3IgPSBkZWNvcmF0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRlZmluaXRpb24uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGVudHJ5LmNoaWxkcmVuLmZpbmQoXG4gICAgICAgICAgICAoY2hpbGQpID0+IGNoaWxkLmtpbmRTdHJpbmcgPT09ICdDb25zdHJ1Y3RvcidcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gY29uc3RydWN0b3Iuc2lnbmF0dXJlcy5maW5kKFxuICAgICAgICAgICAgICAoc2lnbmF0dXJlKSA9PiBzaWduYXR1cmUua2luZFN0cmluZyA9PT0gJ0NvbnN0cnVjdG9yIHNpZ25hdHVyZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAoc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFyYW0gPSBzaWduYXR1cmUucGFyYW1ldGVycz8uZmluZChcbiAgICAgICAgICAgICAgICAocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gY2hpbGQubmFtZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdQYXJhbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFyYW1UYWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhcbiAgICAgICAgICAgICAgICAgIG1hdGNoaW5nUGFyYW0uY29tbWVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseUNvbW1lbnRUYWdWYWx1ZXMoZGVmaW5pdGlvbiwgbWF0Y2hpbmdQYXJhbVRhZ3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb247XG4gICAgICB9KTtcblxuICAgIHJldHVybiBvcmRlckJ5KGRlZmluaXRpb25zLCBbJ2lzT3B0aW9uYWwnLCAnbmFtZSddLCBbJ2FzYycsICdhc2MnXSk7XG4gIH1cblxuICBwcml2YXRlIGdldENsYXNzTWV0aG9kcyhlbnRyeTogVHlwZURvY0VudHJ5KTogU2t5RG9jc0NsYXNzTWV0aG9kRGVmaW5pdGlvbltdIHtcbiAgICBpZiAoIWVudHJ5LmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kcyA9IGVudHJ5LmNoaWxkcmVuXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoY2hpbGQpID0+XG4gICAgICAgICAgY2hpbGQua2luZFN0cmluZyA9PT0gJ01ldGhvZCcgJiYgL15uZy8udGVzdChjaGlsZC5uYW1lKSA9PT0gZmFsc2VcbiAgICAgIClcbiAgICAgIC5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb246IFNreURvY3NDbGFzc01ldGhvZERlZmluaXRpb24gPSB7XG4gICAgICAgICAgbmFtZTogdGhpcy5nZXRQcm9wZXJ0eU5hbWUoY2hpbGQpLFxuICAgICAgICAgIHR5cGU6IHRoaXMuZ2V0VHlwZURlZmluaXRpb24oY2hpbGQpLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENvbW1lbnRzIGZvciBtZXRob2RzIGFyZSBzdG9yZWQgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24uXG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjaGlsZC5zaWduYXR1cmVzWzBdLmNvbW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLmdldENvbW1lbnRUYWdzKGNvbW1lbnQpO1xuICAgICAgICB0aGlzLmFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhkZWZpbml0aW9uLCB0YWdzKTtcblxuICAgICAgICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IHRoaXMuZ2V0VHlwZVBhcmFtZXRlckRlZmluaXRpb25zKFxuICAgICAgICAgIGNoaWxkLnNpZ25hdHVyZXNbMF0udHlwZVBhcmFtZXRlclxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZVBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbi50eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb247XG4gICAgICB9KTtcblxuICAgIHJldHVybiBvcmRlckJ5KG1ldGhvZHMsIFsnbmFtZSddLCBbJ2FzYyddKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW50ZXJmYWNlUHJvcGVydGllcyhcbiAgICBlbnRyeTogVHlwZURvY0VudHJ5XG4gICk6IFNreURvY3NJbnRlcmZhY2VQcm9wZXJ0eURlZmluaXRpb25bXSB7XG4gICAgaWYgKCFlbnRyeS5jaGlsZHJlbiAmJiAhZW50cnkuaW5kZXhTaWduYXR1cmUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZpbml0aW9ucyA9XG4gICAgICBlbnRyeS5jaGlsZHJlbj8ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICBsZXQgdGFnczogU2t5RG9jc0NvbW1lbnRUYWdzIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2hpbGQua2luZFN0cmluZyA9PT0gJ01ldGhvZCcgJiYgY2hpbGQuc2lnbmF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGFncyA9IHRoaXMuZ2V0Q29tbWVudFRhZ3MoY2hpbGQuc2lnbmF0dXJlc1swXS5jb21tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhjaGlsZC5jb21tZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZpbml0aW9uOiBTa3lEb2NzSW50ZXJmYWNlUHJvcGVydHlEZWZpbml0aW9uID0ge1xuICAgICAgICAgIGlzT3B0aW9uYWw6IHRhZ3MuZXh0cmFzLnJlcXVpcmVkID8gZmFsc2UgOiAhIWNoaWxkLmZsYWdzPy5pc09wdGlvbmFsLFxuICAgICAgICAgIG5hbWU6IHRoaXMuZ2V0UHJvcGVydHlOYW1lKGNoaWxkKSxcbiAgICAgICAgICB0eXBlOiB0aGlzLmdldFR5cGVEZWZpbml0aW9uKGNoaWxkKSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhkZWZpbml0aW9uLCB0YWdzKTtcblxuICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgICAgIH0pIHx8IFtdO1xuXG4gICAgY29uc3Qgc29ydGVkID0gb3JkZXJCeShkZWZpbml0aW9ucywgWydpc09wdGlvbmFsJywgJ25hbWUnXSwgWydhc2MnLCAnYXNjJ10pO1xuXG4gICAgLy8gQWRkIGFueSBpbmRleCBzaWduYXR1cmVzLCBlLmcuIGBbXzogc3RyaW5nXTogYW55YFxuICAgIGlmIChlbnRyeS5pbmRleFNpZ25hdHVyZSkge1xuICAgICAgY29uc3QgaW5kZXhTaWduYXR1cmUgPSBlbnRyeS5pbmRleFNpZ25hdHVyZTtcbiAgICAgIGNvbnN0IGRlZmluaXRpb246IFNreURvY3NJbnRlcmZhY2VQcm9wZXJ0eURlZmluaXRpb24gPSB7XG4gICAgICAgIGlzT3B0aW9uYWw6IHRydWUsXG4gICAgICAgIG5hbWU6IGluZGV4U2lnbmF0dXJlLm5hbWUsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBpbmRleFNpZ25hdHVyZTogdGhpcy5nZXRJbmRleFNpZ25hdHVyZURlZmluaXRpb24oaW5kZXhTaWduYXR1cmUpLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0Q29tbWVudFRhZ3MoaW5kZXhTaWduYXR1cmUuY29tbWVudCk7XG4gICAgICB0aGlzLmFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhkZWZpbml0aW9uLCB0YWdzKTtcbiAgICAgIHNvcnRlZC5wdXNoKGRlZmluaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVudW1lcmF0aW9uTWVtYmVycyhcbiAgICBlbnRyeTogVHlwZURvY0VudHJ5XG4gICk6IFNreURvY3NFbnVtZXJhdGlvbk1lbWJlckRlZmluaXRpb25bXSB7XG4gICAgaWYgKCFlbnRyeS5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRyeS5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCBkZWZpbml0aW9uOiBTa3lEb2NzRW51bWVyYXRpb25NZW1iZXJEZWZpbml0aW9uID0ge1xuICAgICAgICBuYW1lOiBjaGlsZC5uYW1lLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0Q29tbWVudFRhZ3MoY2hpbGQuY29tbWVudCk7XG4gICAgICB0aGlzLmFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhkZWZpbml0aW9uLCB0YWdzKTtcblxuICAgICAgcmV0dXJuIGRlZmluaXRpb247XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFR5cGVEZWZpbml0aW9uKGNoaWxkOiBUeXBlRG9jRW50cnlDaGlsZCk6IFNreURvY3NUeXBlRGVmaW5pdGlvbiB7XG4gICAgbGV0IGRlZmluaXRpb246IFNreURvY3NUeXBlRGVmaW5pdGlvbjtcblxuICAgIGNvbnN0IGtpbmRTdHJpbmcgPSBjaGlsZC5raW5kU3RyaW5nO1xuICAgIHN3aXRjaCAoa2luZFN0cmluZykge1xuICAgICAgY2FzZSAnQWNjZXNzb3InOlxuICAgICAgICBpZiAoY2hpbGQuc2V0U2lnbmF0dXJlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb24oY2hpbGQuc2V0U2lnbmF0dXJlWzBdLnBhcmFtZXRlcnNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldFR5cGVEZWZpbml0aW9uKGNoaWxkLmdldFNpZ25hdHVyZVswXSk7XG5cbiAgICAgIGNhc2UgJ01ldGhvZCc6XG4gICAgICAgIGRlZmluaXRpb24gPSB7XG4gICAgICAgICAgY2FsbFNpZ25hdHVyZTogdGhpcy5nZXRDYWxsU2lnbmF0dXJlRGVmaW5pdGlvbihcbiAgICAgICAgICAgIGNoaWxkLnNpZ25hdHVyZXNbMF0sXG4gICAgICAgICAgICB0aGlzLmdldENvbW1lbnRUYWdzKGNoaWxkLmNvbW1lbnQpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuYW1lOiBjaGlsZC5zaWduYXR1cmVzWzBdLm5hbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb247XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxldCBuYW1lOiBzdHJpbmcgPVxuICAgICAgICAgIGNoaWxkLnR5cGUubmFtZSB8fCBjaGlsZC50eXBlLmVsZW1lbnRUeXBlPy5uYW1lIHx8IGNoaWxkLnR5cGUudmFsdWU7XG5cbiAgICAgICAgZGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiBjaGlsZC50eXBlLnR5cGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICBkZWZpbml0aW9uLm5hbWUgPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVW5pb24/XG4gICAgICAgIGlmIChjaGlsZC50eXBlLnR5cGVzKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbi51bmlvblR5cGVzID0gY2hpbGQudHlwZS50eXBlcy5tYXAoKHQpID0+XG4gICAgICAgICAgICB0aGlzLmdldFR5cGVEZWZpbml0aW9uKHsgdHlwZTogdCB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IHJlZmxlY3Rpb24gdHlwZXMuXG4gICAgICAgIGlmIChjaGlsZC50eXBlLnR5cGUgPT09ICdyZWZsZWN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gY2hpbGQudHlwZS5kZWNsYXJhdGlvbjtcbiAgICAgICAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uc2lnbmF0dXJlcykge1xuICAgICAgICAgICAgICBkZWZpbml0aW9uLmNhbGxTaWduYXR1cmUgPSB0aGlzLmdldENhbGxTaWduYXR1cmVEZWZpbml0aW9uKFxuICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnNpZ25hdHVyZXNbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb21tZW50VGFncyhjaGlsZC5jb21tZW50KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5pbmRleFNpZ25hdHVyZSkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleFNpZ25hdHVyZSA9IGRlY2xhcmF0aW9uLmluZGV4U2lnbmF0dXJlO1xuICAgICAgICAgICAgICBkZWZpbml0aW9uLmluZGV4U2lnbmF0dXJlID1cbiAgICAgICAgICAgICAgICB0aGlzLmdldEluZGV4U2lnbmF0dXJlRGVmaW5pdGlvbihpbmRleFNpZ25hdHVyZSk7XG4gICAgICAgICAgICB9IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovIGVsc2UgaWYgKGRlY2xhcmF0aW9uLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgIGRlZmluaXRpb24udHlwZUxpdGVyYWwgPSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5nZXRJbnRlcmZhY2VQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBkZWNsYXJhdGlvbi5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQudHlwZS50eXBlID09PSAndHlwZU9wZXJhdG9yJykge1xuICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGAke2NoaWxkLnR5cGUub3BlcmF0b3J9ICR7Y2hpbGQudHlwZS50YXJnZXQubmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkLnR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgIGRlZmluaXRpb24udHlwZUFyZ3VtZW50cyA9IHRoaXMuZ2V0VHlwZUFyZ3VtZW50RGVmaW5pdGlvbnMoXG4gICAgICAgICAgICBjaGlsZC50eXBlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW1ldGVyRGVmaW5pdGlvbnMoXG4gICAgY2FsbFNpZ25hdHVyZTogVHlwZURvY1NpZ25hdHVyZSxcbiAgICBwYXJlbnRUYWdzOiBTa3lEb2NzQ29tbWVudFRhZ3NcbiAgKTogU2t5RG9jc1BhcmFtZXRlckRlZmluaXRpb25bXSB7XG4gICAgaWYgKCFjYWxsU2lnbmF0dXJlLnBhcmFtZXRlcnMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBTa3lEb2NzUGFyYW1ldGVyRGVmaW5pdGlvbltdID1cbiAgICAgIGNhbGxTaWduYXR1cmUucGFyYW1ldGVycy5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0UGFyYW1ldGVyQ29tbWVudFRhZ3MocCwgcGFyZW50VGFncyk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKHAsIHRhZ3MpO1xuICAgICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gdGhpcy5nZXRUeXBlQXJndW1lbnREZWZpbml0aW9ucyhwLnR5cGUpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcjogU2t5RG9jc1BhcmFtZXRlckRlZmluaXRpb24gPSB7XG4gICAgICAgICAgaXNPcHRpb25hbDogISEoZGVmYXVsdFZhbHVlIHx8ICEhcC5mbGFncz8uaXNPcHRpb25hbCksXG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHRoaXMuZ2V0VHlwZURlZmluaXRpb24ocCksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1ldGVyLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWdzLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgcGFyYW1ldGVyLmRlc2NyaXB0aW9uID0gdGFncy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHBhcmFtZXRlci50eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhbWV0ZXI7XG4gICAgICB9KTtcbiAgICByZXR1cm4gcGFyYW1ldGVycztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHlwZUFyZ3VtZW50RGVmaW5pdGlvbnMoXG4gICAgdHlwZUNvbmZpZzogVHlwZURvY1R5cGVcbiAgKTogU2t5RG9jc1R5cGVEZWZpbml0aW9uW10ge1xuICAgIGlmICghdHlwZUNvbmZpZyB8fCAhdHlwZUNvbmZpZy50eXBlQXJndW1lbnRzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVDb25maWcudHlwZUFyZ3VtZW50cy5tYXAoKHR5cGVBcmd1bWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZURlZmluaXRpb24oeyB0eXBlOiB0eXBlQXJndW1lbnQgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENhbGxTaWduYXR1cmVEZWZpbml0aW9uKFxuICAgIGNhbGxTaWduYXR1cmU6IFR5cGVEb2NTaWduYXR1cmUsXG4gICAgdGFnczogU2t5RG9jc0NvbW1lbnRUYWdzXG4gICk6IFNreURvY3NDYWxsU2lnbmF0dXJlRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbjogU2t5RG9jc0NhbGxTaWduYXR1cmVEZWZpbml0aW9uID0ge1xuICAgICAgcmV0dXJuVHlwZTogdGhpcy5nZXRUeXBlRGVmaW5pdGlvbihjYWxsU2lnbmF0dXJlKSxcbiAgICB9O1xuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVyRGVmaW5pdGlvbnMoY2FsbFNpZ25hdHVyZSwgdGFncyk7XG4gICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICBkZWZpbml0aW9uLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbmRleFNpZ25hdHVyZURlZmluaXRpb24oXG4gICAgc2lnbmF0dXJlOiBUeXBlRG9jU2lnbmF0dXJlXG4gICk6IFNreURvY3NJbmRleFNpZ25hdHVyZURlZmluaXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHtcbiAgICAgICAgbmFtZTogc2lnbmF0dXJlLnBhcmFtZXRlcnNbMF0ubmFtZSxcbiAgICAgICAgdHlwZTogdGhpcy5nZXRUeXBlRGVmaW5pdGlvbihzaWduYXR1cmUucGFyYW1ldGVyc1swXSksXG4gICAgICB9LFxuICAgICAgdHlwZTogdGhpcy5nZXRUeXBlRGVmaW5pdGlvbihzaWduYXR1cmUpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFR5cGVQYXJhbWV0ZXJEZWZpbml0aW9ucyhcbiAgICB0eXBlUGFyYW1ldGVyczogVHlwZURvY1R5cGVQYXJhbWV0ZXJbXVxuICApOiBTa3lEb2NzVHlwZVBhcmFtZXRlckRlZmluaXRpb25bXSB7XG4gICAgaWYgKCF0eXBlUGFyYW1ldGVycykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlUGFyYW1ldGVycy5tYXAoKHR5cGVQYXJhbSkgPT4ge1xuICAgICAgY29uc3QgZGVmaW5pdGlvbjogU2t5RG9jc1R5cGVQYXJhbWV0ZXJEZWZpbml0aW9uID0ge1xuICAgICAgICBuYW1lOiB0eXBlUGFyYW0ubmFtZSxcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlUGFyYW0udHlwZSkge1xuICAgICAgICBkZWZpbml0aW9uLnR5cGUgPSB0aGlzLmdldFR5cGVEZWZpbml0aW9uKHtcbiAgICAgICAgICB0eXBlOiB0eXBlUGFyYW0udHlwZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbml0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb21tZW50VGFncyhjb21tZW50OiBUeXBlRG9jQ29tbWVudCk6IFNreURvY3NDb21tZW50VGFncyB7XG4gICAgbGV0IGNvZGVFeGFtcGxlOiBzdHJpbmc7XG4gICAgbGV0IGNvZGVFeGFtcGxlTGFuZ3VhZ2U6IHN0cmluZyA9ICdtYXJrdXAnO1xuICAgIGxldCBkZXByZWNhdGlvbldhcm5pbmc6IHN0cmluZztcbiAgICBsZXQgZGVmYXVsdFZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcblxuICAgIGxldCBwYXJhbWV0ZXJzOiB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIH1bXTtcblxuICAgIGNvbnN0IGV4dHJhczoge1xuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH0gPSB7fTtcblxuICAgIGlmIChjb21tZW50KSB7XG4gICAgICBpZiAoY29tbWVudC50YWdzKSB7XG4gICAgICAgIGNvbW1lbnQudGFncy5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHRhZy50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RlcHJlY2F0ZWQnOlxuICAgICAgICAgICAgICBkZXByZWNhdGlvbldhcm5pbmcgPSB0YWcudGV4dC50cmltKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0JzpcbiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHRWYWx1ZSc6XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHRhZy50ZXh0LnRyaW0oKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2V4YW1wbGUnOlxuICAgICAgICAgICAgICBjb2RlRXhhbXBsZSA9IHRhZy50ZXh0LnRyaW0oKS5zcGxpdCgnYGBgJylbMV0udHJpbSgpO1xuICAgICAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IGNvZGVFeGFtcGxlLnNwbGl0KCdcXG4nKVswXTtcbiAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlID09PSAnbWFya3VwJyB8fCBsYW5ndWFnZSA9PT0gJ3R5cGVzY3JpcHQnKSB7XG4gICAgICAgICAgICAgICAgY29kZUV4YW1wbGUgPSBjb2RlRXhhbXBsZS5zbGljZShsYW5ndWFnZS5sZW5ndGgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBjb2RlRXhhbXBsZUxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3BhcmFtJzpcbiAgICAgICAgICAgICAgcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwgW107XG4gICAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogdGFnLnBhcmFtLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0YWcudGV4dC50cmltKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgZXh0cmFzW3RhZy50YWddID0gdGFnLnRleHQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGRlc2NyaXB0aW9uID0gKGNvbW1lbnQuc2hvcnRUZXh0IHx8IGNvbW1lbnQudGV4dCB8fCAnJykudHJpbSgpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlRXhhbXBsZSxcbiAgICAgIGNvZGVFeGFtcGxlTGFuZ3VhZ2UsXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBkZXByZWNhdGlvbldhcm5pbmcsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGV4dHJhcyxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgZGVzY3JpcHRpb25zIGFyZSBkZXJpdmVkIGZyb20gdGhlIHBhcmVudCdzIChmdW5jdGlvbi9tZXRob2QpIGNvbW1lbnQuXG4gICAqL1xuICBwcml2YXRlIGdldFBhcmFtZXRlckNvbW1lbnRUYWdzKFxuICAgIHBhcmFtZXRlcjogVHlwZURvY1BhcmFtZXRlcixcbiAgICBwYXJlbnRUYWdzOiBTa3lEb2NzQ29tbWVudFRhZ3NcbiAgKTogU2t5RG9jc0NvbW1lbnRUYWdzIHtcbiAgICBjb25zdCB0YWdzID0gdGhpcy5nZXRDb21tZW50VGFncyhwYXJhbWV0ZXIuY29tbWVudCk7XG4gICAgY29uc3QgcGFyYW1UYWdzID0gcGFyZW50VGFncy5wYXJhbWV0ZXJzO1xuICAgIGNvbnN0IHRhZ1BhcmFtID0gcGFyYW1UYWdzXG4gICAgICA/IHBhcmFtVGFncy5maW5kKChwYXJhbSkgPT4gcGFyYW0ubmFtZSA9PT0gcGFyYW1ldGVyLm5hbWUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghdGFnUGFyYW0gfHwgIXRhZ1BhcmFtLmRlc2NyaXB0aW9uKSB7XG4gICAgICByZXR1cm4gdGFncztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGFncyxcbiAgICAgIC4uLntcbiAgICAgICAgZGVzY3JpcHRpb246IHRhZ1BhcmFtLmRlc2NyaXB0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgY29tbWVudCB0YWcgKGUuZy4gYEBwYXJhbWApIHZhbHVlcyB0byB0aGUgcHJvdmlkZWQgZGVmaW5pdGlvbiwgaWYgdGhlIHZhbHVlIGlzIGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5Q29tbWVudFRhZ1ZhbHVlcyhcbiAgICBkZWZpbml0aW9uOiB7XG4gICAgICBjb2RlRXhhbXBsZT86IHN0cmluZztcbiAgICAgIGNvZGVFeGFtcGxlTGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgICBkZXByZWNhdGlvbldhcm5pbmc/OiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9LFxuICAgIHRhZ3M6IFNreURvY3NDb21tZW50VGFnc1xuICApOiB2b2lkIHtcbiAgICBpZiAodGFncy5jb2RlRXhhbXBsZSkge1xuICAgICAgZGVmaW5pdGlvbi5jb2RlRXhhbXBsZSA9IHRhZ3MuY29kZUV4YW1wbGU7XG4gICAgICBkZWZpbml0aW9uLmNvZGVFeGFtcGxlTGFuZ3VhZ2UgPSB0YWdzLmNvZGVFeGFtcGxlTGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgaWYgKHRhZ3MuZGVwcmVjYXRpb25XYXJuaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlZmluaXRpb24uZGVwcmVjYXRpb25XYXJuaW5nID0gdGFncy5kZXByZWNhdGlvbldhcm5pbmc7XG4gICAgfVxuXG4gICAgaWYgKHRhZ3MuZGVzY3JpcHRpb24pIHtcbiAgICAgIGRlZmluaXRpb24uZGVzY3JpcHRpb24gPSB0YWdzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVjb3JhdG9yKFxuICAgIGNoaWxkOiBUeXBlRG9jRW50cnlDaGlsZFxuICApOiBTa3lEb2NzUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIHtcbiAgICBjb25zdCBuYW1lID1cbiAgICAgIGNoaWxkLmRlY29yYXRvcnMgJiYgY2hpbGQuZGVjb3JhdG9yc1swXSAmJiBjaGlsZC5kZWNvcmF0b3JzWzBdLm5hbWU7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFByb3BlcnR5TmFtZShwcm9wZXJ0eTogVHlwZURvY0VudHJ5Q2hpbGQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wZXJ0eS5kZWNvcmF0b3JzICYmIHByb3BlcnR5LmRlY29yYXRvcnNbMF07XG4gICAgLy8gVXNlIHRoZSBJbnB1dCdzIGJvdW5kIHByb3BlcnR5IG5hbWUsIGlmIGZvdW5kLlxuICAgIC8vIGUuZy4gQElucHV0KCdmb29iYXInKVxuICAgIHJldHVybiBkZWNvcmF0b3JzPy5hcmd1bWVudHM/LmJpbmRpbmdQcm9wZXJ0eU5hbWVcbiAgICAgID8gZGVjb3JhdG9ycy5hcmd1bWVudHMuYmluZGluZ1Byb3BlcnR5TmFtZS5yZXBsYWNlKC8oXFwnfFxcXCIpL2csICcnKVxuICAgICAgOiBwcm9wZXJ0eS5uYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmFsdWUoXG4gICAgY2hpbGQ6IFR5cGVEb2NFbnRyeUNoaWxkLFxuICAgIHRhZ3M6IFNreURvY3NDb21tZW50VGFnc1xuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0YWdzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRhZ3MuZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIC8vIFR5cGVEb2MgdmVyc2lvbiAwLjIwLnggc3RvcHBlZCBhdXRvLWdlbmVyYXRpbmcgaW5pdGlhbGl6ZXJzIGZvciB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgIC8vIChhbmQgcmVwbGFjZWQgdGhlbSB3aXRoIFwiLi4uXCIpIGR1ZSB0byB0aGUgY29tcGxpY2F0ZWQgbG9naWMgaXQgcmVxdWlyZWQuXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vVHlwZVN0cm9uZy90eXBlZG9jL2lzc3Vlcy8xNTUyXG4gICAgaWYgKGNoaWxkLmRlZmF1bHRWYWx1ZSA9PT0gJy4uLicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGQuZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbmNob3JJZChlbnRyeTogVHlwZURvY0VudHJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgZW50cnkuYW5jaG9ySWQgfHxcbiAgICAgIHRoaXMudHlwZURlZmluaXRpb25zUHJvdmlkZXI/LmFuY2hvcklkc1tlbnRyeS5uYW1lXSB8fFxuICAgICAgJydcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRvYy10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvY3MtdG9vbHMvc3JjL21vZHVsZXMvdHlwZS1kZWZpbml0aW9ucy90eXBlZG9jLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFR5cGVEb2NDb21tZW50IHtcbiAgc2hvcnRUZXh0Pzogc3RyaW5nO1xuXG4gIHRhZ3M/OiB7XG4gICAgcGFyYW0/OiBzdHJpbmc7XG4gICAgdGFnOlxuICAgICAgfCAnZGVmYXVsdCdcbiAgICAgIHwgJ2RlZmF1bHRWYWx1ZSdcbiAgICAgIHwgJ2RlcHJlY2F0ZWQnXG4gICAgICB8ICdleGFtcGxlJ1xuICAgICAgfCAncGFyYW0nXG4gICAgICB8ICdyZXF1aXJlZCc7XG4gICAgdGV4dDogc3RyaW5nO1xuICB9W107XG5cbiAgdGV4dD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlRG9jU291cmNlIHtcbiAgZmlsZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlRG9jU2lnbmF0dXJlIHtcbiAgY29tbWVudD86IFR5cGVEb2NDb21tZW50O1xuXG4gIGtpbmRTdHJpbmc/OiAnQ2FsbCBzaWduYXR1cmUnIHwgJ0NvbnN0cnVjdG9yIHNpZ25hdHVyZScgfCAnSW5kZXggc2lnbmF0dXJlJztcblxuICBuYW1lOiBzdHJpbmc7XG5cbiAgcGFyYW1ldGVycz86IFR5cGVEb2NQYXJhbWV0ZXJbXTtcblxuICByZXR1cm5UeXBlPzogVHlwZURvY1R5cGU7XG5cbiAgdHlwZT86IFR5cGVEb2NUeXBlO1xuXG4gIHR5cGVQYXJhbWV0ZXI/OiBUeXBlRG9jVHlwZVBhcmFtZXRlcltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEb2NUeXBlUGFyYW1ldGVyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBraW5kU3RyaW5nOiAnVHlwZSBwYXJhbWV0ZXInO1xuICB0eXBlPzogVHlwZURvY1R5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURvY1R5cGUge1xuICBjb25zdHJhaW50Pzoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgfTtcblxuICBjYWxsU2lnbmF0dXJlPzogVHlwZURvY1NpZ25hdHVyZTtcblxuICBkZWNsYXJhdGlvbj86IHtcbiAgICBjaGlsZHJlbj86IFR5cGVEb2NFbnRyeUNoaWxkW107XG4gICAgaW5kZXhTaWduYXR1cmU/OiBUeXBlRG9jU2lnbmF0dXJlO1xuICAgIHNpZ25hdHVyZXM/OiBUeXBlRG9jU2lnbmF0dXJlW107XG4gIH07XG5cbiAgZWxlbWVudFR5cGU/OiBUeXBlRG9jVHlwZTtcblxuICBuYW1lPzogc3RyaW5nO1xuXG4gIG9wZXJhdG9yPzogJ2tleW9mJztcblxuICB0YXJnZXQ/OiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICB9O1xuXG4gIHR5cGU/OlxuICAgIHwgJ2FycmF5J1xuICAgIHwgJ2ludHJpbnNpYydcbiAgICB8ICdyZWZlcmVuY2UnXG4gICAgfCAncmVmbGVjdGlvbidcbiAgICB8ICdzdHJpbmdMaXRlcmFsJ1xuICAgIHwgJ3R5cGVQYXJhbWV0ZXInXG4gICAgfCAndHlwZU9wZXJhdG9yJ1xuICAgIHwgJ3VuaW9uJ1xuICAgIHwgJ3Vua25vd24nO1xuXG4gIHR5cGVBcmd1bWVudHM/OiBUeXBlRG9jVHlwZVtdO1xuXG4gIHR5cGVzPzogVHlwZURvY1R5cGVbXTtcblxuICB2YWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlRG9jUGFyYW1ldGVyIHtcbiAgY29tbWVudD86IFR5cGVEb2NDb21tZW50O1xuXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcblxuICBraW5kU3RyaW5nOiAnUGFyYW1ldGVyJztcblxuICBuYW1lOiBzdHJpbmc7XG5cbiAgdHlwZTogVHlwZURvY1R5cGU7XG5cbiAgZmxhZ3M/OiB7XG4gICAgaXNPcHRpb25hbD86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURvY0VudHJ5Q2hpbGQge1xuICBjb21tZW50PzogVHlwZURvY0NvbW1lbnQ7XG5cbiAgZGVjb3JhdG9ycz86IHtcbiAgICBhcmd1bWVudHM/OiB7XG4gICAgICBiaW5kaW5nUHJvcGVydHlOYW1lPzogc3RyaW5nO1xuICAgIH07XG4gICAgbmFtZTogJ0lucHV0JyB8ICdPdXRwdXQnO1xuICAgIHR5cGU6IFR5cGVEb2NUeXBlO1xuICB9W107XG5cbiAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuXG4gIGZsYWdzPzoge1xuICAgIGlzT3B0aW9uYWw/OiBib29sZWFuO1xuICB9O1xuXG4gIGtpbmRTdHJpbmc/OlxuICAgIHwgJ0FjY2Vzc29yJ1xuICAgIHwgJ0NhbGwgc2lnbmF0dXJlJ1xuICAgIHwgJ0NvbnN0cnVjdG9yJ1xuICAgIHwgJ0NvbnN0cnVjdG9yIHNpZ25hdHVyZSdcbiAgICB8ICdJbmRleCBzaWduYXR1cmUnXG4gICAgfCAnRW51bWVyYXRpb24gbWVtYmVyJ1xuICAgIHwgJ1BhcmFtZXRlcidcbiAgICB8ICdQcm9wZXJ0eSdcbiAgICB8ICdNZXRob2QnO1xuXG4gIGdldFNpZ25hdHVyZT86IHtcbiAgICBjb21tZW50OiBUeXBlRG9jQ29tbWVudDtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogVHlwZURvY1R5cGU7XG4gIH1bXTtcblxuICBuYW1lPzogc3RyaW5nO1xuXG4gIHNldFNpZ25hdHVyZT86IHtcbiAgICBjb21tZW50OiBUeXBlRG9jQ29tbWVudDtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcGFyYW1ldGVycz86IFR5cGVEb2NQYXJhbWV0ZXJbXTtcbiAgICB0eXBlOiBUeXBlRG9jVHlwZTtcbiAgfVtdO1xuXG4gIHNpZ25hdHVyZXM/OiBUeXBlRG9jU2lnbmF0dXJlW107XG5cbiAgc291cmNlcz86IFR5cGVEb2NTb3VyY2VbXTtcblxuICB0eXBlPzogVHlwZURvY1R5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURvY0VudHJ5IHtcbiAgYW5jaG9ySWQ/OiBzdHJpbmc7XG5cbiAgY2hpbGRyZW4/OiBUeXBlRG9jRW50cnlDaGlsZFtdO1xuXG4gIGNvbW1lbnQ/OiBUeXBlRG9jQ29tbWVudDtcblxuICBkZWNvcmF0b3JzPzoge1xuICAgIGFyZ3VtZW50cz86IHtcbiAgICAgIG9iaj86IHN0cmluZztcbiAgICB9O1xuICAgIG5hbWU6ICdDb21wb25lbnQnIHwgJ0RpcmVjdGl2ZScgfCAnSW5qZWN0YWJsZScgfCAnTmdNb2R1bGUnIHwgJ1BpcGUnO1xuICAgIHR5cGU6IFR5cGVEb2NUeXBlO1xuICB9W107XG5cbiAga2luZFN0cmluZz86ICdDbGFzcycgfCAnRW51bWVyYXRpb24nIHwgJ0ludGVyZmFjZScgfCAnVHlwZSBhbGlhcyc7XG5cbiAgaW5kZXhTaWduYXR1cmU/OiBUeXBlRG9jU2lnbmF0dXJlO1xuXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgc291cmNlcz86IFR5cGVEb2NTb3VyY2VbXTtcblxuICB0eXBlPzogVHlwZURvY1R5cGU7XG5cbiAgdHlwZVBhcmFtZXRlcj86IFR5cGVEb2NUeXBlUGFyYW1ldGVyW107XG59XG4iXX0=