@lowcodeunit/applications-flow-common 0.0.2 → 0.0.4

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 (228) hide show
  1. package/esm2020/lcu.api.mjs +80 -0
  2. package/esm2020/lib/applications-flow.module.mjs +352 -0
  3. package/esm2020/lib/controls/build-pipeline-form/build-pipeline-form.component.mjs +251 -0
  4. package/esm2020/lib/controls/devops-source-control-form/devops-source-control-form.component.mjs +432 -0
  5. package/esm2020/lib/controls/edit-application-form/edit-application-form.component.mjs +110 -0
  6. package/esm2020/lib/controls/processor-details-form/processor-details-form.component.mjs +432 -0
  7. package/esm2020/lib/controls/security-toggle/security-toggle.component.mjs +61 -0
  8. package/esm2020/lib/controls/source-control-form/source-control-form.component.mjs +69 -0
  9. package/esm2020/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.mjs +32 -0
  10. package/esm2020/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.mjs +35 -0
  11. package/esm2020/lib/dialogs/edit-application-dialog/edit-application-dialog.component.mjs +33 -0
  12. package/esm2020/lib/dialogs/new-application-dialog/new-application-dialog.component.mjs +170 -0
  13. package/esm2020/lib/dialogs/processor-details-dialog/processor-details-dialog.component.mjs +53 -0
  14. package/esm2020/lib/dialogs/source-control-dialog/source-control-dialog.component.mjs +29 -0
  15. package/esm2020/lib/dialogs/upgrade-dialog/upgrade-dialog.component.mjs +23 -0
  16. package/esm2020/lib/elements/analytics-card/analytics-card.component.mjs +28 -0
  17. package/esm2020/lib/elements/base-form/base-form.component.mjs +57 -0
  18. package/esm2020/lib/elements/breadcrumb/breadcrumb.component.mjs +124 -0
  19. package/esm2020/lib/elements/card-carousel/card-carousel.component.mjs +70 -0
  20. package/esm2020/lib/elements/dynamic-tabs/dynamic-tabs.component.mjs +75 -0
  21. package/esm2020/lib/elements/feed-card-sm/feed-card-sm.component.mjs +42 -0
  22. package/esm2020/lib/elements/flow-tool/flow-tool.component.mjs +75 -0
  23. package/esm2020/lib/elements/form-card/form-card.component.mjs +33 -0
  24. package/esm2020/lib/elements/gh-control/gh-control.component.mjs +78 -0
  25. package/esm2020/lib/elements/main-feed-card/main-feed-card.component.mjs +128 -0
  26. package/esm2020/lib/elements/project-info-card/project-info-card.component.mjs +76 -0
  27. package/esm2020/lib/elements/projects/controls/builds/builds.component.mjs +32 -0
  28. package/esm2020/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.mjs +145 -0
  29. package/esm2020/lib/elements/projects/controls/forms/source-control/source-control.component.mjs +285 -0
  30. package/esm2020/lib/elements/projects/controls/git-auth/git-auth.component.mjs +26 -0
  31. package/esm2020/lib/elements/projects/controls/header/header.component.mjs +83 -0
  32. package/esm2020/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.mjs +118 -0
  33. package/esm2020/lib/elements/projects/controls/project-items/project-items.component.mjs +54 -0
  34. package/esm2020/lib/elements/projects/controls/project-tabs/project-tabs.component.mjs +103 -0
  35. package/esm2020/lib/elements/projects/controls/recent-activities/recent-activities.component.mjs +14 -0
  36. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.mjs +561 -0
  37. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.mjs +72 -0
  38. package/esm2020/lib/elements/projects/controls/tabs/devops/devops.component.mjs +242 -0
  39. package/esm2020/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.mjs +179 -0
  40. package/esm2020/lib/elements/projects/controls/tabs/domains/domains.component.mjs +140 -0
  41. package/esm2020/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.mjs +90 -0
  42. package/esm2020/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.mjs +142 -0
  43. package/esm2020/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.mjs +124 -0
  44. package/esm2020/lib/elements/projects/controls/tabs/general/general.component.mjs +40 -0
  45. package/esm2020/lib/elements/projects/projects.component.mjs +91 -0
  46. package/esm2020/lib/elements/skeleton-feed-card/skeleton-feed-card.component.mjs +20 -0
  47. package/esm2020/lib/elements/slotted-card/slotted-card.component.mjs +60 -0
  48. package/esm2020/lib/elements/three-column/three-column.component.mjs +30 -0
  49. package/esm2020/lib/elements/two-column-header/two-column-header.component.mjs +15 -0
  50. package/esm2020/lib/models/actions.model.mjs +3 -0
  51. package/esm2020/lib/models/base-form-config.model.mjs +6 -0
  52. package/esm2020/lib/models/card-form-config.model.mjs +6 -0
  53. package/esm2020/lib/models/dev-settings-preset.model.mjs +3 -0
  54. package/esm2020/lib/models/domain.model.mjs +3 -0
  55. package/esm2020/lib/models/dynamic-tabs.model.mjs +6 -0
  56. package/esm2020/lib/models/form-actions.model.mjs +3 -0
  57. package/esm2020/lib/models/form.model.mjs +6 -0
  58. package/esm2020/lib/models/form.values.model.mjs +11 -0
  59. package/esm2020/lib/models/project-actions.model.mjs +6 -0
  60. package/esm2020/lib/models/user-feed.model.mjs +12 -0
  61. package/esm2020/lib/services/applications-flow.service.mjs +142 -0
  62. package/esm2020/lib/services/eac.service.mjs +183 -0
  63. package/esm2020/lib/services/forms.service.mjs +132 -0
  64. package/esm2020/lib/services/npm.service.mjs +77 -0
  65. package/esm2020/lib/services/project.service.mjs +326 -0
  66. package/esm2020/lib/state/applications-flow-state.context.mjs +36 -0
  67. package/esm2020/lib/state/applications-flow.state.mjs +72 -0
  68. package/esm2020/lowcodeunit-applications-flow-common.mjs +5 -0
  69. package/fesm2015/lowcodeunit-applications-flow-common.mjs +6156 -0
  70. package/fesm2015/lowcodeunit-applications-flow-common.mjs.map +1 -0
  71. package/fesm2020/lowcodeunit-applications-flow-common.mjs +6009 -0
  72. package/fesm2020/lowcodeunit-applications-flow-common.mjs.map +1 -0
  73. package/lcu.api.d.ts +58 -4
  74. package/lib/applications-flow.module.d.ts +58 -1
  75. package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts +47 -0
  76. package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts +86 -0
  77. package/lib/controls/edit-application-form/edit-application-form.component.d.ts +27 -0
  78. package/lib/controls/processor-details-form/processor-details-form.component.d.ts +80 -0
  79. package/lib/controls/security-toggle/security-toggle.component.d.ts +25 -0
  80. package/lib/controls/source-control-form/source-control-form.component.d.ts +27 -0
  81. package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts +19 -0
  82. package/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.d.ts +22 -0
  83. package/lib/dialogs/edit-application-dialog/edit-application-dialog.component.d.ts +17 -0
  84. package/lib/dialogs/new-application-dialog/new-application-dialog.component.d.ts +35 -0
  85. package/lib/dialogs/processor-details-dialog/processor-details-dialog.component.d.ts +31 -0
  86. package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts +18 -0
  87. package/lib/dialogs/upgrade-dialog/upgrade-dialog.component.d.ts +11 -0
  88. package/lib/elements/analytics-card/analytics-card.component.d.ts +11 -0
  89. package/lib/elements/base-form/base-form.component.d.ts +6 -4
  90. package/lib/elements/breadcrumb/breadcrumb.component.d.ts +38 -0
  91. package/lib/elements/card-carousel/card-carousel.component.d.ts +16 -0
  92. package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts +7 -5
  93. package/lib/elements/feed-card-sm/feed-card-sm.component.d.ts +14 -0
  94. package/lib/elements/flow-tool/flow-tool.component.d.ts +28 -0
  95. package/lib/elements/form-card/form-card.component.d.ts +3 -1
  96. package/lib/elements/gh-control/gh-control.component.d.ts +19 -0
  97. package/lib/elements/main-feed-card/main-feed-card.component.d.ts +26 -0
  98. package/lib/elements/project-info-card/project-info-card.component.d.ts +26 -0
  99. package/lib/elements/projects/controls/builds/builds.component.d.ts +9 -13
  100. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts +15 -14
  101. package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts +63 -0
  102. package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts +4 -1
  103. package/lib/elements/projects/controls/header/header.component.d.ts +22 -4
  104. package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts +22 -4
  105. package/lib/elements/projects/controls/project-items/project-items.component.d.ts +29 -0
  106. package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts +19 -4
  107. package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts +3 -1
  108. package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts +113 -0
  109. package/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.d.ts +23 -0
  110. package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts +53 -0
  111. package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts +51 -0
  112. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts +18 -8
  113. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts +6 -4
  114. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts +9 -6
  115. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts +9 -6
  116. package/lib/elements/projects/controls/tabs/general/general.component.d.ts +8 -4
  117. package/lib/elements/projects/projects.component.d.ts +18 -22
  118. package/lib/elements/skeleton-feed-card/skeleton-feed-card.component.d.ts +9 -0
  119. package/lib/elements/slotted-card/slotted-card.component.d.ts +23 -0
  120. package/lib/elements/three-column/three-column.component.d.ts +11 -0
  121. package/lib/elements/two-column-header/two-column-header.component.d.ts +8 -0
  122. package/lib/models/actions.model.d.ts +0 -1
  123. package/lib/models/base-form-config.model.d.ts +0 -1
  124. package/lib/models/card-form-config.model.d.ts +0 -1
  125. package/lib/models/dev-settings-preset.model.d.ts +0 -1
  126. package/lib/models/domain.model.d.ts +0 -1
  127. package/lib/models/dynamic-tabs.model.d.ts +0 -1
  128. package/lib/models/form-actions.model.d.ts +0 -1
  129. package/lib/models/form.model.d.ts +0 -1
  130. package/lib/models/form.values.model.d.ts +0 -1
  131. package/lib/models/project-actions.model.d.ts +0 -1
  132. package/lib/models/user-feed.model.d.ts +42 -0
  133. package/lib/services/applications-flow.service.d.ts +20 -8
  134. package/lib/services/eac.service.d.ts +63 -0
  135. package/lib/services/forms.service.d.ts +3 -1
  136. package/lib/services/npm.service.d.ts +13 -0
  137. package/lib/services/project.service.d.ts +23 -7
  138. package/lib/state/applications-flow-state.context.d.ts +3 -1
  139. package/lib/state/applications-flow.state.d.ts +29 -38
  140. package/lowcodeunit-applications-flow-common.d.ts +1 -13
  141. package/package.json +20 -12
  142. package/bundles/lowcodeunit-applications-flow-common.umd.js +0 -2571
  143. package/bundles/lowcodeunit-applications-flow-common.umd.js.map +0 -1
  144. package/bundles/lowcodeunit-applications-flow-common.umd.min.js +0 -16
  145. package/bundles/lowcodeunit-applications-flow-common.umd.min.js.map +0 -1
  146. package/esm2015/lcu.api.js +0 -25
  147. package/esm2015/lib/applications-flow.module.js +0 -116
  148. package/esm2015/lib/elements/base-form/base-form.component.js +0 -61
  149. package/esm2015/lib/elements/dynamic-tabs/dynamic-tabs.component.js +0 -69
  150. package/esm2015/lib/elements/form-card/form-card.component.js +0 -22
  151. package/esm2015/lib/elements/projects/controls/builds/builds.component.js +0 -37
  152. package/esm2015/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.js +0 -207
  153. package/esm2015/lib/elements/projects/controls/git-auth/git-auth.component.js +0 -26
  154. package/esm2015/lib/elements/projects/controls/header/header.component.js +0 -19
  155. package/esm2015/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.js +0 -55
  156. package/esm2015/lib/elements/projects/controls/project-item/project-item.component.js +0 -39
  157. package/esm2015/lib/elements/projects/controls/project-settings/project-settings.component.js +0 -44
  158. package/esm2015/lib/elements/projects/controls/project-tabs/project-tabs.component.js +0 -39
  159. package/esm2015/lib/elements/projects/controls/recent-activities/recent-activities.component.js +0 -15
  160. package/esm2015/lib/elements/projects/controls/tabs/domains/domains.component.js +0 -108
  161. package/esm2015/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.js +0 -86
  162. package/esm2015/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.js +0 -122
  163. package/esm2015/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.js +0 -109
  164. package/esm2015/lib/elements/projects/controls/tabs/general/forms/settings/settings.component.js +0 -238
  165. package/esm2015/lib/elements/projects/controls/tabs/general/general.component.js +0 -44
  166. package/esm2015/lib/elements/projects/projects.component.js +0 -145
  167. package/esm2015/lib/models/actions.model.js +0 -3
  168. package/esm2015/lib/models/base-form-config.model.js +0 -6
  169. package/esm2015/lib/models/card-form-config.model.js +0 -6
  170. package/esm2015/lib/models/dev-settings-preset.model.js +0 -3
  171. package/esm2015/lib/models/domain.model.js +0 -3
  172. package/esm2015/lib/models/dynamic-tabs.model.js +0 -6
  173. package/esm2015/lib/models/form-actions.model.js +0 -3
  174. package/esm2015/lib/models/form.model.js +0 -6
  175. package/esm2015/lib/models/form.values.model.js +0 -11
  176. package/esm2015/lib/models/project-actions.model.js +0 -6
  177. package/esm2015/lib/services/applications-flow-events.service.js +0 -28
  178. package/esm2015/lib/services/applications-flow.service.js +0 -96
  179. package/esm2015/lib/services/forms.service.js +0 -131
  180. package/esm2015/lib/services/project.service.js +0 -85
  181. package/esm2015/lib/state/applications-flow-state.context.js +0 -37
  182. package/esm2015/lib/state/applications-flow.state.js +0 -31
  183. package/esm2015/lowcodeunit-applications-flow-common.js +0 -17
  184. package/fesm2015/lowcodeunit-applications-flow-common.js +0 -1966
  185. package/fesm2015/lowcodeunit-applications-flow-common.js.map +0 -1
  186. package/lcu.api.d.ts.map +0 -1
  187. package/lib/applications-flow.module.d.ts.map +0 -1
  188. package/lib/elements/base-form/base-form.component.d.ts.map +0 -1
  189. package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts.map +0 -1
  190. package/lib/elements/form-card/form-card.component.d.ts.map +0 -1
  191. package/lib/elements/projects/controls/builds/builds.component.d.ts.map +0 -1
  192. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts.map +0 -1
  193. package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts.map +0 -1
  194. package/lib/elements/projects/controls/header/header.component.d.ts.map +0 -1
  195. package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts.map +0 -1
  196. package/lib/elements/projects/controls/project-item/project-item.component.d.ts +0 -23
  197. package/lib/elements/projects/controls/project-item/project-item.component.d.ts.map +0 -1
  198. package/lib/elements/projects/controls/project-settings/project-settings.component.d.ts +0 -16
  199. package/lib/elements/projects/controls/project-settings/project-settings.component.d.ts.map +0 -1
  200. package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts.map +0 -1
  201. package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts.map +0 -1
  202. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts.map +0 -1
  203. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts.map +0 -1
  204. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts.map +0 -1
  205. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts.map +0 -1
  206. package/lib/elements/projects/controls/tabs/general/forms/settings/settings.component.d.ts +0 -116
  207. package/lib/elements/projects/controls/tabs/general/forms/settings/settings.component.d.ts.map +0 -1
  208. package/lib/elements/projects/controls/tabs/general/general.component.d.ts.map +0 -1
  209. package/lib/elements/projects/projects.component.d.ts.map +0 -1
  210. package/lib/models/actions.model.d.ts.map +0 -1
  211. package/lib/models/base-form-config.model.d.ts.map +0 -1
  212. package/lib/models/card-form-config.model.d.ts.map +0 -1
  213. package/lib/models/dev-settings-preset.model.d.ts.map +0 -1
  214. package/lib/models/domain.model.d.ts.map +0 -1
  215. package/lib/models/dynamic-tabs.model.d.ts.map +0 -1
  216. package/lib/models/form-actions.model.d.ts.map +0 -1
  217. package/lib/models/form.model.d.ts.map +0 -1
  218. package/lib/models/form.values.model.d.ts.map +0 -1
  219. package/lib/models/project-actions.model.d.ts.map +0 -1
  220. package/lib/services/applications-flow-events.service.d.ts +0 -13
  221. package/lib/services/applications-flow-events.service.d.ts.map +0 -1
  222. package/lib/services/applications-flow.service.d.ts.map +0 -1
  223. package/lib/services/forms.service.d.ts.map +0 -1
  224. package/lib/services/project.service.d.ts.map +0 -1
  225. package/lib/state/applications-flow-state.context.d.ts.map +0 -1
  226. package/lib/state/applications-flow.state.d.ts.map +0 -1
  227. package/lowcodeunit-applications-flow-common.d.ts.map +0 -1
  228. package/lowcodeunit-applications-flow-common.metadata.json +0 -1
@@ -0,0 +1,432 @@
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { Validators, } from '@angular/forms';
3
+ import { Guid } from '@lcu/common';
4
+ import { EaCApplicationAsCode } from '@semanticjs/common';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/applications-flow.service";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "../../services/eac.service";
9
+ import * as i4 from "@angular/material/card";
10
+ import * as i5 from "@lowcodeunit/app-host-common";
11
+ import * as i6 from "@angular/material/form-field";
12
+ import * as i7 from "@angular/material/select";
13
+ import * as i8 from "@angular/material/core";
14
+ import * as i9 from "../../elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component";
15
+ import * as i10 from "@angular/material/slide-toggle";
16
+ import * as i11 from "@angular/material/icon";
17
+ import * as i12 from "@angular/material/button";
18
+ import * as i13 from "@angular/common";
19
+ import * as i14 from "@angular/material/input";
20
+ import * as i15 from "@angular/material/tooltip";
21
+ import * as i16 from "@angular/flex-layout/flex";
22
+ export class ProcessorDetailsFormComponent {
23
+ constructor(appsFlowSvc, formBldr, eacSvc) {
24
+ this.appsFlowSvc = appsFlowSvc;
25
+ this.formBldr = formBldr;
26
+ this.eacSvc = eacSvc;
27
+ this.redirectTooltip = '';
28
+ this.HasSaveButton = true;
29
+ this.SaveFormEvent = new EventEmitter();
30
+ }
31
+ get APIRootFormControl() {
32
+ return this.ProcessorDetailsFormGroup?.controls.apiRoot;
33
+ }
34
+ get Environment() {
35
+ return this.State?.EaC?.Environments[this.State?.EaC?.Enterprise?.PrimaryEnvironment];
36
+ }
37
+ get BuildFormControl() {
38
+ return this.ProcessorDetailsFormGroup?.controls.build;
39
+ }
40
+ get BuildPathFormControl() {
41
+ return this.ProcessorDetailsFormGroup?.controls.buildPath;
42
+ }
43
+ get ClientIDFormControl() {
44
+ return this.ProcessorDetailsFormGroup?.controls.clientId;
45
+ }
46
+ get ClientSecretFormControl() {
47
+ return this.ProcessorDetailsFormGroup?.controls.clientSecret;
48
+ }
49
+ get DefaultFileFormControl() {
50
+ return this.ProcessorDetailsFormGroup?.controls.defaultFile;
51
+ }
52
+ get DefaultSourceControl() {
53
+ return {
54
+ Organization: this.EditingApplication?.LowCodeUnit?.Organization,
55
+ Repository: this.EditingApplication?.LowCodeUnit?.Repository,
56
+ };
57
+ }
58
+ get InboundPathFormControl() {
59
+ return this.ProcessorDetailsFormGroup?.controls.inboundPath;
60
+ }
61
+ get IncludeRequestFormControl() {
62
+ return this.ProcessorDetailsFormGroup?.controls.includeRequest;
63
+ }
64
+ get MethodsFormControl() {
65
+ return this.ProcessorDetailsFormGroup?.controls.methods;
66
+ }
67
+ get PackageFormControl() {
68
+ return this.ProcessorDetailsFormGroup?.controls.package;
69
+ }
70
+ get PermanentFormControl() {
71
+ return this.ProcessorDetailsFormGroup?.controls.permanent;
72
+ }
73
+ get PreserveMethodFormControl() {
74
+ return this.ProcessorDetailsFormGroup?.controls.preserveMethod;
75
+ }
76
+ get RedirectFormControl() {
77
+ return this.ProcessorDetailsFormGroup?.controls.redirect;
78
+ }
79
+ get ScopesFormControl() {
80
+ return this.ProcessorDetailsFormGroup?.controls.scopes;
81
+ }
82
+ get SecurityFormControl() {
83
+ return this.ProcessorDetailsFormGroup?.controls.security;
84
+ }
85
+ get State() {
86
+ return this.eacSvc.State;
87
+ }
88
+ get SourceControls() {
89
+ return this.Environment?.Sources || {};
90
+ }
91
+ get SourceControlFormControl() {
92
+ return this.ProcessorDetailsFormGroup?.controls.sourceControl;
93
+ }
94
+ get SPARootFormControl() {
95
+ return this.ProcessorDetailsFormGroup?.controls.spaRoot;
96
+ }
97
+ get TokenLookupFormControl() {
98
+ return this.ProcessorDetailsFormGroup?.controls.tokenLookup;
99
+ }
100
+ get VersionFormControl() {
101
+ return this.ProcessorDetailsFormGroup?.controls.version;
102
+ }
103
+ get ZipFileFormControl() {
104
+ return this.ProcessorDetailsFormGroup?.controls.zipFile;
105
+ }
106
+ ngOnInit() {
107
+ if (!this.EditingApplication) {
108
+ this.CreateNewApplication();
109
+ }
110
+ else {
111
+ this.setupProcessorDetailsForm();
112
+ }
113
+ }
114
+ CreateNewApplication() {
115
+ this.SetEditingApplication(Guid.CreateRaw());
116
+ }
117
+ DetermineTooltipText() {
118
+ let permanentValue = this.PermanentFormControl.value;
119
+ let preserveValue = this.PreserveMethodFormControl.value;
120
+ if (permanentValue === true && preserveValue === false) {
121
+ this.redirectTooltip = '301 – Permanent and Not Preserve';
122
+ }
123
+ else if (permanentValue === false && preserveValue === false) {
124
+ this.redirectTooltip = '302 – Not Permanent and Not Preserve';
125
+ }
126
+ else if (permanentValue === false && preserveValue === true) {
127
+ this.redirectTooltip = '307 – Not Permanent and Preserve';
128
+ }
129
+ else if (permanentValue === true && preserveValue === true) {
130
+ this.redirectTooltip = '308 – Permanent and Preserve';
131
+ }
132
+ }
133
+ SaveProcessorDetails() {
134
+ const app = this.EditingApplication;
135
+ app.LookupConfig.AllowedMethods =
136
+ this.MethodsFormControl?.value
137
+ ?.split(' ')
138
+ .filter((v) => !!v);
139
+ app.Processor.Type = this.ProcessorType;
140
+ switch (app.Processor.Type) {
141
+ case 'DFS':
142
+ app.Processor.DefaultFile =
143
+ this.DefaultFileFormControl.value ||
144
+ 'index.html';
145
+ app.LowCodeUnit = {
146
+ Type: this.LCUType,
147
+ };
148
+ switch (app.LowCodeUnit.Type) {
149
+ case 'GitHub':
150
+ app.LowCodeUnit.Organization =
151
+ this.SourceControls[this.SourceControlFormControl.value].Organization;
152
+ app.LowCodeUnit.Repository =
153
+ this.SourceControls[this.SourceControlFormControl.value].Repository;
154
+ app.LowCodeUnit.Build =
155
+ this.BuildFormControl.value;
156
+ app.LowCodeUnit.Path =
157
+ this.BuildPathFormControl.value;
158
+ app.LowCodeUnit.SourceControlLookup =
159
+ this.SourceControlFormControl.value;
160
+ break;
161
+ case 'NPM':
162
+ app.LowCodeUnit.Package =
163
+ this.PackageFormControl.value;
164
+ app.LowCodeUnit.Version =
165
+ this.VersionFormControl.value;
166
+ break;
167
+ case 'WordPress':
168
+ app.LowCodeUnit.APIRoot =
169
+ this.APIRootFormControl.value;
170
+ break;
171
+ case 'Zip':
172
+ app.LowCodeUnit.ZipFile =
173
+ this.ZipFileFormControl.value;
174
+ break;
175
+ }
176
+ break;
177
+ case 'OAuth':
178
+ app.Processor.Scopes =
179
+ this.ScopesFormControl.value.split(' ');
180
+ app.Processor.TokenLookup =
181
+ this.TokenLookupFormControl.value;
182
+ app.LowCodeUnit = {
183
+ Type: this.LCUType,
184
+ };
185
+ switch (app.LowCodeUnit.Type) {
186
+ case 'GitHubOAuth':
187
+ app.LowCodeUnit.ClientID =
188
+ this.ClientIDFormControl.value;
189
+ app.LowCodeUnit.ClientSecret =
190
+ this.ClientSecretFormControl.value;
191
+ break;
192
+ }
193
+ break;
194
+ case 'Proxy':
195
+ app.Processor.InboundPath =
196
+ this.InboundPathFormControl.value;
197
+ app.LowCodeUnit = {
198
+ Type: this.LCUType,
199
+ };
200
+ switch (app.LowCodeUnit.Type) {
201
+ case 'API':
202
+ app.LowCodeUnit.APIRoot =
203
+ this.APIRootFormControl.value;
204
+ app.LowCodeUnit.Security =
205
+ this.SecurityFormControl.value;
206
+ break;
207
+ case 'SPA':
208
+ app.LowCodeUnit.SPARoot =
209
+ this.SPARootFormControl.value;
210
+ break;
211
+ }
212
+ break;
213
+ case 'Redirect':
214
+ app.Processor.IncludeRequest =
215
+ !!this.IncludeRequestFormControl.value;
216
+ app.Processor.Permanent =
217
+ !!this.PermanentFormControl.value;
218
+ app.Processor.PreserveMethod =
219
+ !!this.PreserveMethodFormControl.value;
220
+ app.Processor.Redirect =
221
+ this.RedirectFormControl.value;
222
+ break;
223
+ }
224
+ if (!app.LookupConfig.PathRegex.startsWith('/')) {
225
+ app.LookupConfig.PathRegex = `/${app.LookupConfig.PathRegex}`;
226
+ }
227
+ const saveAppReq = {
228
+ ProjectLookup: this.ProjectLookup,
229
+ Application: app,
230
+ ApplicationLookup: this.EditingApplicationLookup || Guid.CreateRaw(),
231
+ };
232
+ this.eacSvc.SaveApplicationAsCode(saveAppReq).then(res => {
233
+ this.SaveFormEvent.emit(res);
234
+ });
235
+ }
236
+ SetEditingApplication(appLookup) {
237
+ this.EditingApplication = new EaCApplicationAsCode;
238
+ this.EditingApplicationLookup = appLookup;
239
+ this.setupProcessorDetailsForm();
240
+ }
241
+ SourceControlChanged(event) {
242
+ this.listBuildPaths();
243
+ }
244
+ ProcessorTypeChanged(event) {
245
+ this.ProcessorType = event.value;
246
+ this.setupProcessorTypeSubForm();
247
+ }
248
+ LCUTypeChanged(event) {
249
+ this.LCUType = event.value;
250
+ this.setupLcuTypeSubForm();
251
+ }
252
+ //HELPERS
253
+ cleanupLcuTypeSubForm() {
254
+ this.ProcessorDetailsFormGroup.removeControl('methods');
255
+ this.ProcessorDetailsFormGroup.removeControl('apiRoot');
256
+ this.ProcessorDetailsFormGroup.removeControl('security');
257
+ this.ProcessorDetailsFormGroup.removeControl('spaRoot');
258
+ this.ProcessorDetailsFormGroup.removeControl('applicationId');
259
+ this.ProcessorDetailsFormGroup.removeControl('sourceControl');
260
+ this.ProcessorDetailsFormGroup.removeControl('build');
261
+ this.ProcessorDetailsFormGroup.removeControl('clientId');
262
+ this.ProcessorDetailsFormGroup.removeControl('clientSecret');
263
+ this.ProcessorDetailsFormGroup.removeControl('zipFile');
264
+ }
265
+ cleanupProcessorTypeSubForm() {
266
+ this.ProcessorDetailsFormGroup.removeControl('defaultFile');
267
+ // this.ApplicationFormGroup.removeControl('dfsLcuType');
268
+ // this.ApplicationFormGroup.removeControl('oauthLcuType');
269
+ this.ProcessorDetailsFormGroup.removeControl('scopes');
270
+ this.ProcessorDetailsFormGroup.removeControl('tokenLookup');
271
+ this.ProcessorDetailsFormGroup.removeControl('inboundPath');
272
+ this.ProcessorDetailsFormGroup.removeControl('proxyLcuType');
273
+ this.ProcessorDetailsFormGroup.removeControl('includeRequest');
274
+ this.ProcessorDetailsFormGroup.removeControl('redirect');
275
+ this.ProcessorDetailsFormGroup.removeControl('permanent');
276
+ this.ProcessorDetailsFormGroup.removeControl('preserveMethod');
277
+ this.cleanupLcuTypeSubForm();
278
+ }
279
+ listBuildPaths() {
280
+ this.State.Loading = true;
281
+ this.appsFlowSvc
282
+ .ListBuildPaths(this.SourceControls[this.SourceControlFormControl.value].Organization, this.SourceControls[this.SourceControlFormControl.value].Repository)
283
+ .subscribe((response) => {
284
+ this.BuildPathOptions = response.Model;
285
+ this.State.Loading = false;
286
+ if (this.BuildPathOptions?.length === 1) {
287
+ this.BuildPathFormControl.setValue(this.BuildPathOptions[0]);
288
+ }
289
+ });
290
+ }
291
+ setupLcuTypeSubForm() {
292
+ this.cleanupLcuTypeSubForm();
293
+ // this.ApplicationFormGroup.removeControl('package');
294
+ // this.ApplicationFormGroup.removeControl('version');
295
+ if (this.LCUType) {
296
+ switch (this.LCUType) {
297
+ case 'API':
298
+ this.setupLCUAPIForm();
299
+ break;
300
+ case 'ApplicationPointer':
301
+ this.setupLCUApplicationPointerForm();
302
+ break;
303
+ case 'GitHub':
304
+ this.setupLCUGitHubForm();
305
+ break;
306
+ case 'GitHubOAuth':
307
+ this.setupLCUGitHubOAuthForm();
308
+ break;
309
+ case 'WordPress':
310
+ this.setupLCUWordPressForm();
311
+ break;
312
+ // case 'NPM':
313
+ // this.setupLCUNPMForm();
314
+ // break;
315
+ case 'SPA':
316
+ this.setupLCUSPAForm();
317
+ break;
318
+ case 'Zip':
319
+ this.setupLCUZipForm();
320
+ break;
321
+ }
322
+ }
323
+ }
324
+ setupProcessorDetailsForm() {
325
+ this.ProcessorType = this.EditingApplication?.Processor?.Type || '';
326
+ // console.log('EDITING APP = ', this.EditingApplication);
327
+ if (this.EditingApplication != null) {
328
+ this.ProcessorDetailsFormGroup = this.formBldr.group({
329
+ procType: [this.ProcessorType, [Validators.required]],
330
+ });
331
+ this.setupDfsForm();
332
+ this.setupLcuTypeSubForm();
333
+ }
334
+ }
335
+ setupLCUGitHubForm() {
336
+ console.log("EditingApplication: ", this.EditingApplication);
337
+ this.ProcessorDetailsFormGroup.addControl('sourceControl', this.formBldr.control(this.EditingApplication.LowCodeUnit?.SourceControlLookup || '', [Validators.required]));
338
+ this.ProcessorDetailsFormGroup.addControl('buildPath', this.formBldr.control(this.EditingApplication.LowCodeUnit?.Path || '', [Validators.required]));
339
+ this.ProcessorDetailsFormGroup.addControl('build', this.formBldr.control(this.EditingApplication.LowCodeUnit?.Build || 'latest', [Validators.required]));
340
+ }
341
+ setupLCUApplicationPointerForm() {
342
+ this.ProcessorDetailsFormGroup.addControl('applicationId', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ApplicationID || '', [Validators.required]));
343
+ }
344
+ setupLCUSPAForm() {
345
+ this.ProcessorDetailsFormGroup.addControl('spaRoot', this.formBldr.control(this.EditingApplication.LowCodeUnit?.SPARoot || '', [Validators.required]));
346
+ }
347
+ setupLCUAPIForm() {
348
+ this.ProcessorDetailsFormGroup.addControl('methods', this.formBldr.control(this.EditingApplication.LookupConfig?.AllowedMethods?.join(' ') || '', []));
349
+ this.ProcessorDetailsFormGroup.addControl('apiRoot', this.formBldr.control(this.EditingApplication.LowCodeUnit?.APIRoot || '', [Validators.required]));
350
+ this.ProcessorDetailsFormGroup.addControl('security', this.formBldr.control(this.EditingApplication.LowCodeUnit?.Security || '', [Validators.required]));
351
+ }
352
+ setupLCUGitHubOAuthForm() {
353
+ this.ProcessorDetailsFormGroup.addControl('clientId', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ClientID || '', [Validators.required]));
354
+ this.ProcessorDetailsFormGroup.addControl('clientSecret', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ClientSecret || '', [Validators.required]));
355
+ }
356
+ setupLCUWordPressForm() {
357
+ this.ProcessorDetailsFormGroup.addControl('apiRoot', this.formBldr.control(this.EditingApplication.LowCodeUnit?.APIRoot || '', [Validators.required]));
358
+ }
359
+ setupProxyForm() {
360
+ this.LCUType = this.EditingApplication.LowCodeUnit?.Type || '';
361
+ this.ProcessorDetailsFormGroup.addControl('inboundPath', this.formBldr.control(this.EditingApplication.Processor?.InboundPath || '', [Validators.required]));
362
+ this.ProcessorDetailsFormGroup.addControl('lcuType', this.formBldr.control(this.LCUType, [Validators.required]));
363
+ }
364
+ setupRedirectForm() {
365
+ this.ProcessorDetailsFormGroup.addControl('redirect', this.formBldr.control(this.EditingApplication.Processor?.Redirect || '', [
366
+ Validators.required,
367
+ ]));
368
+ this.ProcessorDetailsFormGroup.addControl('permanent', this.formBldr.control(this.EditingApplication.Processor?.Permanent || false, []));
369
+ this.ProcessorDetailsFormGroup.addControl('preserveMethod', this.formBldr.control(this.EditingApplication.Processor?.PreserveMethod || false, []));
370
+ this.ProcessorDetailsFormGroup.addControl('includeRequest', this.formBldr.control(this.EditingApplication.Processor?.IncludeRequest || false, []));
371
+ this.DetermineTooltipText();
372
+ }
373
+ setupOAuthForm() {
374
+ this.LCUType = this.EditingApplication.LowCodeUnit?.Type || '';
375
+ this.ProcessorDetailsFormGroup.addControl('scopes', this.formBldr.control(this.EditingApplication.Processor?.Scopes?.Join(' ') || '', [Validators.required]));
376
+ this.ProcessorDetailsFormGroup.addControl('tokenLookup', this.formBldr.control(this.EditingApplication.Processor?.TokenLookup || '', [Validators.required]));
377
+ this.ProcessorDetailsFormGroup.addControl('lcuType', this.formBldr.control(this.LCUType, [Validators.required]));
378
+ }
379
+ setupLCUZipForm() {
380
+ this.ProcessorDetailsFormGroup.addControl('zipFile', this.formBldr.control(this.EditingApplication.LowCodeUnit?.ZipFile || '', [Validators.required]));
381
+ }
382
+ setupDfsForm() {
383
+ this.LCUType = this.EditingApplication.LowCodeUnit?.Type || '';
384
+ this.ProcessorDetailsFormGroup.addControl('defaultFile', this.formBldr.control(this.EditingApplication.Processor?.DefaultFile || 'index.html', [Validators.required]));
385
+ this.ProcessorDetailsFormGroup.addControl('lcuType', this.formBldr.control(this.LCUType, [Validators.required]));
386
+ }
387
+ setupProcessorTypeSubForm() {
388
+ this.cleanupProcessorTypeSubForm();
389
+ if (this.ProcessorType) {
390
+ switch (this.ProcessorType) {
391
+ case 'DFS':
392
+ this.setupDfsForm();
393
+ break;
394
+ case 'OAuth':
395
+ this.setupOAuthForm();
396
+ break;
397
+ case 'Proxy':
398
+ this.setupProxyForm();
399
+ break;
400
+ case 'Redirect':
401
+ this.setupRedirectForm();
402
+ break;
403
+ }
404
+ }
405
+ this.setupLcuTypeSubForm();
406
+ }
407
+ }
408
+ ProcessorDetailsFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ProcessorDetailsFormComponent, deps: [{ token: i1.ApplicationsFlowService }, { token: i2.FormBuilder }, { token: i3.EaCService }], target: i0.ɵɵFactoryTarget.Component });
409
+ ProcessorDetailsFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: ProcessorDetailsFormComponent, selector: "lcu-processor-details-form", inputs: { EditingApplication: ["editing-application", "EditingApplication"], EditingApplicationLookup: ["editing-application-lookup", "EditingApplicationLookup"], HasSaveButton: ["has-save-button", "HasSaveButton"], SourceControlLookups: ["source-control-lookups", "SourceControlLookups"], ProjectLookup: ["project-lookup", "ProjectLookup"] }, outputs: { SaveFormEvent: "save-form-event" }, ngImport: i0, template: "<form class=\"processor-details-form\" [formGroup]=\"ProcessorDetailsFormGroup\" (ngSubmit)=\"SaveProcessorDetails()\">\n<mat-card class=\"spread flow-card\">\n <mat-card-header>\n <mat-card-title> Processor Details </mat-card-title>\n </mat-card-header>\n\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n <ng-container *ngIf=\"!State?.Loading\">\n\n <mat-card-content>\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"procType\"\n (selectionChange)=\"ProcessorTypeChanged($event)\"\n required\n >\n <mat-option value=\"DFS\">View Package</mat-option>\n\n <mat-option value=\"Redirect\">Redirect</mat-option>\n\n <mat-option value=\"Proxy\">Proxy</mat-option>\n\n <mat-option value=\"OAuth\">OAuth</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"ProcessorType\">\n <div *ngSwitchCase=\"'DFS'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Default File\"\n formControlName=\"defaultFile\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"NPM\">NPM</mat-option>\n\n <mat-option value=\"GitHub\">GitHub</mat-option>\n\n <mat-option value=\"WordPress\">WordPress</mat-option>\n\n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHub'\">\n <!-- <lcu-source-control-form-controls\n [build-path]=\"EditingApplication?.LowCodeUnit?.Path\"\n [form-group]=\"ProcessorDetailsFormGroup\"\n [source-control]=\"DefaultSourceControl\"\n [use-branches]=\"false\"\n [use-build-path]=\"true\"\n ></lcu-source-control-form-controls> -->\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Source Control\"\n formControlName=\"sourceControl\"\n (selectionChange)=\"SourceControlChanged($event)\"\n required\n >\n <mat-option \n *ngFor=\"let scLookup of SourceControlLookups\" \n [value]=\"scLookup\">\n {{scLookup}}\n </mat-option>\n \n \n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n > \n <mat-select\n formControlName=\"buildPath\"\n placeholder=\"Build Path\"\n required\n >\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n \n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n\n <mat-form-field\n class=\"mat-full-width\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n >\n <input\n matInput\n placeholder=\"Build\"\n formControlName=\"build\"\n required\n />\n\n <mat-hint>\n Current Build:\n {{ EditingApplication?.LowCodeUnit?.CurrentBuild }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'NPM'\">\n <lcu-npm-package-select\n [npm-package]=\"EditingApplication?.LowCodeUnit?.Package\"\n [npm-package-version]=\"\n EditingApplication?.LowCodeUnit?.Version\n \"\n [form-group]=\"ProcessorDetailsFormGroup\"\n ></lcu-npm-package-select>\n\n <mat-hint>\n Current Version:\n {{ EditingApplication?.LowCodeUnit?.CurrentVersion }}\n </mat-hint>\n </div>\n\n <div *ngSwitchCase=\"'WordPress'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'OAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Scopes (space separated)\"\n formControlName=\"scopes\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Token Lookup\"\n formControlName=\"tokenLookup\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"GitHubOAuth\">GitHub</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHubOAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client ID\"\n formControlName=\"clientId\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client Secret\"\n formControlName=\"clientSecret\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Proxy'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Inbound Path\"\n formControlName=\"inboundPath\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"API\">API</mat-option>\n\n <mat-option value=\"SPA\">Single Page Application</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'API'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Allowed Methods (separate with spaces)\"\n formControlName=\"methods\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Security ({header}~{value})\"\n formControlName=\"security\"\n required\n />\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'SPA'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"SPA Root\"\n formControlName=\"spaRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Redirect'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Redirect URL\"\n formControlName=\"redirect\"\n required\n />\n </mat-form-field>\n\n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"permanent\">\n Is Permanent?\n </mat-slide-toggle>\n\n <mat-slide-toggle\n class=\"spread\"\n formControlName=\"preserveMethod\"\n >\n Preserve Method?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n (mouseenter)=\"DetermineTooltipText()\"\n matTooltip={{redirectTooltip}}\n >\n info_outline\n </mat-icon>\n\n \n </div>\n \n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"includeRequest\">\n Include Path and Query?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n matTooltip=\"Should the redirect include the path and query?\"\n >\n info_outline\n </mat-icon>\n </div>\n </div>\n </div>\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n *ngIf=\"HasSaveButton && !State?.Loading\"\n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!ProcessorDetailsFormGroup.valid || !ProcessorDetailsFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Processor Details\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n </mat-card-actions>\n\n </ng-container>\n \n</mat-card>\n</form>\n \n", styles: [""], components: [{ type: i4.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatCardHeader, selector: "mat-card-header" }, { type: i5.LoaderComponent, selector: "lcu-loader", inputs: ["diameter", "hide-inner", "loading"] }, { type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.NpmPackageSelectComponent, selector: "lcu-npm-package-select", inputs: ["npm-package", "npm-package-version", "form-group"] }, { type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i12.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i14.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i6.MatSuffix, selector: "[matSuffix]" }, { type: i15.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i16.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i16.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ProcessorDetailsFormComponent, decorators: [{
411
+ type: Component,
412
+ args: [{ selector: 'lcu-processor-details-form', template: "<form class=\"processor-details-form\" [formGroup]=\"ProcessorDetailsFormGroup\" (ngSubmit)=\"SaveProcessorDetails()\">\n<mat-card class=\"spread flow-card\">\n <mat-card-header>\n <mat-card-title> Processor Details </mat-card-title>\n </mat-card-header>\n\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n <ng-container *ngIf=\"!State?.Loading\">\n\n <mat-card-content>\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"procType\"\n (selectionChange)=\"ProcessorTypeChanged($event)\"\n required\n >\n <mat-option value=\"DFS\">View Package</mat-option>\n\n <mat-option value=\"Redirect\">Redirect</mat-option>\n\n <mat-option value=\"Proxy\">Proxy</mat-option>\n\n <mat-option value=\"OAuth\">OAuth</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"ProcessorType\">\n <div *ngSwitchCase=\"'DFS'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Default File\"\n formControlName=\"defaultFile\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"NPM\">NPM</mat-option>\n\n <mat-option value=\"GitHub\">GitHub</mat-option>\n\n <mat-option value=\"WordPress\">WordPress</mat-option>\n\n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHub'\">\n <!-- <lcu-source-control-form-controls\n [build-path]=\"EditingApplication?.LowCodeUnit?.Path\"\n [form-group]=\"ProcessorDetailsFormGroup\"\n [source-control]=\"DefaultSourceControl\"\n [use-branches]=\"false\"\n [use-build-path]=\"true\"\n ></lcu-source-control-form-controls> -->\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Source Control\"\n formControlName=\"sourceControl\"\n (selectionChange)=\"SourceControlChanged($event)\"\n required\n >\n <mat-option \n *ngFor=\"let scLookup of SourceControlLookups\" \n [value]=\"scLookup\">\n {{scLookup}}\n </mat-option>\n \n \n <!-- <mat-option value=\"Zip\">Zip</mat-option> -->\n </mat-select>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n > \n <mat-select\n formControlName=\"buildPath\"\n placeholder=\"Build Path\"\n required\n >\n <ng-container *ngFor=\"let buildPath of BuildPathOptions\">\n <mat-option [value]=\"buildPath\">\n {{ buildPath }}\n </mat-option>\n </ng-container>\n </mat-select>\n \n <mat-hint>\n The build path identifies which build action to use for your\n configuration.\n </mat-hint>\n </mat-form-field>\n\n <mat-form-field\n class=\"mat-full-width\"\n *ngIf=\"\n SourceControlFormControl?.valid\n \"\n >\n <input\n matInput\n placeholder=\"Build\"\n formControlName=\"build\"\n required\n />\n\n <mat-hint>\n Current Build:\n {{ EditingApplication?.LowCodeUnit?.CurrentBuild }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'NPM'\">\n <lcu-npm-package-select\n [npm-package]=\"EditingApplication?.LowCodeUnit?.Package\"\n [npm-package-version]=\"\n EditingApplication?.LowCodeUnit?.Version\n \"\n [form-group]=\"ProcessorDetailsFormGroup\"\n ></lcu-npm-package-select>\n\n <mat-hint>\n Current Version:\n {{ EditingApplication?.LowCodeUnit?.CurrentVersion }}\n </mat-hint>\n </div>\n\n <div *ngSwitchCase=\"'WordPress'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'OAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Scopes (space separated)\"\n formControlName=\"scopes\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Token Lookup\"\n formControlName=\"tokenLookup\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"GitHubOAuth\">GitHub</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'GitHubOAuth'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client ID\"\n formControlName=\"clientId\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Client Secret\"\n formControlName=\"clientSecret\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Proxy'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Inbound Path\"\n formControlName=\"inboundPath\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n placeholder=\"Type\"\n formControlName=\"lcuType\"\n (selectionChange)=\"LCUTypeChanged($event)\"\n required\n >\n <mat-option value=\"API\">API</mat-option>\n\n <mat-option value=\"SPA\">Single Page Application</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div [ngSwitch]=\"LCUType\">\n <div *ngSwitchCase=\"'API'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"API Root\"\n formControlName=\"apiRoot\"\n required\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Allowed Methods (separate with spaces)\"\n formControlName=\"methods\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Security ({header}~{value})\"\n formControlName=\"security\"\n required\n />\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"'SPA'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"SPA Root\"\n formControlName=\"spaRoot\"\n required\n />\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Redirect'\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n placeholder=\"Redirect URL\"\n formControlName=\"redirect\"\n required\n />\n </mat-form-field>\n\n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"permanent\">\n Is Permanent?\n </mat-slide-toggle>\n\n <mat-slide-toggle\n class=\"spread\"\n formControlName=\"preserveMethod\"\n >\n Preserve Method?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n (mouseenter)=\"DetermineTooltipText()\"\n matTooltip={{redirectTooltip}}\n >\n info_outline\n </mat-icon>\n\n \n </div>\n \n <div>\n <mat-slide-toggle \n class=\"spread\" \n formControlName=\"includeRequest\">\n Include Path and Query?\n </mat-slide-toggle>\n\n <mat-icon\n class=\"spread\"\n matSuffix\n matTooltip=\"Should the redirect include the path and query?\"\n >\n info_outline\n </mat-icon>\n </div>\n </div>\n </div>\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n *ngIf=\"HasSaveButton && !State?.Loading\"\n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!ProcessorDetailsFormGroup.valid || !ProcessorDetailsFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Processor Details\n </button>\n <lcu-loader [loading]=\"State?.Loading\"></lcu-loader>\n\n </mat-card-actions>\n\n </ng-container>\n \n</mat-card>\n</form>\n \n", styles: [""] }]
413
+ }], ctorParameters: function () { return [{ type: i1.ApplicationsFlowService }, { type: i2.FormBuilder }, { type: i3.EaCService }]; }, propDecorators: { EditingApplication: [{
414
+ type: Input,
415
+ args: ['editing-application']
416
+ }], EditingApplicationLookup: [{
417
+ type: Input,
418
+ args: ['editing-application-lookup']
419
+ }], HasSaveButton: [{
420
+ type: Input,
421
+ args: ['has-save-button']
422
+ }], SourceControlLookups: [{
423
+ type: Input,
424
+ args: ['source-control-lookups']
425
+ }], ProjectLookup: [{
426
+ type: Input,
427
+ args: ['project-lookup']
428
+ }], SaveFormEvent: [{
429
+ type: Output,
430
+ args: ['save-form-event']
431
+ }] } });
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc29yLWRldGFpbHMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24vc3JjL2xpYi9jb250cm9scy9wcm9jZXNzb3ItZGV0YWlscy1mb3JtL3Byb2Nlc3Nvci1kZXRhaWxzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvcHJvY2Vzc29yLWRldGFpbHMtZm9ybS9wcm9jZXNzb3ItZGV0YWlscy1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBdUIsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxvQkFBb0IsRUFBMEMsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVWxHLE1BQU0sT0FBTyw2QkFBNkI7SUF3SXhDLFlBQ1ksV0FBb0MsRUFDcEMsUUFBcUIsRUFDckIsTUFBa0I7UUFGbEIsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQTVIRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDO0lB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QU07Z0JBRVIsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEIsTUFBTTtnQkFFUixLQUFLLE9BQU87b0JBQ1YsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN0QixNQUFNO2dCQUVSLEtBQUssVUFBVTtvQkFDYixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekIsTUFBTTthQUNUO1NBQ0Y7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDOzswSEFuckJVLDZCQUE2Qjs4R0FBN0IsNkJBQTZCLHljQ3pCMUMsZy9WQTRWQTsyRkRuVWEsNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0QjtpS0FPL0Isa0JBQWtCO3NCQUR4QixLQUFLO3VCQUFDLHFCQUFxQjtnQkFJckIsd0JBQXdCO3NCQUQ5QixLQUFLO3VCQUFDLDRCQUE0QjtnQkFJNUIsYUFBYTtzQkFEbkIsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBSWpCLG9CQUFvQjtzQkFEMUIsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBSXhCLGFBQWE7c0JBRG5CLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUloQixhQUFhO3NCQURuQixNQUFNO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTZWxlY3RDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgQmFzZU1vZGVsZWRSZXNwb25zZSwgR3VpZCB9IGZyb20gJ0BsY3UvY29tbW9uJztcbmltcG9ydCB7IEVhQ0FwcGxpY2F0aW9uQXNDb2RlLCBFYUNFbnZpcm9ubWVudEFzQ29kZSwgRWFDU291cmNlQ29udHJvbCB9IGZyb20gJ0BzZW1hbnRpY2pzL2NvbW1vbic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbnNGbG93U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9ucy1mbG93LnNlcnZpY2UnO1xuaW1wb3J0IHsgRWFDU2VydmljZSwgU2F2ZUFwcGxpY2F0aW9uQXNDb2RlRXZlbnRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWFjLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25zRmxvd1N0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUvYXBwbGljYXRpb25zLWZsb3cuc3RhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsY3UtcHJvY2Vzc29yLWRldGFpbHMtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9jZXNzb3ItZGV0YWlscy1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvY2Vzc29yLWRldGFpbHMtZm9ybS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9jZXNzb3JEZXRhaWxzRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCdlZGl0aW5nLWFwcGxpY2F0aW9uJylcbiAgcHVibGljIEVkaXRpbmdBcHBsaWNhdGlvbjogRWFDQXBwbGljYXRpb25Bc0NvZGU7XG5cbiAgQElucHV0KCdlZGl0aW5nLWFwcGxpY2F0aW9uLWxvb2t1cCcpXG4gIHB1YmxpYyBFZGl0aW5nQXBwbGljYXRpb25Mb29rdXA6IHN0cmluZztcblxuICBASW5wdXQoJ2hhcy1zYXZlLWJ1dHRvbicpXG4gIHB1YmxpYyBIYXNTYXZlQnV0dG9uOiBib29sZWFuO1xuXG4gIEBJbnB1dCgnc291cmNlLWNvbnRyb2wtbG9va3VwcycpXG4gIHB1YmxpYyBTb3VyY2VDb250cm9sTG9va3VwczogQXJyYXk8c3RyaW5nPjtcblxuICBASW5wdXQoJ3Byb2plY3QtbG9va3VwJylcbiAgcHVibGljIFByb2plY3RMb29rdXA6IHN0cmluZztcblxuICBAT3V0cHV0KCdzYXZlLWZvcm0tZXZlbnQnKVxuICBwdWJsaWMgU2F2ZUZvcm1FdmVudDogRXZlbnRFbWl0dGVyPHt9PjtcbiAgXG5cbiAgcHVibGljIGdldCBBUElSb290Rm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5hcGlSb290O1xuICB9XG5cbiAgcHVibGljIGdldCBFbnZpcm9ubWVudCgpOiBFYUNFbnZpcm9ubWVudEFzQ29kZSB7XG4gICAgcmV0dXJuIHRoaXMuU3RhdGU/LkVhQz8uRW52aXJvbm1lbnRzW1xuICAgICAgdGhpcy5TdGF0ZT8uRWFDPy5FbnRlcnByaXNlPy5QcmltYXJ5RW52aXJvbm1lbnRcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIGdldCBCdWlsZEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuYnVpbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEJ1aWxkUGF0aEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuYnVpbGRQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBDbGllbnRJREZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuY2xpZW50SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IENsaWVudFNlY3JldEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuY2xpZW50U2VjcmV0O1xuICB9XG5cbiAgcHVibGljIGdldCBEZWZhdWx0RmlsZUZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuZGVmYXVsdEZpbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IERlZmF1bHRTb3VyY2VDb250cm9sKCk6IEVhQ1NvdXJjZUNvbnRyb2wge1xuICAgIHJldHVybiB7XG4gICAgICBPcmdhbml6YXRpb246IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uT3JnYW5pemF0aW9uLFxuICAgICAgUmVwb3NpdG9yeTogdGhpcy5FZGl0aW5nQXBwbGljYXRpb24/Lkxvd0NvZGVVbml0Py5SZXBvc2l0b3J5LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0IEluYm91bmRQYXRoRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5pbmJvdW5kUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgSW5jbHVkZVJlcXVlc3RGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLmluY2x1ZGVSZXF1ZXN0O1xuICB9XG5cbiAgcHVibGljIGdldCBNZXRob2RzRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5tZXRob2RzO1xuICB9XG5cbiAgcHVibGljIGdldCBQYWNrYWdlRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy5wYWNrYWdlO1xuICB9XG5cbiAgcHVibGljIGdldCBQZXJtYW5lbnRGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLnBlcm1hbmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgUHJlc2VydmVNZXRob2RGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLnByZXNlcnZlTWV0aG9kO1xuICB9XG5cbiAgcHVibGljIGdldCBSZWRpcmVjdEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMucmVkaXJlY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFNjb3Blc0Zvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc2NvcGVzO1xuICB9XG5cbiAgcHVibGljIGdldCBTZWN1cml0eUZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc2VjdXJpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFN0YXRlKCk6IEFwcGxpY2F0aW9uc0Zsb3dTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjU3ZjLlN0YXRlXG4gIH1cblxuICBwdWJsaWMgZ2V0IFNvdXJjZUNvbnRyb2xzKCk6IHsgW2xvb2t1cDogc3RyaW5nXTogRWFDU291cmNlQ29udHJvbCB9IHtcbiAgICByZXR1cm4gdGhpcy5FbnZpcm9ubWVudD8uU291cmNlcyB8fCB7fTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU291cmNlQ29udHJvbEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc291cmNlQ29udHJvbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU1BBUm9vdEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cD8uY29udHJvbHMuc3BhUm9vdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgVG9rZW5Mb29rdXBGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXA/LmNvbnRyb2xzLnRva2VuTG9va3VwO1xuICB9XG5cbiAgcHVibGljIGdldCBWZXJzaW9uRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy52ZXJzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBaaXBGaWxlRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwPy5jb250cm9scy56aXBGaWxlO1xuICB9XG5cbiAgcHVibGljIEJ1aWxkUGF0aE9wdGlvbnM6IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyBJc1Blcm1hbmVudDogYm9vbGVhbjtcblxuICBwdWJsaWMgSXNQcmVzZXJ2ZTogYm9vbGVhbjtcblxuICBwdWJsaWMgTENVVHlwZTogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWRpcmVjdFRvb2x0aXA6IHN0cmluZztcblxuICBwdWJsaWMgUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gIHB1YmxpYyBQcm9jZXNzb3JUeXBlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGFwcHNGbG93U3ZjOiBBcHBsaWNhdGlvbnNGbG93U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZm9ybUJsZHI6IEZvcm1CdWlsZGVyLCBcbiAgICBwcm90ZWN0ZWQgZWFjU3ZjOiBFYUNTZXJ2aWNlLCkge1xuICAgIHRoaXMucmVkaXJlY3RUb29sdGlwID0gJyc7XG5cbiAgICB0aGlzLkhhc1NhdmVCdXR0b24gPSB0cnVlO1xuXG4gICAgdGhpcy5TYXZlRm9ybUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5FZGl0aW5nQXBwbGljYXRpb24pIHtcbiAgICAgIHRoaXMuQ3JlYXRlTmV3QXBwbGljYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXR1cFByb2Nlc3NvckRldGFpbHNGb3JtKCk7XG4gICAgfVxuICAgIFxuICB9XG5cbiAgcHVibGljIENyZWF0ZU5ld0FwcGxpY2F0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuU2V0RWRpdGluZ0FwcGxpY2F0aW9uKEd1aWQuQ3JlYXRlUmF3KCkpO1xuICB9XG5cbiAgcHVibGljIERldGVybWluZVRvb2x0aXBUZXh0KCkge1xuICAgIGxldCBwZXJtYW5lbnRWYWx1ZSA9IHRoaXMuUGVybWFuZW50Rm9ybUNvbnRyb2wudmFsdWU7XG4gICAgbGV0IHByZXNlcnZlVmFsdWUgPSB0aGlzLlByZXNlcnZlTWV0aG9kRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAocGVybWFuZW50VmFsdWUgPT09IHRydWUgJiYgcHJlc2VydmVWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMucmVkaXJlY3RUb29sdGlwID0gJzMwMSDigJMgUGVybWFuZW50IGFuZCBOb3QgUHJlc2VydmUnO1xuICAgIH0gZWxzZSBpZiAocGVybWFuZW50VmFsdWUgPT09IGZhbHNlICYmIHByZXNlcnZlVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9vbHRpcCA9ICczMDIg4oCTIE5vdCBQZXJtYW5lbnQgYW5kIE5vdCBQcmVzZXJ2ZSc7XG4gICAgfSBlbHNlIGlmIChwZXJtYW5lbnRWYWx1ZSA9PT0gZmFsc2UgJiYgcHJlc2VydmVWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5yZWRpcmVjdFRvb2x0aXAgPSAnMzA3IOKAkyBOb3QgUGVybWFuZW50IGFuZCBQcmVzZXJ2ZSc7XG4gICAgfSBlbHNlIGlmIChwZXJtYW5lbnRWYWx1ZSA9PT0gdHJ1ZSAmJiBwcmVzZXJ2ZVZhbHVlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9vbHRpcCA9ICczMDgg4oCTIFBlcm1hbmVudCBhbmQgUHJlc2VydmUnO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBTYXZlUHJvY2Vzc29yRGV0YWlscygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGFwcDogRWFDQXBwbGljYXRpb25Bc0NvZGUgPSB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbjtcbiAgICBhcHAuTG9va3VwQ29uZmlnLkFsbG93ZWRNZXRob2RzID1cbiAgICAgIHRoaXMuTWV0aG9kc0Zvcm1Db250cm9sPy52YWx1ZVxuICAgICAgICA/LnNwbGl0KCcgJylcbiAgICAgICAgLmZpbHRlcigodjogc3RyaW5nKSA9PiAhIXYpO1xuICAgIGFwcC5Qcm9jZXNzb3IuVHlwZSA9IHRoaXMuUHJvY2Vzc29yVHlwZTtcblxuICAgIHN3aXRjaCAoYXBwLlByb2Nlc3Nvci5UeXBlKSB7XG4gICAgICBjYXNlICdERlMnOlxuICAgICAgICBhcHAuUHJvY2Vzc29yLkRlZmF1bHRGaWxlID1cbiAgICAgICAgICB0aGlzLkRlZmF1bHRGaWxlRm9ybUNvbnRyb2wudmFsdWUgfHxcbiAgICAgICAgICAnaW5kZXguaHRtbCc7XG5cbiAgICAgICAgYXBwLkxvd0NvZGVVbml0ID0ge1xuICAgICAgICAgIFR5cGU6IHRoaXMuTENVVHlwZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGFwcC5Mb3dDb2RlVW5pdC5UeXBlKSB7XG4gICAgICAgICAgY2FzZSAnR2l0SHViJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5Pcmdhbml6YXRpb24gPVxuICAgICAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xzW1xuICAgICAgICAgICAgICAgIHRoaXMuU291cmNlQ29udHJvbEZvcm1Db250cm9sLnZhbHVlXG4gICAgICAgICAgICAgIF0uT3JnYW5pemF0aW9uO1xuXG4gICAgICAgICAgICBhcHAuTG93Q29kZVVuaXQuUmVwb3NpdG9yeSA9XG4gICAgICAgICAgICAgIHRoaXMuU291cmNlQ29udHJvbHNbXG4gICAgICAgICAgICAgICAgdGhpcy5Tb3VyY2VDb250cm9sRm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgICAgICAgXS5SZXBvc2l0b3J5O1xuXG4gICAgICAgICAgICBhcHAuTG93Q29kZVVuaXQuQnVpbGQgPVxuICAgICAgICAgICAgICB0aGlzLkJ1aWxkRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5QYXRoID1cbiAgICAgICAgICAgICAgdGhpcy5CdWlsZFBhdGhGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LlNvdXJjZUNvbnRyb2xMb29rdXAgPVxuICAgICAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnTlBNJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5QYWNrYWdlID1cbiAgICAgICAgICAgICAgdGhpcy5QYWNrYWdlRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5WZXJzaW9uID1cbiAgICAgICAgICAgICAgdGhpcy5WZXJzaW9uRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1dvcmRQcmVzcyc6XG4gICAgICAgICAgICBhcHAuTG93Q29kZVVuaXQuQVBJUm9vdCA9XG4gICAgICAgICAgICAgIHRoaXMuQVBJUm9vdEZvcm1Db250cm9sLnZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdaaXAnOlxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LlppcEZpbGUgPVxuICAgICAgICAgICAgICB0aGlzLlppcEZpbGVGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdPQXV0aCc6XG4gICAgICAgIGFwcC5Qcm9jZXNzb3IuU2NvcGVzID1cbiAgICAgICAgICB0aGlzLlNjb3Blc0Zvcm1Db250cm9sLnZhbHVlLnNwbGl0KCcgJyk7XG5cbiAgICAgICAgYXBwLlByb2Nlc3Nvci5Ub2tlbkxvb2t1cCA9XG4gICAgICAgICAgdGhpcy5Ub2tlbkxvb2t1cEZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICAgIGFwcC5Mb3dDb2RlVW5pdCA9IHtcbiAgICAgICAgICBUeXBlOiB0aGlzLkxDVVR5cGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChhcHAuTG93Q29kZVVuaXQuVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0dpdEh1Yk9BdXRoJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5DbGllbnRJRCA9XG4gICAgICAgICAgICAgIHRoaXMuQ2xpZW50SURGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LkNsaWVudFNlY3JldCA9XG4gICAgICAgICAgICAgIHRoaXMuQ2xpZW50U2VjcmV0Rm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnUHJveHknOlxuICAgICAgICBhcHAuUHJvY2Vzc29yLkluYm91bmRQYXRoID1cbiAgICAgICAgICB0aGlzLkluYm91bmRQYXRoRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgYXBwLkxvd0NvZGVVbml0ID0ge1xuICAgICAgICAgIFR5cGU6IHRoaXMuTENVVHlwZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGFwcC5Mb3dDb2RlVW5pdC5UeXBlKSB7XG4gICAgICAgICAgY2FzZSAnQVBJJzpcbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5BUElSb290ID1cbiAgICAgICAgICAgICAgdGhpcy5BUElSb290Rm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgICAgIGFwcC5Mb3dDb2RlVW5pdC5TZWN1cml0eSA9XG4gICAgICAgICAgICAgIHRoaXMuU2VjdXJpdHlGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdTUEEnOlxuICAgICAgICAgICAgYXBwLkxvd0NvZGVVbml0LlNQQVJvb3QgPVxuICAgICAgICAgICAgICB0aGlzLlNQQVJvb3RGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdSZWRpcmVjdCc6XG4gICAgICAgIGFwcC5Qcm9jZXNzb3IuSW5jbHVkZVJlcXVlc3QgPVxuICAgICAgICAgICEhdGhpcy5JbmNsdWRlUmVxdWVzdEZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgICAgIGFwcC5Qcm9jZXNzb3IuUGVybWFuZW50ID1cbiAgICAgICAgICAhIXRoaXMuUGVybWFuZW50Rm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgYXBwLlByb2Nlc3Nvci5QcmVzZXJ2ZU1ldGhvZCA9XG4gICAgICAgICAgISF0aGlzLlByZXNlcnZlTWV0aG9kRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgYXBwLlByb2Nlc3Nvci5SZWRpcmVjdCA9XG4gICAgICAgICAgdGhpcy5SZWRpcmVjdEZvcm1Db250cm9sLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIWFwcC5Mb29rdXBDb25maWcuUGF0aFJlZ2V4LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgYXBwLkxvb2t1cENvbmZpZy5QYXRoUmVnZXggPSBgLyR7YXBwLkxvb2t1cENvbmZpZy5QYXRoUmVnZXh9YDtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlQXBwUmVxOiBTYXZlQXBwbGljYXRpb25Bc0NvZGVFdmVudFJlcXVlc3QgPSB7XG4gICAgICBQcm9qZWN0TG9va3VwOiB0aGlzLlByb2plY3RMb29rdXAsXG4gICAgICBBcHBsaWNhdGlvbjogYXBwLFxuICAgICAgQXBwbGljYXRpb25Mb29rdXA6IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uTG9va3VwIHx8IEd1aWQuQ3JlYXRlUmF3KCksXG4gICAgfTtcblxuICAgIHRoaXMuZWFjU3ZjLlNhdmVBcHBsaWNhdGlvbkFzQ29kZShzYXZlQXBwUmVxKS50aGVuKHJlcyA9PntcbiAgICAgIHRoaXMuU2F2ZUZvcm1FdmVudC5lbWl0KHJlcyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgU2V0RWRpdGluZ0FwcGxpY2F0aW9uKGFwcExvb2t1cDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24gPSBuZXcgRWFDQXBwbGljYXRpb25Bc0NvZGU7XG4gICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb25Mb29rdXAgPSBhcHBMb29rdXA7XG5cbiAgICB0aGlzLnNldHVwUHJvY2Vzc29yRGV0YWlsc0Zvcm0oKTtcbiAgfVxuXG4gIHB1YmxpYyBTb3VyY2VDb250cm9sQ2hhbmdlZChldmVudDogYW55KXtcbiAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gIH1cblxuICBwdWJsaWMgUHJvY2Vzc29yVHlwZUNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yVHlwZSA9IGV2ZW50LnZhbHVlO1xuXG4gICAgdGhpcy5zZXR1cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgTENVVHlwZUNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIHRoaXMuTENVVHlwZSA9IGV2ZW50LnZhbHVlO1xuXG4gICAgdGhpcy5zZXR1cExjdVR5cGVTdWJGb3JtKCk7XG4gIH1cblxuICAvL0hFTFBFUlNcblxuICBwcm90ZWN0ZWQgY2xlYW51cExjdVR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdtZXRob2RzJyk7XG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ2FwaVJvb3QnKTtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnc2VjdXJpdHknKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdzcGFSb290Jyk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnYXBwbGljYXRpb25JZCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdzb3VyY2VDb250cm9sJyk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnYnVpbGQnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdjbGllbnRJZCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdjbGllbnRTZWNyZXQnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCd6aXBGaWxlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYW51cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdkZWZhdWx0RmlsZScpO1xuXG4gICAgLy8gdGhpcy5BcHBsaWNhdGlvbkZvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdkZnNMY3VUeXBlJyk7XG5cbiAgICAvLyB0aGlzLkFwcGxpY2F0aW9uRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ29hdXRoTGN1VHlwZScpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdzY29wZXMnKTtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgndG9rZW5Mb29rdXAnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdpbmJvdW5kUGF0aCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdwcm94eUxjdVR5cGUnKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdpbmNsdWRlUmVxdWVzdCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdyZWRpcmVjdCcpO1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdwZXJtYW5lbnQnKTtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgncHJlc2VydmVNZXRob2QnKTtcblxuICAgIHRoaXMuY2xlYW51cExjdVR5cGVTdWJGb3JtKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdEJ1aWxkUGF0aHMoKTogdm9pZCB7XG4gICAgICB0aGlzLlN0YXRlLkxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB0aGlzLmFwcHNGbG93U3ZjXG4gICAgICAgIC5MaXN0QnVpbGRQYXRocyhcbiAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xzW1xuICAgICAgICAgICAgdGhpcy5Tb3VyY2VDb250cm9sRm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgICBdLk9yZ2FuaXphdGlvbixcbiAgICAgICAgICB0aGlzLlNvdXJjZUNvbnRyb2xzW1xuICAgICAgICAgICAgdGhpcy5Tb3VyY2VDb250cm9sRm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgICBdLlJlcG9zaXRvcnlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxzdHJpbmdbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJ1aWxkUGF0aE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuU3RhdGUuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuQnVpbGRQYXRoT3B0aW9ucz8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLkJ1aWxkUGF0aEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuQnVpbGRQYXRoT3B0aW9uc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICBcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cExjdVR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cExjdVR5cGVTdWJGb3JtKCk7XG5cbiAgICAvLyB0aGlzLkFwcGxpY2F0aW9uRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ3BhY2thZ2UnKTtcbiAgICAvLyB0aGlzLkFwcGxpY2F0aW9uRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ3ZlcnNpb24nKTtcblxuICAgIGlmICh0aGlzLkxDVVR5cGUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5MQ1VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ0FQSSc6XG4gICAgICAgICAgdGhpcy5zZXR1cExDVUFQSUZvcm0oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdBcHBsaWNhdGlvblBvaW50ZXInOlxuICAgICAgICAgIHRoaXMuc2V0dXBMQ1VBcHBsaWNhdGlvblBvaW50ZXJGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnR2l0SHViJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVR2l0SHViRm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0dpdEh1Yk9BdXRoJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVR2l0SHViT0F1dGhGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnV29yZFByZXNzJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVV29yZFByZXNzRm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIGNhc2UgJ05QTSc6XG4gICAgICAgIC8vICAgdGhpcy5zZXR1cExDVU5QTUZvcm0oKTtcbiAgICAgICAgLy8gICBicmVhaztcblxuICAgICAgICBjYXNlICdTUEEnOlxuICAgICAgICAgIHRoaXMuc2V0dXBMQ1VTUEFGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnWmlwJzpcbiAgICAgICAgICB0aGlzLnNldHVwTENVWmlwRm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cFByb2Nlc3NvckRldGFpbHNGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yVHlwZSA9IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uPy5Qcm9jZXNzb3I/LlR5cGUgfHwgJyc7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnRURJVElORyBBUFAgPSAnLCB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbik7XG5cbiAgICBpZiAodGhpcy5FZGl0aW5nQXBwbGljYXRpb24gIT0gbnVsbCkge1xuICAgICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwID0gdGhpcy5mb3JtQmxkci5ncm91cCh7XG4gICAgICAgIHByb2NUeXBlOiBbdGhpcy5Qcm9jZXNzb3JUeXBlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldHVwRGZzRm9ybSgpO1xuXG4gICAgICB0aGlzLnNldHVwTGN1VHlwZVN1YkZvcm0oKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VHaXRIdWJGb3JtKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiRWRpdGluZ0FwcGxpY2F0aW9uOiBcIix0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbiApXG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdzb3VyY2VDb250cm9sJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG93Q29kZVVuaXQ/LlNvdXJjZUNvbnRyb2xMb29rdXAgfHwgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdidWlsZFBhdGgnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uUGF0aCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuXG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnYnVpbGQnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uQnVpbGQgfHwgJ2xhdGVzdCcsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VBcHBsaWNhdGlvblBvaW50ZXJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2FwcGxpY2F0aW9uSWQnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uQXBwbGljYXRpb25JRCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIFxuXG4gIHByb3RlY3RlZCBzZXR1cExDVVNQQUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnc3BhUm9vdCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5TUEFSb290IHx8ICcnLFxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldHVwTENVQVBJRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdtZXRob2RzJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG9va3VwQ29uZmlnPy5BbGxvd2VkTWV0aG9kcz8uam9pbignICcpIHx8ICcnLFxuICAgICAgICBbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdhcGlSb290JyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG93Q29kZVVuaXQ/LkFQSVJvb3QgfHwgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdzZWN1cml0eScsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5TZWN1cml0eSB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cExDVUdpdEh1Yk9BdXRoRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdjbGllbnRJZCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5DbGllbnRJRCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2NsaWVudFNlY3JldCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5DbGllbnRTZWNyZXQgfHwgJycsXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VXb3JkUHJlc3NGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2FwaVJvb3QnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uQVBJUm9vdCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cFByb3h5Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLkxDVVR5cGUgPSB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uVHlwZSB8fCAnJztcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2luYm91bmRQYXRoJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5JbmJvdW5kUGF0aCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2xjdVR5cGUnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKHRoaXMuTENVVHlwZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBSZWRpcmVjdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAncmVkaXJlY3QnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uUmVkaXJlY3QgfHwgJycsIFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIF0pXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ3Blcm1hbmVudCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uUGVybWFuZW50IHx8IGZhbHNlLFxuICAgICAgICBbXVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdwcmVzZXJ2ZU1ldGhvZCcsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uUHJlc2VydmVNZXRob2QgfHwgZmFsc2UsXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2luY2x1ZGVSZXF1ZXN0JyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5JbmNsdWRlUmVxdWVzdCB8fCBmYWxzZSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5EZXRlcm1pbmVUb29sdGlwVGV4dCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldHVwT0F1dGhGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuTENVVHlwZSA9IHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLkxvd0NvZGVVbml0Py5UeXBlIHx8ICcnO1xuXG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnc2NvcGVzJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5TY29wZXM/LkpvaW4oJyAnKSB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ3Rva2VuTG9va3VwJyxcbiAgICAgIHRoaXMuZm9ybUJsZHIuY29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uUHJvY2Vzc29yPy5Ub2tlbkxvb2t1cCB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2xjdVR5cGUnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKHRoaXMuTENVVHlwZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBMQ1VaaXBGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ3ppcEZpbGUnLFxuICAgICAgdGhpcy5mb3JtQmxkci5jb250cm9sKFxuICAgICAgICB0aGlzLkVkaXRpbmdBcHBsaWNhdGlvbi5Mb3dDb2RlVW5pdD8uWmlwRmlsZSB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cERmc0Zvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5MQ1VUeXBlID0gdGhpcy5FZGl0aW5nQXBwbGljYXRpb24uTG93Q29kZVVuaXQ/LlR5cGUgfHwgJyc7XG5cbiAgICB0aGlzLlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICdkZWZhdWx0RmlsZScsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2woXG4gICAgICAgIHRoaXMuRWRpdGluZ0FwcGxpY2F0aW9uLlByb2Nlc3Nvcj8uRGVmYXVsdEZpbGUgfHwgJ2luZGV4Lmh0bWwnLFxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5Qcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAnbGN1VHlwZScsXG4gICAgICB0aGlzLmZvcm1CbGRyLmNvbnRyb2wodGhpcy5MQ1VUeXBlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cFByb2Nlc3NvclR5cGVTdWJGb3JtKCk7XG5cbiAgICBpZiAodGhpcy5Qcm9jZXNzb3JUeXBlKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuUHJvY2Vzc29yVHlwZSkge1xuICAgICAgICBjYXNlICdERlMnOlxuICAgICAgICAgIHRoaXMuc2V0dXBEZnNGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnT0F1dGgnOlxuICAgICAgICAgIHRoaXMuc2V0dXBPQXV0aEZvcm0oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdQcm94eSc6XG4gICAgICAgICAgdGhpcy5zZXR1cFByb3h5Rm9ybSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ1JlZGlyZWN0JzpcbiAgICAgICAgICB0aGlzLnNldHVwUmVkaXJlY3RGb3JtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cExjdVR5cGVTdWJGb3JtKCk7XG4gIH1cbn1cbiIsIjxmb3JtIGNsYXNzPVwicHJvY2Vzc29yLWRldGFpbHMtZm9ybVwiIFtmb3JtR3JvdXBdPVwiUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJTYXZlUHJvY2Vzc29yRGV0YWlscygpXCI+XG48bWF0LWNhcmQgY2xhc3M9XCJzcHJlYWQgZmxvdy1jYXJkXCI+XG4gICAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICAgIDxtYXQtY2FyZC10aXRsZT4gUHJvY2Vzc29yIERldGFpbHMgPC9tYXQtY2FyZC10aXRsZT5cbiAgICA8L21hdC1jYXJkLWhlYWRlcj5cblxuICAgIDxsY3UtbG9hZGVyIFtsb2FkaW5nXT1cIlN0YXRlPy5Mb2FkaW5nXCI+PC9sY3UtbG9hZGVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFTdGF0ZT8uTG9hZGluZ1wiPlxuXG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvY1R5cGVcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiUHJvY2Vzc29yVHlwZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiREZTXCI+VmlldyBQYWNrYWdlPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJSZWRpcmVjdFwiPlJlZGlyZWN0PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJQcm94eVwiPlByb3h5PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJPQXV0aFwiPk9BdXRoPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJQcm9jZXNzb3JUeXBlXCI+XG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidERlMnXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRlZmF1bHQgRmlsZVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlZmF1bHRGaWxlXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsY3VUeXBlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJMQ1VUeXBlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJOUE1cIj5OUE08L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJHaXRIdWJcIj5HaXRIdWI8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJXb3JkUHJlc3NcIj5Xb3JkUHJlc3M8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgPCEtLSA8bWF0LW9wdGlvbiB2YWx1ZT1cIlppcFwiPlppcDwvbWF0LW9wdGlvbj4gLS0+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxkaXYgW25nU3dpdGNoXT1cIkxDVVR5cGVcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidHaXRIdWInXCI+XG4gICAgICAgICAgICAgIDwhLS0gPGxjdS1zb3VyY2UtY29udHJvbC1mb3JtLWNvbnRyb2xzXG4gICAgICAgICAgICAgICAgW2J1aWxkLXBhdGhdPVwiRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uUGF0aFwiXG4gICAgICAgICAgICAgICAgW2Zvcm0tZ3JvdXBdPVwiUHJvY2Vzc29yRGV0YWlsc0Zvcm1Hcm91cFwiXG4gICAgICAgICAgICAgICAgW3NvdXJjZS1jb250cm9sXT1cIkRlZmF1bHRTb3VyY2VDb250cm9sXCJcbiAgICAgICAgICAgICAgICBbdXNlLWJyYW5jaGVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbdXNlLWJ1aWxkLXBhdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2xjdS1zb3VyY2UtY29udHJvbC1mb3JtLWNvbnRyb2xzPiAtLT5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNvdXJjZSBDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNvdXJjZUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJTb3VyY2VDb250cm9sQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzY0xvb2t1cCBvZiBTb3VyY2VDb250cm9sTG9va3Vwc1wiIFxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2NMb29rdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgIHt7c2NMb29rdXB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgXG4gICAgXG4gICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtb3B0aW9uIHZhbHVlPVwiWmlwXCI+WmlwPC9tYXQtb3B0aW9uPiAtLT5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGggd2l0aC1oaW50XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRyb2xGb3JtQ29udHJvbD8udmFsaWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+ICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJidWlsZFBhdGhcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCdWlsZCBQYXRoXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnVpbGRQYXRoIG9mIEJ1aWxkUGF0aE9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImJ1aWxkUGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGJ1aWxkUGF0aCB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgVGhlIGJ1aWxkIHBhdGggaWRlbnRpZmllcyB3aGljaCBidWlsZCBhY3Rpb24gdG8gdXNlIGZvciB5b3VyXG4gICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRyb2xGb3JtQ29udHJvbD8udmFsaWRcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCdWlsZFwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJidWlsZFwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICBDdXJyZW50IEJ1aWxkOlxuICAgICAgICAgICAgICAgICAge3sgRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uQ3VycmVudEJ1aWxkIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTlBNJ1wiPlxuICAgICAgICAgICAgICA8bGN1LW5wbS1wYWNrYWdlLXNlbGVjdFxuICAgICAgICAgICAgICAgIFtucG0tcGFja2FnZV09XCJFZGl0aW5nQXBwbGljYXRpb24/Lkxvd0NvZGVVbml0Py5QYWNrYWdlXCJcbiAgICAgICAgICAgICAgICBbbnBtLXBhY2thZ2UtdmVyc2lvbl09XCJcbiAgICAgICAgICAgICAgICAgIEVkaXRpbmdBcHBsaWNhdGlvbj8uTG93Q29kZVVuaXQ/LlZlcnNpb25cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtmb3JtLWdyb3VwXT1cIlByb2Nlc3NvckRldGFpbHNGb3JtR3JvdXBcIlxuICAgICAgICAgICAgICA+PC9sY3UtbnBtLXBhY2thZ2Utc2VsZWN0PlxuXG4gICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICBDdXJyZW50IFZlcnNpb246XG4gICAgICAgICAgICAgICAge3sgRWRpdGluZ0FwcGxpY2F0aW9uPy5Mb3dDb2RlVW5pdD8uQ3VycmVudFZlcnNpb24gfX1cbiAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInV29yZFByZXNzJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQVBJIFJvb3RcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXBpUm9vdFwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ09BdXRoJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTY29wZXMgKHNwYWNlIHNlcGFyYXRlZClcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzY29wZXNcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRva2VuIExvb2t1cFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRva2VuTG9va3VwXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsY3VUeXBlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJMQ1VUeXBlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJHaXRIdWJPQXV0aFwiPkdpdEh1YjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiTENVVHlwZVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0dpdEh1Yk9BdXRoJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2xpZW50IElEXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNsaWVudElkXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2xpZW50IFNlY3JldFwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjbGllbnRTZWNyZXRcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidQcm94eSdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSW5ib3VuZCBQYXRoXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5ib3VuZFBhdGhcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxjdVR5cGVcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIkxDVVR5cGVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFQSVwiPkFQSTwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlNQQVwiPlNpbmdsZSBQYWdlIEFwcGxpY2F0aW9uPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICA8ZGl2IFtuZ1N3aXRjaF09XCJMQ1VUeXBlXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInQVBJJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQVBJIFJvb3RcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXBpUm9vdFwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFsbG93ZWQgTWV0aG9kcyAoc2VwYXJhdGUgd2l0aCBzcGFjZXMpXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1ldGhvZHNcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlY3VyaXR5ICh7aGVhZGVyfX57dmFsdWV9KVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWN1cml0eVwiXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ1NQQSdcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNQQSBSb290XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNwYVJvb3RcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidSZWRpcmVjdCdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVkaXJlY3QgVVJMXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVkaXJlY3RcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFxuICAgICAgICAgICAgICBjbGFzcz1cInNwcmVhZFwiIFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwZXJtYW5lbnRcIj5cbiAgICAgICAgICAgICAgSXMgUGVybWFuZW50P1xuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuXG4gICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICBjbGFzcz1cInNwcmVhZFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByZXNlcnZlTWV0aG9kXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUHJlc2VydmUgTWV0aG9kP1xuICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuXG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgY2xhc3M9XCJzcHJlYWRcIlxuICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiRGV0ZXJtaW5lVG9vbHRpcFRleHQoKVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9e3tyZWRpcmVjdFRvb2x0aXB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBpbmZvX291dGxpbmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgICAgICAgIFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBcbiAgICAgICAgICAgICAgY2xhc3M9XCJzcHJlYWRcIiBcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5jbHVkZVJlcXVlc3RcIj5cbiAgICAgICAgICAgICAgSW5jbHVkZSBQYXRoIGFuZCBRdWVyeT9cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgIGNsYXNzPVwic3ByZWFkXCJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTaG91bGQgdGhlIHJlZGlyZWN0IGluY2x1ZGUgdGhlIHBhdGggYW5kIHF1ZXJ5P1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIGluZm9fb3V0bGluZVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIj5cblxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICpuZ0lmPVwiSGFzU2F2ZUJ1dHRvbiAmJiAhU3RhdGU/LkxvYWRpbmdcIlxuICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIiBcbiAgICAgICAgICBmeEZsZXg9XCIxMDAlXCIgXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFQcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLnZhbGlkIHx8ICFQcm9jZXNzb3JEZXRhaWxzRm9ybUdyb3VwLmRpcnR5XCI+XG4gICAgICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxuICAgICAgICAgIFNhdmUgUHJvY2Vzc29yIERldGFpbHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxsY3UtbG9hZGVyIFtsb2FkaW5nXT1cIlN0YXRlPy5Mb2FkaW5nXCI+PC9sY3UtbG9hZGVyPlxuXG4gICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxuXG4gIDwvbmctY29udGFpbmVyPlxuICBcbjwvbWF0LWNhcmQ+XG48L2Zvcm0+XG4gIFxuIl19