@lowcodeunit/applications-flow-common 1.33.93-lets-get-social-ish → 1.33.99-lets-get-social-ish

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 (79) hide show
  1. package/bundles/lowcodeunit-applications-flow-common.umd.js +1149 -493
  2. package/bundles/lowcodeunit-applications-flow-common.umd.js.map +1 -1
  3. package/bundles/lowcodeunit-applications-flow-common.umd.min.js +2 -2
  4. package/bundles/lowcodeunit-applications-flow-common.umd.min.js.map +1 -1
  5. package/esm2015/lcu.api.js +2 -1
  6. package/esm2015/lib/applications-flow.module.js +22 -6
  7. package/esm2015/lib/controls/build-pipeline-form/build-pipeline-form.component.js +69 -0
  8. package/esm2015/lib/controls/devops-source-control-form/devops-source-control-form.component.js +418 -0
  9. package/esm2015/lib/controls/processor-details-form/processor-details-form.component.js +2 -2
  10. package/esm2015/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.js +22 -0
  11. package/esm2015/lib/dialogs/source-control-dialog/source-control-dialog.component.js +22 -0
  12. package/esm2015/lib/elements/base-form/base-form.component.js +5 -5
  13. package/esm2015/lib/elements/projects/controls/builds/builds.component.js +4 -9
  14. package/esm2015/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.js +6 -6
  15. package/esm2015/lib/elements/projects/controls/forms/source-control/source-control.component.js +3 -6
  16. package/esm2015/lib/elements/projects/controls/header/header.component.js +7 -7
  17. package/esm2015/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.js +1 -1
  18. package/esm2015/lib/elements/projects/controls/project-items/project-items.component.js +7 -7
  19. package/esm2015/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.js +8 -10
  20. package/esm2015/lib/elements/projects/controls/tabs/devops/devops.component.js +7 -7
  21. package/esm2015/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.js +7 -7
  22. package/esm2015/lib/elements/projects/controls/tabs/domains/domains.component.js +6 -6
  23. package/esm2015/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.js +6 -6
  24. package/esm2015/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.js +6 -6
  25. package/esm2015/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.js +6 -6
  26. package/esm2015/lib/elements/projects/projects.component.js +16 -143
  27. package/esm2015/lib/services/eac.service.js +217 -0
  28. package/esm2015/lowcodeunit-applications-flow-common.js +32 -29
  29. package/fesm2015/lowcodeunit-applications-flow-common.js +765 -239
  30. package/fesm2015/lowcodeunit-applications-flow-common.js.map +1 -1
  31. package/lcu.api.d.ts +1 -0
  32. package/lcu.api.d.ts.map +1 -1
  33. package/lib/applications-flow.module.d.ts.map +1 -1
  34. package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts +28 -0
  35. package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts.map +1 -0
  36. package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts +75 -0
  37. package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts.map +1 -0
  38. package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts +14 -0
  39. package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts.map +1 -0
  40. package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts +14 -0
  41. package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts.map +1 -0
  42. package/lib/elements/base-form/base-form.component.d.ts +3 -3
  43. package/lib/elements/base-form/base-form.component.d.ts.map +1 -1
  44. package/lib/elements/projects/controls/builds/builds.component.d.ts +1 -3
  45. package/lib/elements/projects/controls/builds/builds.component.d.ts.map +1 -1
  46. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts +3 -3
  47. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts.map +1 -1
  48. package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts +1 -3
  49. package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts.map +1 -1
  50. package/lib/elements/projects/controls/header/header.component.d.ts +3 -3
  51. package/lib/elements/projects/controls/header/header.component.d.ts.map +1 -1
  52. package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts.map +1 -1
  53. package/lib/elements/projects/controls/project-items/project-items.component.d.ts +3 -3
  54. package/lib/elements/projects/controls/project-items/project-items.component.d.ts.map +1 -1
  55. package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts +3 -3
  56. package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts.map +1 -1
  57. package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts +3 -3
  58. package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts.map +1 -1
  59. package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts +3 -3
  60. package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts.map +1 -1
  61. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts +3 -3
  62. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts.map +1 -1
  63. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts +3 -3
  64. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts.map +1 -1
  65. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts +3 -3
  66. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts.map +1 -1
  67. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts +3 -3
  68. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts.map +1 -1
  69. package/lib/elements/projects/projects.component.d.ts +4 -11
  70. package/lib/elements/projects/projects.component.d.ts.map +1 -1
  71. package/lib/services/eac.service.d.ts +54 -0
  72. package/lib/services/eac.service.d.ts.map +1 -0
  73. package/lowcodeunit-applications-flow-common.d.ts +31 -28
  74. package/lowcodeunit-applications-flow-common.d.ts.map +1 -1
  75. package/lowcodeunit-applications-flow-common.metadata.json +1 -1
  76. package/package.json +1 -1
  77. package/esm2015/lib/services/applications-flow-events.service.js +0 -83
  78. package/lib/services/applications-flow-events.service.d.ts +0 -58
  79. package/lib/services/applications-flow-events.service.d.ts.map +0 -1
@@ -0,0 +1,418 @@
1
+ import { COMMA, ENTER } from '@angular/cdk/keycodes';
2
+ import { Component, Input, ViewChild } from '@angular/core';
3
+ import { FormBuilder, FormControl, Validators } from '@angular/forms';
4
+ import { Guid } from '@lcu/common';
5
+ import { ApplicationsFlowService } from '../../services/applications-flow.service';
6
+ import { EaCService } from '../../services/eac.service';
7
+ import { ProjectHostingDetails } from '../../state/applications-flow.state';
8
+ export class DevopsSourceControlFormComponent {
9
+ // Constructors
10
+ constructor(formBuilder, appsFlowSvc, eacSvc) {
11
+ this.formBuilder = formBuilder;
12
+ this.appsFlowSvc = appsFlowSvc;
13
+ this.eacSvc = eacSvc;
14
+ this.SeparatorKeysCodes = [ENTER, COMMA];
15
+ this.BuildPath = null;
16
+ // this.EditingSourceControlLookup = null;
17
+ this.HostingDetails = new ProjectHostingDetails();
18
+ this.SelectedBranches = [];
19
+ this.SourceControlRoot = '';
20
+ this.UseBranches = true;
21
+ this.UseBuildPath = false;
22
+ }
23
+ // Fields
24
+ // Properties
25
+ get BranchesFormControl() {
26
+ return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'branches');
27
+ }
28
+ get BuildPathFormControl() {
29
+ return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'buildPath');
30
+ }
31
+ get DevOpsActionLookups() {
32
+ return Object.keys(this.DevOpsActions || {});
33
+ }
34
+ get DevOpsActionLookup() {
35
+ var _a, _b, _c;
36
+ if (!!((_a = this.DevOpsActionLookupFormControl) === null || _a === void 0 ? void 0 : _a.value)) {
37
+ return this.DevOpsActionLookupFormControl.value;
38
+ }
39
+ if (!!((_b = this.EditingSourceControl) === null || _b === void 0 ? void 0 : _b.DevOpsActionTriggerLookups)) {
40
+ return (_c = this.EditingSourceControl) === null || _c === void 0 ? void 0 : _c.DevOpsActionTriggerLookups[0];
41
+ }
42
+ else {
43
+ return null;
44
+ }
45
+ }
46
+ get DevOpsActionLookupFormControl() {
47
+ return this.DevOpsSourceControlFormGroup.get('devOpsActionLookup');
48
+ }
49
+ get DevOpsActions() {
50
+ return this.Environment.DevOpsActions || {};
51
+ }
52
+ get EditingSourceControl() {
53
+ var _a, _b;
54
+ let sc = ((_a = this.Environment) === null || _a === void 0 ? void 0 : _a.Sources) ? (_b = this.Environment) === null || _b === void 0 ? void 0 : _b.Sources[this.EditingSourceControlLookup] : null;
55
+ if (sc == null && this.EditingSourceControlLookup) {
56
+ sc = {};
57
+ }
58
+ return sc;
59
+ }
60
+ get MainBranchFormControl() {
61
+ return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'mainBranch');
62
+ }
63
+ get OrganizationFormControl() {
64
+ return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'organization');
65
+ }
66
+ get RepositoryFormControl() {
67
+ return this.DevOpsSourceControlFormGroup.get(this.SourceControlRoot + 'repository');
68
+ }
69
+ // Life Cycle
70
+ ngAfterViewInit() { }
71
+ ngOnDestroy() {
72
+ this.destroyFormControls();
73
+ }
74
+ ngOnInit() {
75
+ console.log("org: ", this.EditingSourceControl);
76
+ console.log("lookup: ", this.EditingSourceControlLookup);
77
+ if (this.EditingSourceControlLookup === null) {
78
+ this.CreateNewSourceControl();
79
+ }
80
+ console.log("org: ", this.EditingSourceControl);
81
+ if (this.EditingSourceControl != null) {
82
+ this.DevOpsSourceControlFormGroup = this.formBuilder.group({});
83
+ this.setupFormControls();
84
+ }
85
+ this.RefreshOrganizations();
86
+ }
87
+ // API Methods
88
+ AddBranchOption(event) {
89
+ this.addBranchOption(event.value);
90
+ event.input.value = '';
91
+ }
92
+ BranchOptionSelected(event) {
93
+ this.addBranchOption(event.option.value);
94
+ }
95
+ BranchesChanged(branches) {
96
+ this.loadProjectHostingDetails();
97
+ }
98
+ BuildPathChanged(event) {
99
+ }
100
+ CreateNewSourceControl() {
101
+ this.SetEditingSourceControl(Guid.CreateRaw());
102
+ }
103
+ CreateRepository() {
104
+ this.CreatingRepository = true;
105
+ this.RepositoryFormControl.reset();
106
+ }
107
+ CancelCreateRepository() {
108
+ this.CreatingRepository = false;
109
+ }
110
+ DevOpsActionLookupChanged(event) {
111
+ this.configureDevOpsAction();
112
+ }
113
+ MainBranchChanged(event) {
114
+ this.emitBranchesChanged();
115
+ }
116
+ OrganizationChanged(event) {
117
+ const org = this.OrganizationFormControl;
118
+ this.RepositoryFormControl.reset();
119
+ if (this.UseBranches) {
120
+ this.BranchesFormControl.reset();
121
+ this.SelectedBranches = [];
122
+ }
123
+ this.listRepositories();
124
+ }
125
+ RefreshOrganizations() {
126
+ var _a, _b, _c;
127
+ // this.Loading = true;
128
+ this.listOrganizations();
129
+ (_a = this.OrganizationFormControl) === null || _a === void 0 ? void 0 : _a.reset();
130
+ (_b = this.RepositoryFormControl) === null || _b === void 0 ? void 0 : _b.reset();
131
+ if (this.UseBranches) {
132
+ (_c = this.BranchesFormControl) === null || _c === void 0 ? void 0 : _c.reset();
133
+ }
134
+ }
135
+ RemoveBranchOption(option) {
136
+ const index = this.SelectedBranches.indexOf(option);
137
+ if (index >= 0) {
138
+ this.SelectedBranches.splice(index, 1);
139
+ }
140
+ this.emitBranchesChanged();
141
+ }
142
+ RepositoryChanged(event) {
143
+ const repo = this.RepositoryFormControl;
144
+ if (this.UseBranches) {
145
+ this.BranchesFormControl.reset();
146
+ this.SelectedBranches = [];
147
+ this.listBranches();
148
+ }
149
+ if (!this.UseBranches) {
150
+ this.listBuildPaths();
151
+ }
152
+ }
153
+ SaveRepository() {
154
+ this.Loading = true;
155
+ const org = this.OrganizationFormControl.value;
156
+ const repoName = this.RepositoryFormControl.value;
157
+ this.appsFlowSvc
158
+ .CreateRepository(org, repoName)
159
+ .subscribe((response) => {
160
+ if (response.Status.Code === 0) {
161
+ this.listRepositories(repoName);
162
+ this.CreatingRepository = false;
163
+ }
164
+ else {
165
+ // TODO: Need to surface an error to the user...
166
+ this.Loading = false;
167
+ }
168
+ });
169
+ }
170
+ SetEditingSourceControl(scLookup) {
171
+ this.EditingSourceControlLookup = scLookup;
172
+ }
173
+ SubmitSourceControl() {
174
+ console.log("source control submitted");
175
+ }
176
+ // public SaveSourceControl(): void {
177
+ // const saveEnvReq: SaveEnvironmentAsCodeEventRequest = {
178
+ // Environment: {
179
+ // ...this.Environment,
180
+ // Artifacts: this.Environment.Artifacts || {},
181
+ // DevOpsActions: this.Environment.DevOpsActions || {},
182
+ // Secrets: this.Environment.Secrets || {},
183
+ // Sources: this.Environment.Sources || {},
184
+ // },
185
+ // EnvironmentLookup: this.EnvironmentLookup,
186
+ // EnterpriseDataTokens: {},
187
+ // };
188
+ // let artifactLookup: string;
189
+ // // let artifact: EaCArtifact = {
190
+ // // ...this.Artifact,
191
+ // // ...this.HostingDetailsFormControls
192
+ // // .SelectedHostingOptionInputControlValues,
193
+ // // };
194
+ // if (!this.ArtifactLookup) {
195
+ // artifactLookup = Guid.CreateRaw();
196
+ // artifact = {
197
+ // ...artifact,
198
+ // Type: this.HostingDetailsFormControls.SelectedHostingOption
199
+ // .ArtifactType,
200
+ // Name: this.HostingDetailsFormControls.SelectedHostingOption.Name,
201
+ // NPMRegistry: 'https://registry.npmjs.org/',
202
+ // };
203
+ // } else {
204
+ // artifactLookup = this.ArtifactLookup;
205
+ // }
206
+ // saveEnvReq.Environment.Artifacts[artifactLookup] = artifact;
207
+ // let devOpsActionLookup: string;
208
+ // if (!this.DevOpsActionLookup) {
209
+ // devOpsActionLookup = Guid.CreateRaw();
210
+ // // const doa: EaCDevOpsAction = {
211
+ // // ...this.DevOpsAction,
212
+ // // ArtifactLookups: [artifactLookup],
213
+ // // Name: this.HostingDetailsFormControls.DevOpsActionNameFormControl.value,
214
+ // // Path: this.HostingDetailsFormControls.SelectedHostingOption.Path,
215
+ // // Templates:
216
+ // // this.HostingDetailsFormControls.SelectedHostingOption.Templates,
217
+ // // };
218
+ // if (this.HostingDetailsFormControls.NPMTokenFormControl?.value) {
219
+ // const secretLookup = 'npm-access-token';
220
+ // doa.SecretLookups = [secretLookup];
221
+ // saveEnvReq.Environment.Secrets[secretLookup] = {
222
+ // Name: 'NPM Access Token',
223
+ // DataTokenLookup: secretLookup,
224
+ // KnownAs: 'NPM_TOKEN',
225
+ // };
226
+ // saveEnvReq.EnterpriseDataTokens[secretLookup] = {
227
+ // Name: saveEnvReq.Environment.Secrets[secretLookup].Name,
228
+ // Description: saveEnvReq.Environment.Secrets[secretLookup].Name,
229
+ // Value: this.NPMTokenFormControl.value,
230
+ // };
231
+ // }
232
+ // saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = doa;
233
+ // } else {
234
+ // devOpsActionLookup = this.DevOpsActionLookupFormControl.value;
235
+ // const doa: EaCDevOpsAction = {
236
+ // ...this.DevOpsAction,
237
+ // Name: this.HostingDetailsFormControls.DevOpsActionNameFormControl.value,
238
+ // };
239
+ // saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = doa;
240
+ // }
241
+ // let source: EaCSourceControl = {
242
+ // ...this.EditingSourceControl,
243
+ // Branches: this.SelectedBranches,
244
+ // MainBranch: this.MainBranchFormControl.value,
245
+ // };
246
+ // source = {
247
+ // ...source,
248
+ // Type: 'GitHub',
249
+ // Name: this.EditingSourceControlLookup,
250
+ // DevOpsActionTriggerLookups: [devOpsActionLookup],
251
+ // Organization:
252
+ // this.OrganizationFormControl.value,
253
+ // Repository: this.RepositoryFormControl.value,
254
+ // };
255
+ // const scLookup = `github://${source.Organization}/${source.Repository}`;
256
+ // saveEnvReq.Environment.Sources[scLookup] = source;
257
+ // this.eacSvc.SaveEnvironmentAsCode(saveEnvReq);
258
+ // }
259
+ // Helpers
260
+ addBranchOption(value) {
261
+ value = (value || '').trim();
262
+ if (value && this.SelectedBranches.indexOf(value) < 0) {
263
+ this.SelectedBranches.push(value);
264
+ }
265
+ this.BranchesInput.nativeElement.blur();
266
+ this.emitBranchesChanged();
267
+ }
268
+ configureDevOpsAction() {
269
+ setTimeout(() => {
270
+ this.DevOpsActionLookupFormControl.setValue(this.DevOpsActionLookup);
271
+ }, 0);
272
+ }
273
+ destroyFormControls() {
274
+ var _a, _b, _c, _d;
275
+ this.DevOpsSourceControlFormGroup.removeControl([this.SourceControlRoot, 'mainBranch'].join(''));
276
+ (_a = this.DevOpsSourceControlFormGroup) === null || _a === void 0 ? void 0 : _a.removeControl([this.SourceControlRoot, 'branches'].join(''));
277
+ (_b = this.DevOpsSourceControlFormGroup) === null || _b === void 0 ? void 0 : _b.removeControl([this.SourceControlRoot, 'buildPath'].join(''));
278
+ this.SelectedBranches = [];
279
+ (_c = this.DevOpsSourceControlFormGroup) === null || _c === void 0 ? void 0 : _c.removeControl([this.SourceControlRoot, 'organization'].join(''));
280
+ (_d = this.DevOpsSourceControlFormGroup) === null || _d === void 0 ? void 0 : _d.removeControl([this.SourceControlRoot, 'repository'].join(''));
281
+ }
282
+ emitBranchesChanged() {
283
+ var _a, _b;
284
+ if (((_a = this.SelectedBranches) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
285
+ (!this.MainBranchFormControl.value ||
286
+ this.SelectedBranches.indexOf(this.MainBranchFormControl.value) < 0)) {
287
+ this.MainBranchFormControl.setValue(this.SelectedBranches.find((branch) => branch === 'main' || branch === 'master') || this.SelectedBranches[0]);
288
+ }
289
+ else if (((_b = this.SelectedBranches) === null || _b === void 0 ? void 0 : _b.length) <= 0) {
290
+ this.MainBranchFormControl.reset();
291
+ }
292
+ this.BranchesFormControl.setValue(this.SelectedBranches.join(','));
293
+ this.BranchesChanged(this.SelectedBranches || []);
294
+ }
295
+ listBranches() {
296
+ if (this.UseBranches) {
297
+ this.Loading = true;
298
+ this.appsFlowSvc
299
+ .ListBranches(this.OrganizationFormControl.value, this.RepositoryFormControl.value)
300
+ .subscribe((response) => {
301
+ var _a, _b, _c;
302
+ this.BranchOptions = response.Model;
303
+ this.Loading = false;
304
+ if (((_b = (_a = this.EditingSourceControl) === null || _a === void 0 ? void 0 : _a.Branches) === null || _b === void 0 ? void 0 : _b.length) > 0) {
305
+ this.SelectedBranches = this.EditingSourceControl.Branches;
306
+ }
307
+ else if (((_c = this.BranchOptions) === null || _c === void 0 ? void 0 : _c.length) === 1) {
308
+ this.BranchesFormControl.setValue(this.BranchOptions[0].Name);
309
+ this.SelectedBranches = [this.BranchOptions[0].Name];
310
+ }
311
+ this.emitBranchesChanged();
312
+ this.listBuildPaths();
313
+ });
314
+ }
315
+ }
316
+ listBuildPaths() {
317
+ if (this.UseBuildPath) {
318
+ this.Loading = true;
319
+ this.appsFlowSvc
320
+ .ListBuildPaths(this.OrganizationFormControl.value, this.RepositoryFormControl.value)
321
+ .subscribe((response) => {
322
+ var _a;
323
+ this.BuildPathOptions = response.Model;
324
+ this.Loading = false;
325
+ if (((_a = this.BuildPathOptions) === null || _a === void 0 ? void 0 : _a.length) === 1) {
326
+ this.BuildPathFormControl.setValue(this.BuildPathOptions[0]);
327
+ }
328
+ });
329
+ }
330
+ }
331
+ listOrganizations() {
332
+ this.Loading = true;
333
+ this.appsFlowSvc
334
+ .ListOrganizations()
335
+ .subscribe((response) => {
336
+ var _a;
337
+ this.OrganizationOptions = response.Model;
338
+ this.Loading = false;
339
+ if ((_a = this.EditingSourceControl) === null || _a === void 0 ? void 0 : _a.Organization) {
340
+ setTimeout(() => {
341
+ var _a;
342
+ this.OrganizationFormControl.setValue(this.EditingSourceControl.Organization);
343
+ this.listRepositories((_a = this.EditingSourceControl) === null || _a === void 0 ? void 0 : _a.Repository);
344
+ }, 0);
345
+ }
346
+ });
347
+ }
348
+ listRepositories(activeRepo = null) {
349
+ this.Loading = true;
350
+ this.appsFlowSvc
351
+ .ListRepositories(this.OrganizationFormControl.value)
352
+ .subscribe((response) => {
353
+ var _a;
354
+ this.RepositoryOptions = response.Model;
355
+ this.Loading = false;
356
+ if (activeRepo) {
357
+ setTimeout(() => {
358
+ this.RepositoryFormControl.setValue(activeRepo);
359
+ this.listBranches();
360
+ if (!this.UseBranches) {
361
+ this.listBuildPaths();
362
+ }
363
+ }, 0);
364
+ }
365
+ else if (((_a = this.RepositoryOptions) === null || _a === void 0 ? void 0 : _a.length) <= 0) {
366
+ this.CreatingRepository = true;
367
+ }
368
+ });
369
+ }
370
+ loadProjectHostingDetails() {
371
+ var _a, _b, _c, _d;
372
+ if (((_a = this.SelectedBranches) === null || _a === void 0 ? void 0 : _a.length) > 0) {
373
+ this.HostingDetails.Loading = true;
374
+ this.appsFlowSvc
375
+ .LoadProjectHostingDetails((_b = this.OrganizationFormControl) === null || _b === void 0 ? void 0 : _b.value, (_c = this.RepositoryFormControl) === null || _c === void 0 ? void 0 : _c.value, (_d = this.MainBranchFormControl) === null || _d === void 0 ? void 0 : _d.value)
376
+ .subscribe((response) => {
377
+ this.HostingDetails = response.Model;
378
+ this.HostingDetails.Loading = false;
379
+ this.configureDevOpsAction();
380
+ }, (err) => {
381
+ this.HostingDetails.Loading = false;
382
+ });
383
+ }
384
+ }
385
+ setupFormControls() {
386
+ // this.destroyFormControls();
387
+ var _a, _b, _c, _d, _e, _f, _g;
388
+ this.DevOpsSourceControlFormGroup.addControl('devOpsActionLookup', new FormControl(this.DevOpsActionLookup || '', []));
389
+ this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'organization'].join(''), new FormControl((_a = this.EditingSourceControl.Organization) !== null && _a !== void 0 ? _a : '', Validators.required));
390
+ this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'repository'].join(''), new FormControl((_b = this.EditingSourceControl.Repository) !== null && _b !== void 0 ? _b : '', Validators.required));
391
+ if (this.UseBranches) {
392
+ this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'branches'].join(''), new FormControl((_d = (_c = this.EditingSourceControl) === null || _c === void 0 ? void 0 : _c.Branches) !== null && _d !== void 0 ? _d : '', Validators.required));
393
+ this.SelectedBranches = (_e = this.EditingSourceControl) === null || _e === void 0 ? void 0 : _e.Branches;
394
+ this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'mainBranch'].join(''), new FormControl((_f = this.EditingSourceControl.MainBranch) !== null && _f !== void 0 ? _f : '', Validators.required));
395
+ }
396
+ if (this.UseBuildPath) {
397
+ this.DevOpsSourceControlFormGroup.addControl([this.SourceControlRoot, 'buildPath'].join(''), new FormControl((_g = this.BuildPath) !== null && _g !== void 0 ? _g : '', Validators.required));
398
+ }
399
+ }
400
+ }
401
+ DevopsSourceControlFormComponent.decorators = [
402
+ { type: Component, args: [{
403
+ selector: 'lcu-devops-source-control-form',
404
+ template: "<form class=\"form-card\" [formGroup]=\"DevOpsSourceControlFormGroup\" (ngSubmit)=\"SubmitSourceControl()\">\n\n <mat-card class=\"spread\" class=\"sc-card\">\n <mat-card-header>\n <mat-card-title> Source Control </mat-card-title>\n\n <div fxFlex></div>\n\n <mat-icon matSuffix matTooltip=\"Configure source control, DevOps CI/CD, and artifacts.\">\n info_outline\n </mat-icon>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"card\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select formControlName=\"devOpsActionLookup\" placeholder=\"DevOps Action\"\n [disabled]=\"HostingDetails?.Loading\" (selectionChange)=\"DevOpsActionLookupChanged($event)\">\n <ng-container *ngFor=\"let devOpsActionLookup of DevOpsActionLookups\">\n <mat-option [value]=\"devOpsActionLookup\" *ngIf=\"DevOpsActions[devOpsActionLookup]; let devOpsAction\">\n {{ devOpsAction.Name }}\n </mat-option>\n </ng-container>\n\n <mat-option value=\"\">-- Create New --</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"card\" *ngIf=\"OrganizationFormControl?.valid || !Loading\">\n <mat-form-field class=\"mat-full-width with-hint\" *ngIf=\"OrganizationOptions?.length > 0\">\n <mat-icon class=\"org-icon\" matPrefix>corporate_fare</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'organization'\" placeholder=\"Organization\"\n (selectionChange)=\"OrganizationChanged($event)\" [disabled]=\"Loading || HostingDetails?.Loading\" required>\n <ng-container *ngFor=\"let orgOpt of OrganizationOptions\">\n <mat-option [value]=\"orgOpt.Name\">\n {{ orgOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\" matTooltip=\"Refresh Organization\"> refresh </mat-icon>\n\n <a matSuffix href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon color=\"accent\" matTooltip=\"Re-authorize Organizations\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n RepositoryFormControl?.valid ||\n (OrganizationFormControl?.valid && !Loading)\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>description</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'repository'\" [placeholder]=\"\n OrganizationFormControl?.valid\n ? 'Repository'\n : 'Repository (select organization first)'\n \" [disabled]=\"\n !OrganizationFormControl?.valid || Loading || HostingDetails?.Loading\n \" (selectionChange)=\"RepositoryChanged($event)\" *ngIf=\"!CreatingRepository\" required>\n <ng-container *ngFor=\"let repoOpt of RepositoryOptions\">\n <mat-option [value]=\"repoOpt.Name\">\n {{ repoOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <input matInput placeholder=\"Repository (creates new if does not exist)\"\n [formControlName]=\"SourceControlRoot + 'repository'\" *ngIf=\"CreatingRepository\"\n [fxHide]=\"Loading || HostingDetails?.Loading\" required />\n\n <mat-icon matSuffix (click)=\"CreateRepository()\" [fxHide]=\"Loading || HostingDetails?.Loading\"\n *ngIf=\"!CreatingRepository && OrganizationFormControl?.valid\">\n add_circle\n </mat-icon>\n\n <button mat-button type=\"button\" (click)=\"SaveRepository()\"\n *ngIf=\"CreatingRepository && RepositoryFormControl?.valid\">\n\n <mat-icon matSuffix color=\"primary\">\n save\n </mat-icon>\n </button>\n\n <button mat-button type=\"button\" (click)=\"CancelCreateRepository()\" *ngIf=\"CreatingRepository\">\n\n <mat-icon matSuffix>\n cancel\n </mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BranchesFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBranches\n \">\n <mat-form-field class=\"mat-full-width\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-label>Selected Branches</mat-label>\n\n <mat-autocomplete (optionSelected)=\"BranchOptionSelected($event)\" #branchOptions=\"matAutocomplete\">\n <ng-container *ngFor=\"let branchOpt of BranchOptions\">\n <mat-option [value]=\"branchOpt.Name\">\n {{ branchOpt.Name }}\n </mat-option>\n </ng-container>\n </mat-autocomplete>\n\n <mat-chip-list #selectedBranches>\n <mat-chip [removable]=\"true\" (removed)=\"RemoveBranchOption(selBranch)\"\n *ngFor=\"let selBranch of SelectedBranches\">\n {{ selBranch }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n\n <input matInput placeholder=\"New Branch...\" [formControlName]=\"SourceControlRoot + 'branches'\" #branches\n [matAutocomplete]=\"branchOptions\" [matChipInputFor]=\"selectedBranches\"\n [matChipInputSeparatorKeyCodes]=\"SeparatorKeysCodes\" [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"AddBranchOption($event)\" [disabled]=\"Loading || HostingDetails?.Loading\"\n required />\n </mat-chip-list>\n </mat-form-field>\n\n <mat-form-field class=\"mat-full-width with-hint\" [fxShow]=\"SelectedBranches?.length > 1\">\n <mat-icon class=\"org-icon\" matPrefix>account_tree</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'mainBranch'\" placeholder=\"Main Branch\"\n [disabled]=\"Loading || HostingDetails?.Loading\" (selectionChange)=\"MainBranchChanged($event)\" required>\n <ng-container *ngFor=\"let branch of SelectedBranches\">\n <mat-option [value]=\"branch\">\n {{ branch }}\n </mat-option>\n </ng-container>\n </mat-select>\n\n <mat-icon matSuffix (click)=\"RefreshOrganizations()\"> refresh </mat-icon>\n\n <a matSuffix mat-icon-button href=\"/.oauth/github?oauth-force-edit=true\" target=\"_blank\" color=\"accent\">\n <mat-icon matTooltip=\"Re-authorize Organizations\" color=\"accent\"> launch </mat-icon>\n </a>\n\n <mat-hint>\n If you don't have an organization or would like to create a new one,\n <a href=\"https://github.com/account/organizations/new\" target=\"_blank\">\n start here\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"card\" *ngIf=\"\n (BuildPathFormControl?.valid ||\n (OrganizationFormControl?.valid &&\n RepositoryFormControl?.valid &&\n !Loading)) &&\n !CreatingRepository &&\n UseBuildPath\n \">\n <mat-form-field class=\"mat-full-width with-hint\">\n <mat-icon class=\"org-icon\" matPrefix>build</mat-icon>\n\n <mat-select [formControlName]=\"SourceControlRoot + 'buildPath'\" placeholder=\"Build Path\"\n [disabled]=\"Loading || BuildPathDisabled\" (selectionChange)=\"BuildPathChanged($event)\" required>\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 </div>\n\n <div *ngIf=\"Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n\n <div class=\"margin-3\">\n <h4 class=\"mat-title\" *ngIf=\"!OrganizationFormControl?.valid\">\n Loading organizations\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n OrganizationFormControl?.valid && !RepositoryFormControl?.valid\n \">\n Loading repositories\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"RepositoryFormControl?.valid && !BranchesFormControl?.valid\">\n Loading branches\n </h4>\n\n <h4 class=\"mat-title\" *ngIf=\"\n (RepositoryFormControl?.valid || BranchesFormControl?.valid) &&\n !BuildPathFormControl?.valid\n \">\n Loading build paths\n </h4>\n </div>\n </div>\n </div>\n <!-- </div> -->\n\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n <!-- [disabled]=\"!SecurityFormGroup.valid || !SecurityFormGroup.dirty\" -->\n <button mat-raised-button type=\"submit\">Save</button>\n </mat-card-actions>\n </mat-card>\n</form>",
405
+ styles: [".form-card,.sc-card{width:100%}"]
406
+ },] }
407
+ ];
408
+ DevopsSourceControlFormComponent.ctorParameters = () => [
409
+ { type: FormBuilder },
410
+ { type: ApplicationsFlowService },
411
+ { type: EaCService }
412
+ ];
413
+ DevopsSourceControlFormComponent.propDecorators = {
414
+ BranchesInput: [{ type: ViewChild, args: ['branches',] }],
415
+ EditingSourceControlLookup: [{ type: Input, args: ['editing-source-control-lookup',] }],
416
+ Environment: [{ type: Input, args: ['environment',] }]
417
+ };
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL2FwcGxpY2F0aW9ucy1mbG93L2FwcGxpY2F0aW9ucy1mbG93L3Byb2plY3RzL2NvbW1vbi9zcmMvIiwic291cmNlcyI6WyJsaWIvY29udHJvbHMvZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFpQixTQUFTLEVBQWMsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFtQixXQUFXLEVBQUUsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSWxHLE9BQU8sRUFBcUMsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxVQUFVLEVBQXFDLE1BQU0sNEJBQTRCLENBQUM7QUFDM0YsT0FBTyxFQUFzRCxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBT2hJLE1BQU0sT0FBTyxnQ0FBZ0M7SUFrSDNDLGdCQUFnQjtJQUNoQixZQUNZLFdBQXdCLEVBQ3hCLFdBQW9DLEVBQ3BDLE1BQWtCO1FBRmxCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBbEJkLHVCQUFrQixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBVSxDQUFDO1FBcUIzRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QiwwQ0FBMEM7UUFFMUMsSUFBSSxDQUFDLGNB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ZXljb2Rlcyc7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7IE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBCYXNlTW9kZWxlZFJlc3BvbnNlLCBCYXNlUmVzcG9uc2UsIEd1aWQgfSBmcm9tICdAbGN1L2NvbW1vbic7XG5pbXBvcnQgeyBFYUNEZXZPcHNBY3Rpb24sIEVhQ0Vudmlyb25tZW50QXNDb2RlLCBFYUNTb3VyY2VDb250cm9sIH0gZnJvbSAnQHNlbWFudGljanMvY29tbW9uJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uc0Zsb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwbGljYXRpb25zLWZsb3cuc2VydmljZSc7XG5pbXBvcnQgeyBFYUNTZXJ2aWNlLCBTYXZlRW52aXJvbm1lbnRBc0NvZGVFdmVudFJlcXVlc3QgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lYWMuc2VydmljZSc7XG5pbXBvcnQgeyBHaXRIdWJCcmFuY2gsIEdpdEh1Yk9yZ2FuaXphdGlvbiwgR2l0SHViUmVwb3NpdG9yeSwgUHJvamVjdEhvc3RpbmdEZXRhaWxzIH0gZnJvbSAnLi4vLi4vc3RhdGUvYXBwbGljYXRpb25zLWZsb3cuc3RhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsY3UtZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZGV2b3BzLXNvdXJjZS1jb250cm9sLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXZvcHMtc291cmNlLWNvbnRyb2wtZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERldm9wc1NvdXJjZUNvbnRyb2xGb3JtQ29tcG9uZW50IFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0XG57XG4gIC8vICBGaWVsZHNcblxuICAvLyAgUHJvcGVydGllc1xuICBwdWJsaWMgZ2V0IEJyYW5jaGVzRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCh0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ2JyYW5jaGVzJyk7XG4gIH1cblxuXG4gIEBWaWV3Q2hpbGQoJ2JyYW5jaGVzJylcbiAgcHVibGljIEJyYW5jaGVzSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgcHVibGljIEJyYW5jaE9wdGlvbnM6IEdpdEh1YkJyYW5jaFtdO1xuXG4gIC8vT3B0aW9uYWwgaW5wdXQgbm90IGJlaW5nIHVzZWQgc2V0dGluZyB0byBcbiAgLy8gQElucHV0KCdidWlsZC1wYXRoJylcbiAgcHVibGljIEJ1aWxkUGF0aDogc3RyaW5nO1xuXG4gIC8vT3B0aW9uYWwgbm90IGJlaW5nIHVzZWRcbiAgLy8gQElucHV0KCdidWlsZC1wYXRoLWRpc2FibGVkJylcbiAgcHVibGljIEJ1aWxkUGF0aERpc2FibGVkOiBib29sZWFuO1xuXG4gIHB1YmxpYyBnZXQgQnVpbGRQYXRoRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCh0aGlzLlNvdXJjZUNvbnRyb2xSb290ICsgJ2J1aWxkUGF0aCcpO1xuICB9XG5cbiAgcHVibGljIEJ1aWxkUGF0aE9wdGlvbnM6IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyBDcmVhdGluZ1JlcG9zaXRvcnk6IGJvb2xlYW47XG5cblxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9uTG9va3VwcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5EZXZPcHNBY3Rpb25zIHx8IHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9uTG9va3VwKCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbD8udmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLkRldk9wc0FjdGlvbkxvb2t1cEZvcm1Db250cm9sLnZhbHVlO1xuICAgIH1cblxuICAgIGlmICghIXRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LkRldk9wc0FjdGlvblRyaWdnZXJMb29rdXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uRGV2T3BzQWN0aW9uVHJpZ2dlckxvb2t1cHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9uTG9va3VwRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmdldCgnZGV2T3BzQWN0aW9uTG9va3VwJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IERldk9wc0FjdGlvbnMoKTogeyBbbG9va3VwOiBzdHJpbmddOiBFYUNEZXZPcHNBY3Rpb24gfSB7XG4gICAgcmV0dXJuIHRoaXMuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9ucyB8fCB7fTtcbiAgfVxuXG4gIHB1YmxpYyBEZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgcHVibGljIGdldCBFZGl0aW5nU291cmNlQ29udHJvbCgpOiBFYUNTb3VyY2VDb250cm9sIHtcbiAgICBsZXQgc2MgPSB0aGlzLkVudmlyb25tZW50Py5Tb3VyY2VzXG4gICAgICA/IHRoaXMuRW52aXJvbm1lbnQ/LlNvdXJjZXNbdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cF1cbiAgICAgIDogbnVsbDtcblxuICAgIGlmIChzYyA9PSBudWxsICYmIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXApIHtcbiAgICAgIHNjID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjO1xuICB9XG5cbiAgQElucHV0KCdlZGl0aW5nLXNvdXJjZS1jb250cm9sLWxvb2t1cCcpXG4gIHB1YmxpYyBFZGl0aW5nU291cmNlQ29udHJvbExvb2t1cDogc3RyaW5nO1xuXG4gIEBJbnB1dCgnZW52aXJvbm1lbnQnKVxuICBwdWJsaWMgRW52aXJvbm1lbnQ6IEVhQ0Vudmlyb25tZW50QXNDb2RlO1xuXG4gIHB1YmxpYyBIb3N0aW5nRGV0YWlsczogUHJvamVjdEhvc3RpbmdEZXRhaWxzO1xuXG4gIHB1YmxpYyBMb2FkaW5nOiBib29sZWFuO1xuXG4gIHB1YmxpYyBnZXQgTWFpbkJyYW5jaEZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5nZXQodGhpcy5Tb3VyY2VDb250cm9sUm9vdCArICdtYWluQnJhbmNoJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IE9yZ2FuaXphdGlvbkZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5nZXQodGhpcy5Tb3VyY2VDb250cm9sUm9vdCArICdvcmdhbml6YXRpb24nKTtcbiAgfVxuXG4gIHB1YmxpYyBPcmdhbml6YXRpb25PcHRpb25zOiBHaXRIdWJPcmdhbml6YXRpb25bXTtcblxuICBwdWJsaWMgZ2V0IFJlcG9zaXRvcnlGb3JtQ29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuZ2V0KHRoaXMuU291cmNlQ29udHJvbFJvb3QgKyAncmVwb3NpdG9yeScpO1xuICB9XG5cbiAgcHVibGljIFJlcG9zaXRvcnlPcHRpb25zOiBHaXRIdWJSZXBvc2l0b3J5W107XG5cbiAgcHVibGljIFNlbGVjdGVkQnJhbmNoZXM6IHN0cmluZ1tdO1xuXG4gIHB1YmxpYyByZWFkb25seSBTZXBhcmF0b3JLZXlzQ29kZXMgPSBbRU5URVIsIENPTU1BXSBhcyBjb25zdDtcblxuICAvLyB0aGlzIGlucHV0IGlzIG5vdCBiZWluZyB1c2VkIGFueXdoZXJlXG4gIC8vIEBJbnB1dCgnc291cmNlLWNvbnRyb2wtcm9vdCcpXG4gIHB1YmxpYyBTb3VyY2VDb250cm9sUm9vdDogc3RyaW5nO1xuXG4gIC8vbm90IGJlaW5nIHVzZWQgc2V0IHRvIHRydWUgYnkgZGVmYXVsdFxuICAvLyBASW5wdXQoJ3VzZS1icmFuY2hlcycpXG4gIHB1YmxpYyBVc2VCcmFuY2hlczogYm9vbGVhbjtcblxuICAvL25vdCBiZWluZyB1c2VkIHNldCB0byBmYWxzZSBieSBkZWZhdWx0XG4gIC8vIEBJbnB1dCgndXNlLWJ1aWxkLXBhdGgnKVxuICBwdWJsaWMgVXNlQnVpbGRQYXRoOiBib29sZWFuO1xuXG4gIC8vICBDb25zdHJ1Y3RvcnNcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgYXBwc0Zsb3dTdmM6IEFwcGxpY2F0aW9uc0Zsb3dTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBlYWNTdmM6IEVhQ1NlcnZpY2VcbiAgKSB7XG5cbiAgICB0aGlzLkJ1aWxkUGF0aCA9IG51bGw7XG5cbiAgICAvLyB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sTG9va3VwID0gbnVsbDtcblxuICAgIHRoaXMuSG9zdGluZ0RldGFpbHMgPSBuZXcgUHJvamVjdEhvc3RpbmdEZXRhaWxzKCk7XG5cbiAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSBbXTtcblxuICAgIHRoaXMuU291cmNlQ29udHJvbFJvb3QgPSAnJztcblxuICAgIHRoaXMuVXNlQnJhbmNoZXMgPSB0cnVlO1xuXG4gICAgdGhpcy5Vc2VCdWlsZFBhdGggPSBmYWxzZTtcblxuXG4gIH1cblxuICAvLyAgTGlmZSBDeWNsZVxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge31cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95Rm9ybUNvbnRyb2xzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJvcmc6IFwiLCB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sKTtcbiAgICBjb25zb2xlLmxvZyhcImxvb2t1cDogXCIsIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXApXG5cbiAgICBpZiAodGhpcy5FZGl0aW5nU291cmNlQ29udHJvbExvb2t1cCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5DcmVhdGVOZXdTb3VyY2VDb250cm9sKCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFwib3JnOiBcIiwgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbCk7XG5cbiAgICBpZiAodGhpcy5FZGl0aW5nU291cmNlQ29udHJvbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHt9KTtcblxuICAgICAgdGhpcy5zZXR1cEZvcm1Db250cm9scygpO1xuICAgIH1cbiAgICBcblxuICAgIHRoaXMuUmVmcmVzaE9yZ2FuaXphdGlvbnMoKTtcbiAgfVxuXG4gIC8vICBBUEkgTWV0aG9kc1xuICBwdWJsaWMgQWRkQnJhbmNoT3B0aW9uKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQnJhbmNoT3B0aW9uKGV2ZW50LnZhbHVlKTtcblxuICAgIGV2ZW50LmlucHV0LnZhbHVlID0gJyc7XG4gIH1cblxuICBwdWJsaWMgQnJhbmNoT3B0aW9uU2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmFkZEJyYW5jaE9wdGlvbihldmVudC5vcHRpb24udmFsdWUpO1xuICB9XG5cbiAgcHVibGljIEJyYW5jaGVzQ2hhbmdlZChicmFuY2hlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBCdWlsZFBhdGhDaGFuZ2VkKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBDcmVhdGVOZXdTb3VyY2VDb250cm9sKCk6IHZvaWQge1xuICAgIHRoaXMuU2V0RWRpdGluZ1NvdXJjZUNvbnRyb2woR3VpZC5DcmVhdGVSYXcoKSk7XG4gIH1cblxuICBwdWJsaWMgQ3JlYXRlUmVwb3NpdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IHRydWU7XG5cbiAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC5yZXNldCgpO1xuICB9XG5cbiAgcHVibGljIENhbmNlbENyZWF0ZVJlcG9zaXRvcnkoKTogdm9pZCB7XG4gICAgdGhpcy5DcmVhdGluZ1JlcG9zaXRvcnkgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBEZXZPcHNBY3Rpb25Mb29rdXBDaGFuZ2VkKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ3VyZURldk9wc0FjdGlvbigpO1xuICB9XG5cbiAgcHVibGljIE1haW5CcmFuY2hDaGFuZ2VkKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRCcmFuY2hlc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBPcmdhbml6YXRpb25DaGFuZ2VkKGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBvcmcgPSB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sO1xuXG4gICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2wucmVzZXQoKTtcblxuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5saXN0UmVwb3NpdG9yaWVzKCk7XG4gIH1cblxuICBwdWJsaWMgUmVmcmVzaE9yZ2FuaXphdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmxpc3RPcmdhbml6YXRpb25zKCk7XG5cbiAgICB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy5yZXNldCgpO1xuXG4gICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2w/LnJlc2V0KCk7XG5cbiAgICBpZiAodGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgdGhpcy5CcmFuY2hlc0Zvcm1Db250cm9sPy5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBSZW1vdmVCcmFuY2hPcHRpb24ob3B0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuU2VsZWN0ZWRCcmFuY2hlcy5pbmRleE9mKG9wdGlvbik7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0QnJhbmNoZXNDaGFuZ2VkKCk7XG4gIH1cblxuICBwdWJsaWMgUmVwb3NpdG9yeUNoYW5nZWQoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbDtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2wucmVzZXQoKTtcblxuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzID0gW107XG5cbiAgICAgIHRoaXMubGlzdEJyYW5jaGVzKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFNhdmVSZXBvc2l0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICBjb25zdCBvcmcgPSB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC52YWx1ZTtcblxuICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgIC5DcmVhdGVSZXBvc2l0b3J5KG9yZywgcmVwb05hbWUpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5TdGF0dXMuQ29kZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubGlzdFJlcG9zaXRvcmllcyhyZXBvTmFtZSk7XG5cbiAgICAgICAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICBUT0RPOiAgTmVlZCB0byBzdXJmYWNlIGFuIGVycm9yIHRvIHRoZSB1c2VyLi4uXG5cbiAgICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgU2V0RWRpdGluZ1NvdXJjZUNvbnRyb2woc2NMb29rdXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXAgPSBzY0xvb2t1cDtcbiAgfVxuXG4gIHB1YmxpYyBTdWJtaXRTb3VyY2VDb250cm9sKCl7XG4gICAgY29uc29sZS5sb2coXCJzb3VyY2UgY29udHJvbCBzdWJtaXR0ZWRcIik7XG5cbiAgfVxuXG4gIC8vIHB1YmxpYyBTYXZlU291cmNlQ29udHJvbCgpOiB2b2lkIHtcbiAgLy8gICBjb25zdCBzYXZlRW52UmVxOiBTYXZlRW52aXJvbm1lbnRBc0NvZGVFdmVudFJlcXVlc3QgPSB7XG4gIC8vICAgICBFbnZpcm9ubWVudDoge1xuICAvLyAgICAgICAuLi50aGlzLkVudmlyb25tZW50LFxuICAvLyAgICAgICBBcnRpZmFjdHM6IHRoaXMuRW52aXJvbm1lbnQuQXJ0aWZhY3RzIHx8IHt9LFxuICAvLyAgICAgICBEZXZPcHNBY3Rpb25zOiB0aGlzLkVudmlyb25tZW50LkRldk9wc0FjdGlvbnMgfHwge30sXG4gIC8vICAgICAgIFNlY3JldHM6IHRoaXMuRW52aXJvbm1lbnQuU2VjcmV0cyB8fCB7fSxcbiAgLy8gICAgICAgU291cmNlczogdGhpcy5FbnZpcm9ubWVudC5Tb3VyY2VzIHx8IHt9LFxuICAvLyAgICAgfSxcbiAgLy8gICAgIEVudmlyb25tZW50TG9va3VwOiB0aGlzLkVudmlyb25tZW50TG9va3VwLFxuICAvLyAgICAgRW50ZXJwcmlzZURhdGFUb2tlbnM6IHt9LFxuICAvLyAgIH07XG5cbiAgLy8gICBsZXQgYXJ0aWZhY3RMb29rdXA6IHN0cmluZztcblxuICAvLyAgIC8vIGxldCBhcnRpZmFjdDogRWFDQXJ0aWZhY3QgPSB7XG4gIC8vICAgLy8gICAuLi50aGlzLkFydGlmYWN0LFxuICAvLyAgIC8vICAgLi4udGhpcy5Ib3N0aW5nRGV0YWlsc0Zvcm1Db250cm9sc1xuICAvLyAgIC8vICAgICAuU2VsZWN0ZWRIb3N0aW5nT3B0aW9uSW5wdXRDb250cm9sVmFsdWVzLFxuICAvLyAgIC8vIH07XG5cbiAgLy8gICBpZiAoIXRoaXMuQXJ0aWZhY3RMb29rdXApIHtcbiAgLy8gICAgIGFydGlmYWN0TG9va3VwID0gR3VpZC5DcmVhdGVSYXcoKTtcblxuICAvLyAgICAgYXJ0aWZhY3QgPSB7XG4gIC8vICAgICAgIC4uLmFydGlmYWN0LFxuICAvLyAgICAgICBUeXBlOiB0aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzLlNlbGVjdGVkSG9zdGluZ09wdGlvblxuICAvLyAgICAgICAgIC5BcnRpZmFjdFR5cGUsXG4gIC8vICAgICAgIE5hbWU6IHRoaXMuSG9zdGluZ0RldGFpbHNGb3JtQ29udHJvbHMuU2VsZWN0ZWRIb3N0aW5nT3B0aW9uLk5hbWUsXG4gIC8vICAgICAgIE5QTVJlZ2lzdHJ5OiAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJyxcbiAgLy8gICAgIH07XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIGFydGlmYWN0TG9va3VwID0gdGhpcy5BcnRpZmFjdExvb2t1cDtcbiAgLy8gICB9XG5cbiAgLy8gICBzYXZlRW52UmVxLkVudmlyb25tZW50LkFydGlmYWN0c1thcnRpZmFjdExvb2t1cF0gPSBhcnRpZmFjdDtcblxuICAvLyAgIGxldCBkZXZPcHNBY3Rpb25Mb29rdXA6IHN0cmluZztcblxuICAvLyAgIGlmICghdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXApIHtcbiAgLy8gICAgIGRldk9wc0FjdGlvbkxvb2t1cCA9IEd1aWQuQ3JlYXRlUmF3KCk7XG5cbiAgLy8gICAgIC8vIGNvbnN0IGRvYTogRWFDRGV2T3BzQWN0aW9uID0ge1xuICAvLyAgICAgLy8gICAuLi50aGlzLkRldk9wc0FjdGlvbixcbiAgLy8gICAgIC8vICAgQXJ0aWZhY3RMb29rdXBzOiBbYXJ0aWZhY3RMb29rdXBdLFxuICAvLyAgICAgLy8gICBOYW1lOiB0aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzLkRldk9wc0FjdGlvbk5hbWVGb3JtQ29udHJvbC52YWx1ZSxcbiAgLy8gICAgIC8vICAgUGF0aDogdGhpcy5Ib3N0aW5nRGV0YWlsc0Zvcm1Db250cm9scy5TZWxlY3RlZEhvc3RpbmdPcHRpb24uUGF0aCxcbiAgLy8gICAgIC8vICAgVGVtcGxhdGVzOlxuICAvLyAgICAgLy8gICAgIHRoaXMuSG9zdGluZ0RldGFpbHNGb3JtQ29udHJvbHMuU2VsZWN0ZWRIb3N0aW5nT3B0aW9uLlRlbXBsYXRlcyxcbiAgLy8gICAgIC8vIH07XG5cbiAgLy8gICAgIGlmICh0aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzLk5QTVRva2VuRm9ybUNvbnRyb2w/LnZhbHVlKSB7XG4gIC8vICAgICAgIGNvbnN0IHNlY3JldExvb2t1cCA9ICducG0tYWNjZXNzLXRva2VuJztcblxuICAvLyAgICAgICBkb2EuU2VjcmV0TG9va3VwcyA9IFtzZWNyZXRMb29rdXBdO1xuXG4gIC8vICAgICAgIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuU2VjcmV0c1tzZWNyZXRMb29rdXBdID0ge1xuICAvLyAgICAgICAgIE5hbWU6ICdOUE0gQWNjZXNzIFRva2VuJyxcbiAgLy8gICAgICAgICBEYXRhVG9rZW5Mb29rdXA6IHNlY3JldExvb2t1cCxcbiAgLy8gICAgICAgICBLbm93bkFzOiAnTlBNX1RPS0VOJyxcbiAgLy8gICAgICAgfTtcblxuICAvLyAgICAgICBzYXZlRW52UmVxLkVudGVycHJpc2VEYXRhVG9rZW5zW3NlY3JldExvb2t1cF0gPSB7XG4gIC8vICAgICAgICAgTmFtZTogc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5TZWNyZXRzW3NlY3JldExvb2t1cF0uTmFtZSxcbiAgLy8gICAgICAgICBEZXNjcmlwdGlvbjogc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5TZWNyZXRzW3NlY3JldExvb2t1cF0uTmFtZSxcbiAgLy8gICAgICAgICBWYWx1ZTogdGhpcy5OUE1Ub2tlbkZvcm1Db250cm9sLnZhbHVlLFxuICAvLyAgICAgICB9O1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBzYXZlRW52UmVxLkVudmlyb25tZW50LkRldk9wc0FjdGlvbnNbZGV2T3BzQWN0aW9uTG9va3VwXSA9IGRvYTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgZGV2T3BzQWN0aW9uTG9va3VwID0gdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBGb3JtQ29udHJvbC52YWx1ZTtcblxuICAvLyAgICAgY29uc3QgZG9hOiBFYUNEZXZPcHNBY3Rpb24gPSB7XG4gIC8vICAgICAgIC4uLnRoaXMuRGV2T3BzQWN0aW9uLFxuICAvLyAgICAgICBOYW1lOiB0aGlzLkhvc3RpbmdEZXRhaWxzRm9ybUNvbnRyb2xzLkRldk9wc0FjdGlvbk5hbWVGb3JtQ29udHJvbC52YWx1ZSxcbiAgLy8gICAgIH07XG5cbiAgLy8gICAgIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9uc1tkZXZPcHNBY3Rpb25Mb29rdXBdID0gZG9hO1xuICAvLyAgIH1cblxuICAvLyAgIGxldCBzb3VyY2U6IEVhQ1NvdXJjZUNvbnRyb2wgPSB7XG4gIC8vICAgICAuLi50aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLFxuICAvLyAgICAgQnJhbmNoZXM6IHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyxcbiAgLy8gICAgIE1haW5CcmFuY2g6IHRoaXMuTWFpbkJyYW5jaEZvcm1Db250cm9sLnZhbHVlLFxuICAvLyAgIH07XG5cbiAgLy8gICBzb3VyY2UgPSB7XG4gIC8vICAgICAuLi5zb3VyY2UsXG4gIC8vICAgICBUeXBlOiAnR2l0SHViJyxcbiAgLy8gICAgIE5hbWU6IHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2xMb29rdXAsXG4gIC8vICAgICBEZXZPcHNBY3Rpb25UcmlnZ2VyTG9va3VwczogW2Rldk9wc0FjdGlvbkxvb2t1cF0sXG4gIC8vICAgICBPcmdhbml6YXRpb246XG4gIC8vICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gIC8vICAgICBSZXBvc2l0b3J5OiB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbC52YWx1ZSxcbiAgLy8gICB9O1xuXG4gIC8vICAgY29uc3Qgc2NMb29rdXAgPSBgZ2l0aHViOi8vJHtzb3VyY2UuT3JnYW5pemF0aW9ufS8ke3NvdXJjZS5SZXBvc2l0b3J5fWA7XG5cbiAgLy8gICBzYXZlRW52UmVxLkVudmlyb25tZW50LlNvdXJjZXNbc2NMb29rdXBdID0gc291cmNlO1xuXG4gIC8vICAgdGhpcy5lYWNTdmMuU2F2ZUVudmlyb25tZW50QXNDb2RlKHNhdmVFbnZSZXEpO1xuICAvLyB9XG5cbiAgLy8gIEhlbHBlcnNcbiAgXG4gIHByb3RlY3RlZCBhZGRCcmFuY2hPcHRpb24odmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhbHVlID0gKHZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICBpZiAodmFsdWUgJiYgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLmluZGV4T2YodmFsdWUpIDwgMCkge1xuICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuQnJhbmNoZXNJbnB1dC5uYXRpdmVFbGVtZW50LmJsdXIoKTtcblxuICAgIHRoaXMuZW1pdEJyYW5jaGVzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZURldk9wc0FjdGlvbigpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuRGV2T3BzQWN0aW9uTG9va3VwRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5EZXZPcHNBY3Rpb25Mb29rdXApO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlc3Ryb3lGb3JtQ29udHJvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ21haW5CcmFuY2gnXS5qb2luKCcnKVxuICAgICk7XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA/LnJlbW92ZUNvbnRyb2woW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdicmFuY2hlcyddLmpvaW4oJycpKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cD8ucmVtb3ZlQ29udHJvbChbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ2J1aWxkUGF0aCddLmpvaW4oJycpKTtcblxuICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFtdO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwPy5yZW1vdmVDb250cm9sKFxuICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdvcmdhbml6YXRpb24nXS5qb2luKCcnKVxuICAgICk7XG5cbiAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXA/LnJlbW92ZUNvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ3JlcG9zaXRvcnknXS5qb2luKCcnKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJyYW5jaGVzQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICghdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUgfHxcbiAgICAgICAgdGhpcy5TZWxlY3RlZEJyYW5jaGVzLmluZGV4T2YodGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wudmFsdWUpIDwgMClcbiAgICApIHtcbiAgICAgIHRoaXMuTWFpbkJyYW5jaEZvcm1Db250cm9sLnNldFZhbHVlKFxuICAgICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMuZmluZChcbiAgICAgICAgICAoYnJhbmNoKSA9PiBicmFuY2ggPT09ICdtYWluJyB8fCBicmFuY2ggPT09ICdtYXN0ZXInXG4gICAgICAgICkgfHwgdGhpcy5TZWxlY3RlZEJyYW5jaGVzWzBdXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5TZWxlY3RlZEJyYW5jaGVzPy5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2wucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLkJyYW5jaGVzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5TZWxlY3RlZEJyYW5jaGVzLmpvaW4oJywnKSk7XG5cbiAgICB0aGlzLkJyYW5jaGVzQ2hhbmdlZCh0aGlzLlNlbGVjdGVkQnJhbmNoZXMgfHwgW10pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RCcmFuY2hlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgICAuTGlzdEJyYW5jaGVzKFxuICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJCcmFuY2hbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJyYW5jaE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/LkJyYW5jaGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLkJyYW5jaGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5CcmFuY2hPcHRpb25zPy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuQnJhbmNoZXNGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLkJyYW5jaE9wdGlvbnNbMF0uTmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuU2VsZWN0ZWRCcmFuY2hlcyA9IFt0aGlzLkJyYW5jaE9wdGlvbnNbMF0uTmFtZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbWl0QnJhbmNoZXNDaGFuZ2VkKCk7XG5cbiAgICAgICAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0QnVpbGRQYXRocygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5Vc2VCdWlsZFBhdGgpIHtcbiAgICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgICAgLkxpc3RCdWlsZFBhdGhzKFxuICAgICAgICAgIHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxzdHJpbmdbXT4pID0+IHtcbiAgICAgICAgICB0aGlzLkJ1aWxkUGF0aE9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuQnVpbGRQYXRoT3B0aW9ucz8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLkJ1aWxkUGF0aEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuQnVpbGRQYXRoT3B0aW9uc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdE9yZ2FuaXphdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgIC5MaXN0T3JnYW5pemF0aW9ucygpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJPcmdhbml6YXRpb25bXT4pID0+IHtcbiAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25PcHRpb25zID0gcmVzcG9uc2UuTW9kZWw7XG5cbiAgICAgICAgdGhpcy5Mb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuRWRpdGluZ1NvdXJjZUNvbnRyb2w/Lk9yZ2FuaXphdGlvbikge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5Pcmdhbml6YXRpb25Gb3JtQ29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5Pcmdhbml6YXRpb25cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdFJlcG9zaXRvcmllcyh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5SZXBvc2l0b3J5KTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdFJlcG9zaXRvcmllcyhhY3RpdmVSZXBvOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuYXBwc0Zsb3dTdmNcbiAgICAgIC5MaXN0UmVwb3NpdG9yaWVzKHRoaXMuT3JnYW5pemF0aW9uRm9ybUNvbnRyb2wudmFsdWUpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogQmFzZU1vZGVsZWRSZXNwb25zZTxHaXRIdWJSZXBvc2l0b3J5W10+KSA9PiB7XG4gICAgICAgIHRoaXMuUmVwb3NpdG9yeU9wdGlvbnMgPSByZXNwb25zZS5Nb2RlbDtcblxuICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAoYWN0aXZlUmVwbykge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5SZXBvc2l0b3J5Rm9ybUNvbnRyb2wuc2V0VmFsdWUoYWN0aXZlUmVwbyk7XG5cbiAgICAgICAgICAgIHRoaXMubGlzdEJyYW5jaGVzKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5Vc2VCcmFuY2hlcykge1xuICAgICAgICAgICAgICB0aGlzLmxpc3RCdWlsZFBhdGhzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5SZXBvc2l0b3J5T3B0aW9ucz8ubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICB0aGlzLkNyZWF0aW5nUmVwb3NpdG9yeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvYWRQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuU2VsZWN0ZWRCcmFuY2hlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5Ib3N0aW5nRGV0YWlscy5Mb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdGhpcy5hcHBzRmxvd1N2Y1xuICAgICAgICAuTG9hZFByb2plY3RIb3N0aW5nRGV0YWlscyhcbiAgICAgICAgICB0aGlzLk9yZ2FuaXphdGlvbkZvcm1Db250cm9sPy52YWx1ZSxcbiAgICAgICAgICB0aGlzLlJlcG9zaXRvcnlGb3JtQ29udHJvbD8udmFsdWUsXG4gICAgICAgICAgdGhpcy5NYWluQnJhbmNoRm9ybUNvbnRyb2w/LnZhbHVlXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzcG9uc2U6IEJhc2VNb2RlbGVkUmVzcG9uc2U8UHJvamVjdEhvc3RpbmdEZXRhaWxzPikgPT4ge1xuICAgICAgICAgICAgdGhpcy5Ib3N0aW5nRGV0YWlscyA9IHJlc3BvbnNlLk1vZGVsO1xuXG4gICAgICAgICAgICB0aGlzLkhvc3RpbmdEZXRhaWxzLkxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmVEZXZPcHNBY3Rpb24oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSG9zdGluZ0RldGFpbHMuTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0dXBGb3JtQ29udHJvbHMoKTogdm9pZCB7XG5cbiAgICAvLyB0aGlzLmRlc3Ryb3lGb3JtQ29udHJvbHMoKTtcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2Rldk9wc0FjdGlvbkxvb2t1cCcsXG4gICAgICBuZXcgRm9ybUNvbnRyb2wodGhpcy5EZXZPcHNBY3Rpb25Mb29rdXAgfHwgJycsIFtdKVxuICAgICk7XG5cbiAgICBcblxuICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdvcmdhbml6YXRpb24nXS5qb2luKCcnKSxcbiAgICAgIG5ldyBGb3JtQ29udHJvbChcbiAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5Pcmdhbml6YXRpb24gPz8gJycsXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ3JlcG9zaXRvcnknXS5qb2luKCcnKSxcbiAgICAgIG5ldyBGb3JtQ29udHJvbCh0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sLlJlcG9zaXRvcnkgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLlVzZUJyYW5jaGVzKSB7XG4gICAgICB0aGlzLkRldk9wc1NvdXJjZUNvbnRyb2xGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgICAgW3RoaXMuU291cmNlQ29udHJvbFJvb3QsICdicmFuY2hlcyddLmpvaW4oJycpLFxuICAgICAgICBuZXcgRm9ybUNvbnRyb2wodGhpcy5FZGl0aW5nU291cmNlQ29udHJvbD8uQnJhbmNoZXMgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICApO1xuXG4gICAgICB0aGlzLlNlbGVjdGVkQnJhbmNoZXMgPSB0aGlzLkVkaXRpbmdTb3VyY2VDb250cm9sPy5CcmFuY2hlcztcblxuICAgICAgdGhpcy5EZXZPcHNTb3VyY2VDb250cm9sRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAgIFt0aGlzLlNvdXJjZUNvbnRyb2xSb290LCAnbWFpbkJyYW5jaCddLmpvaW4oJycpLFxuICAgICAgICBuZXcgRm9ybUNvbnRyb2woXG4gICAgICAgICAgdGhpcy5FZGl0aW5nU291cmNlQ29udHJvbC5NYWluQnJhbmNoID8/ICcnLFxuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5Vc2VCdWlsZFBhdGgpIHtcbiAgICAgIHRoaXMuRGV2T3BzU291cmNlQ29udHJvbEZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgICBbdGhpcy5Tb3VyY2VDb250cm9sUm9vdCwgJ2J1aWxkUGF0aCddLmpvaW4oJycpLFxuICAgICAgICBuZXcgRm9ybUNvbnRyb2wodGhpcy5CdWlsZFBhdGggPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICApO1xuICAgIH1cbiAgfVxufSJdfQ==