@eqproject/eqp-dynamic-module 0.0.4 → 0.0.6

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 (85) hide show
  1. package/README.md +43 -24
  2. package/bundles/eqproject-eqp-dynamic-module.umd.js +871 -227
  3. package/bundles/eqproject-eqp-dynamic-module.umd.js.map +1 -1
  4. package/bundles/eqproject-eqp-dynamic-module.umd.min.js +2 -2
  5. package/bundles/eqproject-eqp-dynamic-module.umd.min.js.map +1 -1
  6. package/eqproject-eqp-dynamic-module.d.ts +2 -1
  7. package/eqproject-eqp-dynamic-module.metadata.json +1 -1
  8. package/esm2015/eqproject-eqp-dynamic-module.js +3 -2
  9. package/esm2015/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +198 -22
  10. package/esm2015/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +124 -9
  11. package/esm2015/lib/components/private/add-form-field/add-form-field.component.js +64 -12
  12. package/esm2015/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +2 -2
  13. package/esm2015/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +2 -2
  14. package/esm2015/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +2 -2
  15. package/esm2015/lib/components/private/field-templates/date-field-template/date-field-template.component.js +2 -2
  16. package/esm2015/lib/components/private/field-templates/image-field-template/image-field-template.component.js +2 -2
  17. package/esm2015/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +21 -24
  18. package/esm2015/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +10 -2
  19. package/esm2015/lib/components/private/field-templates/text-field-template/text-field-template.component.js +18 -2
  20. package/esm2015/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +2 -2
  21. package/esm2015/lib/components/private/form-records/add-form-record/add-form-record.component.js +2 -2
  22. package/esm2015/lib/components/private/form-records/list-form-record/list-form-record.component.js +2 -18
  23. package/esm2015/lib/components/private/spinner/spinner.component.js +23 -0
  24. package/esm2015/lib/eqp-dynamic-module.module.js +3 -3
  25. package/esm2015/lib/models/endPointConfiguration.model.js +23 -0
  26. package/esm2015/lib/models/fields/dateField.model.js +1 -1
  27. package/esm2015/lib/models/fields/listValueField.model.js +3 -1
  28. package/esm2015/lib/models/fields/numericField.model.js +1 -1
  29. package/esm2015/lib/models/fields/textField.model.js +10 -1
  30. package/esm2015/lib/models/form.model.js +1 -1
  31. package/esm2015/lib/models/record.model.js +6 -1
  32. package/esm2015/lib/services/eqp-dynamic-module-dialog.service.js +10 -1
  33. package/esm2015/lib/services/spinner.service.js +43 -0
  34. package/esm2015/lib/services/utilityHelper.services.js +180 -13
  35. package/esm2015/public-api.js +3 -1
  36. package/esm5/eqproject-eqp-dynamic-module.js +3 -2
  37. package/esm5/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +204 -22
  38. package/esm5/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +126 -8
  39. package/esm5/lib/components/private/add-form-field/add-form-field.component.js +64 -12
  40. package/esm5/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +2 -2
  41. package/esm5/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +2 -2
  42. package/esm5/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +2 -2
  43. package/esm5/lib/components/private/field-templates/date-field-template/date-field-template.component.js +2 -2
  44. package/esm5/lib/components/private/field-templates/image-field-template/image-field-template.component.js +2 -2
  45. package/esm5/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +22 -24
  46. package/esm5/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +10 -2
  47. package/esm5/lib/components/private/field-templates/text-field-template/text-field-template.component.js +18 -2
  48. package/esm5/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +2 -2
  49. package/esm5/lib/components/private/form-records/add-form-record/add-form-record.component.js +2 -2
  50. package/esm5/lib/components/private/form-records/list-form-record/list-form-record.component.js +2 -18
  51. package/esm5/lib/components/private/spinner/spinner.component.js +24 -0
  52. package/esm5/lib/eqp-dynamic-module.module.js +3 -3
  53. package/esm5/lib/models/endPointConfiguration.model.js +33 -0
  54. package/esm5/lib/models/fields/dateField.model.js +1 -1
  55. package/esm5/lib/models/fields/listValueField.model.js +7 -1
  56. package/esm5/lib/models/fields/numericField.model.js +1 -1
  57. package/esm5/lib/models/fields/textField.model.js +10 -1
  58. package/esm5/lib/models/form.model.js +1 -1
  59. package/esm5/lib/models/record.model.js +8 -1
  60. package/esm5/lib/services/eqp-dynamic-module-dialog.service.js +11 -1
  61. package/esm5/lib/services/spinner.service.js +46 -0
  62. package/esm5/lib/services/utilityHelper.services.js +182 -11
  63. package/esm5/public-api.js +3 -1
  64. package/fesm2015/eqproject-eqp-dynamic-module.js +820 -214
  65. package/fesm2015/eqproject-eqp-dynamic-module.js.map +1 -1
  66. package/fesm5/eqproject-eqp-dynamic-module.js +864 -228
  67. package/fesm5/eqproject-eqp-dynamic-module.js.map +1 -1
  68. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +78 -4
  69. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +51 -2
  70. package/lib/components/private/add-form-field/add-form-field.component.d.ts +29 -4
  71. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +3 -11
  72. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +3 -1
  73. package/lib/components/private/spinner/spinner.component.d.ts +9 -0
  74. package/lib/models/endPointConfiguration.model.d.ts +35 -0
  75. package/lib/models/fields/dateField.model.d.ts +1 -0
  76. package/lib/models/fields/listValueField.model.d.ts +17 -0
  77. package/lib/models/fields/numericField.model.d.ts +3 -1
  78. package/lib/models/fields/textField.model.d.ts +9 -1
  79. package/lib/models/form.model.d.ts +1 -0
  80. package/lib/models/record.model.d.ts +8 -0
  81. package/lib/services/eqp-dynamic-module-dialog.service.d.ts +6 -0
  82. package/lib/services/spinner.service.d.ts +15 -0
  83. package/lib/services/utilityHelper.services.d.ts +30 -1
  84. package/package.json +3 -3
  85. package/public-api.d.ts +2 -0
@@ -2,5 +2,6 @@
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
4
  export * from './public-api';
5
- export { MaterialModule as ɵa } from './lib/modules/material.module';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwcm9qZWN0LWVxcC1keW5hbWljLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWR5bmFtaWMtbW9kdWxlLyIsInNvdXJjZXMiOlsiZXFwcm9qZWN0LWVxcC1keW5hbWljLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDO0FBRTdCLE9BQU8sRUFBQyxjQUFjLElBQUksRUFBRSxFQUFDLE1BQU0sK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG5cbmV4cG9ydCB7TWF0ZXJpYWxNb2R1bGUgYXMgybVhfSBmcm9tICcuL2xpYi9tb2R1bGVzL21hdGVyaWFsLm1vZHVsZSc7Il19
5
+ export { SpinnerComponent as ɵa } from './lib/components/private/spinner/spinner.component';
6
+ export { MaterialModule as ɵb } from './lib/modules/material.module';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwcm9qZWN0LWVxcC1keW5hbWljLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWR5bmFtaWMtbW9kdWxlLyIsInNvdXJjZXMiOlsiZXFwcm9qZWN0LWVxcC1keW5hbWljLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDO0FBRTdCLE9BQU8sRUFBQyxnQkFBZ0IsSUFBSSxFQUFFLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUMxRixPQUFPLEVBQUMsY0FBYyxJQUFJLEVBQUUsRUFBQyxNQUFNLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuXG5leHBvcnQge1NwaW5uZXJDb21wb25lbnQgYXMgybVhfSBmcm9tICcuL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudCc7XG5leHBvcnQge01hdGVyaWFsTW9kdWxlIGFzIMm1Yn0gZnJvbSAnLi9saWIvbW9kdWxlcy9tYXRlcmlhbC5tb2R1bGUnOyJdfQ==
@@ -1,58 +1,225 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { Component, EventEmitter, Input, Output } from '@angular/core';
3
3
  import { Context } from '../../../models/context.model';
4
+ import { ParamTypeEnum } from '../../../models/endPointConfiguration.model';
4
5
  import { Form, FormTypeEnum } from '../../../models/form.model';
6
+ import { DynRecord, Record } from '../../../models/record.model';
7
+ import { EqpDynamicModuleDialogService } from '../../../services/eqp-dynamic-module-dialog.service';
5
8
  import { UtilityHelperService } from '../../../services/utilityHelper.services';
6
9
  var EqpDynamicModuleComponent = /** @class */ (function () {
7
- function EqpDynamicModuleComponent() {
10
+ function EqpDynamicModuleComponent(utilityHelperService) {
11
+ this.utilityHelperService = utilityHelperService;
8
12
  this.context = new Context();
9
- this.form = new Form();
10
13
  this.showButtons = true;
11
14
  this.showTitle = true;
12
- this.viewMode = FormTypeEnum.LIST;
15
+ /**
16
+ * Url del server da chiamare per recuperare, salvare o eliminare i record.
17
+ * Usato per creare la configurazione di default degli endpoint da chiamare.
18
+ */
19
+ this.baseServerUrl = null;
20
+ /**
21
+ * Token da usare negli endpoint da chiamare per recuperare o salvare i record.
22
+ * Usato solo se viene popolata la proprietà "baseServerUrl".
23
+ */
24
+ this.userToken = null;
25
+ /**
26
+ * Configurazione degli endpoint da chiamare per recuperare o salvare i dati.
27
+ * Può essere definita dall'utente oppure lasciata null, viene popolata con dei
28
+ * valori di default se viene valorizzata la proprietà "baseServerUrl" altrimenti
29
+ * viene lasciata null e non viene eseguita nessuna chiamata al server.
30
+ */
31
+ this.endPointConfiguration = null;
32
+ /**
33
+ * Eventi emessi quando si salva, elimina o duplica un record
34
+ * se non è stato specificato un endpoint da chiamare.
35
+ */
13
36
  this.saveRecord = new EventEmitter();
14
37
  this.deleteRecord = new EventEmitter();
15
38
  this.duplicateRecord = new EventEmitter();
39
+ /**
40
+ * Eventi emessi DOPO aver eseguito una chiamata al server per il salvataggio,
41
+ * l'eliminazione o la duplicazione di un record all'endpoint specificato.
42
+ */
43
+ this.afterSaveRecord = new EventEmitter();
44
+ this.afterDeleteRecord = new EventEmitter();
45
+ this.afterDuplicateRecord = new EventEmitter();
46
+ this.form = new Form();
47
+ this.viewMode = FormTypeEnum.LIST;
16
48
  this.FormTypeEnum = FormTypeEnum;
17
49
  }
18
50
  EqpDynamicModuleComponent.prototype.ngOnInit = function () {
19
51
  UtilityHelperService.SetContext(this.context);
52
+ this.configureDefaultEndPoints();
53
+ this.getFormByID();
20
54
  };
55
+ EqpDynamicModuleComponent.prototype.getFormByID = function () {
56
+ var _this = this;
57
+ var dynamicModuleParams = new Array();
58
+ dynamicModuleParams.push({
59
+ ParamName: "id",
60
+ ParamValue: this.formID,
61
+ ParamType: ParamTypeEnum['Query param']
62
+ });
63
+ this.utilityHelperService.RunEndPointCall(this.endPointConfiguration.Forms.GetByIDEndPoint, dynamicModuleParams, function (res) {
64
+ _this.form = res;
65
+ _this.getRecordsByFormID();
66
+ }, function (err) {
67
+ console.log(err);
68
+ });
69
+ };
70
+ /**
71
+ * Metodo per configurare gli endpoint da usare di default a partire dall'url base del server
72
+ * a cui si deve connettere e al token da passare per autenticarsi.
73
+ * Se la proprietà "baseServerUrl" è null e non sono stati configurati i vari endpoint allora
74
+ * non viene eseguita nessuna chiamata http per recuperare/salvare i dati.
75
+ */
76
+ EqpDynamicModuleComponent.prototype.configureDefaultEndPoints = function () {
77
+ if (!this.endPointConfiguration && this.baseServerUrl) {
78
+ this.endPointConfiguration = this.utilityHelperService.ConfigureDefaultEndPoints(this.baseServerUrl, this.userToken);
79
+ }
80
+ };
81
+ /**
82
+ * Metodo per recuperare tutti i record salvati per una particolare Form.
83
+ * La chiamata viene effettuata solo se è stato configurato l'endPoint da usare.
84
+ * La risposta della chiamata deve essere un array di oggetti di tipo "DynRecord"
85
+ * a partire dai quali vengono ricreati i Record usati nel client.
86
+ */
87
+ EqpDynamicModuleComponent.prototype.getRecordsByFormID = function () {
88
+ var _this = this;
89
+ if (this.endPointConfiguration && this.endPointConfiguration.Records && this.endPointConfiguration.Records.GetByFormIDEndPoint) {
90
+ var dynamicModuleParams = [
91
+ { ParamName: 'EntID', ParamValue: this.form.ID, ParamType: ParamTypeEnum['Query param'] }
92
+ ];
93
+ this.utilityHelperService.RunEndPointCall(this.endPointConfiguration.Records.GetByFormIDEndPoint, dynamicModuleParams, function (res) {
94
+ _this.values = new Array();
95
+ res.forEach(function (r) {
96
+ var tmpRec = new Record();
97
+ tmpRec = JSON.parse(r.SerializedValues);
98
+ tmpRec.ID = r.ID;
99
+ tmpRec.EntID = r.EntID;
100
+ _this.values.push(tmpRec);
101
+ });
102
+ });
103
+ }
104
+ };
105
+ /**
106
+ * Metodo invocato quando si vuole aggiungere, visualizzare o modificare un record.
107
+ * Se l'evento è null vuol dire che stiamo aggiungendo un nuovo record altrimenti siamo in modifica
108
+ * o visualizzazione. In questi ultimi due casi, se è stato configurato un endpoint per il recupero
109
+ * del record completo allora viene effettuata una chiamata al server, altrimenti viene usato l'oggetto selezionato.
110
+ * @param event Oggetto con due proprietà:
111
+ * "record" = oggetto da modificare/visualizzare,
112
+ * "onlyView" = booleano (se TRUE siamo in visualizzazione altrimenti in modifica)
113
+ */
21
114
  EqpDynamicModuleComponent.prototype.onAddViewEditRecord = function (event) {
115
+ var _this = this;
22
116
  if (event != null) {
23
- this.selectedRecord = JSON.parse(JSON.stringify(event.record));
24
117
  this.onlyView = event.onlyView;
118
+ if (this.endPointConfiguration && this.endPointConfiguration.Records && this.endPointConfiguration.Records.GetByIDEndPoint) {
119
+ var dynamicModuleParams = [
120
+ { ParamName: "id", ParamValue: event.record.ID, ParamType: ParamTypeEnum['Query param'] }
121
+ ];
122
+ this.utilityHelperService.RunEndPointCall(this.endPointConfiguration.Records.GetByIDEndPoint, dynamicModuleParams, function (res) {
123
+ _this.selectedRecord = JSON.parse(res.SerializedValues);
124
+ _this.selectedRecord.ID = res.ID;
125
+ _this.selectedRecord.EntID = res.EntID;
126
+ _this.viewMode = FormTypeEnum.SCALAR;
127
+ });
128
+ }
129
+ else {
130
+ this.selectedRecord = JSON.parse(JSON.stringify(event.record));
131
+ this.viewMode = FormTypeEnum.SCALAR;
132
+ }
25
133
  }
26
134
  else {
27
135
  this.selectedRecord = null;
28
136
  this.onlyView = false;
137
+ this.viewMode = FormTypeEnum.SCALAR;
29
138
  }
30
- this.viewMode = FormTypeEnum.SCALAR;
31
139
  };
32
- EqpDynamicModuleComponent.prototype.onSaveForm = function (event) {
33
- //TODO: Salvare il record!
34
- // if (event != null) {
35
- // if (event.ID && this.values.find(v => v.ID == event.ID)) {
36
- // this.values[this.values.findIndex(v => v.ID == event.ID)] = event;
37
- // } else {
38
- // this.values.push(event);
39
- // }
40
- // }
41
- this.saveRecord.emit(event);
42
- this.viewMode = FormTypeEnum.LIST;
140
+ /**
141
+ * Metodo per salvare il record aggiunto o modificato.
142
+ * Se è stato configurato un endPoint per il salvataggio viene effettuata una chiamata al server passando l'oggeto da salvare
143
+ * nel body della chiamata, altrimenti scatena l'evento "saveRecord".
144
+ * @param event Oggetto di tipo Record da salvare.
145
+ */
146
+ EqpDynamicModuleComponent.prototype.onSaveRecord = function (event) {
147
+ var _this = this;
148
+ var _a;
149
+ if (event != null && this.endPointConfiguration != null && this.endPointConfiguration.Records.SaveEndPoint) {
150
+ var dynRec = new DynRecord();
151
+ dynRec.ID = (_a = event.ID, (_a !== null && _a !== void 0 ? _a : null));
152
+ dynRec.EntID = this.form.ID;
153
+ dynRec.Values = (event !== null && event !== void 0 ? event : null);
154
+ var dynamicModuleParams = [
155
+ { ParamName: "Record", ParamValue: dynRec, ParamType: ParamTypeEnum['In Body'] }
156
+ ];
157
+ this.utilityHelperService.RunEndPointCall(this.endPointConfiguration.Records.SaveEndPoint, dynamicModuleParams, function (res) {
158
+ _this.getRecordsByFormID();
159
+ _this.afterSaveRecord.emit(event);
160
+ _this.viewMode = FormTypeEnum.LIST;
161
+ });
162
+ }
163
+ else {
164
+ this.saveRecord.emit(event);
165
+ this.viewMode = FormTypeEnum.LIST;
166
+ }
43
167
  };
168
+ /**
169
+ * Metodo per duplicare un record precedentemente salvato.
170
+ * Se è stato configurato un endPoint per la duplicazione lato server allora effettua una chiamata passando nel body
171
+ * un oggetto contenente il record da duplicare, altrimenti scatena l'evento di output "duplicateRecord".
172
+ * @param record Oggetto di tipo Record da duplicare.
173
+ */
44
174
  EqpDynamicModuleComponent.prototype.onDuplicateRecord = function (record) {
45
- this.duplicateRecord.emit(record);
175
+ var _this = this;
176
+ if (this.endPointConfiguration && this.endPointConfiguration.Records.DuplicateEndPoint) {
177
+ EqpDynamicModuleDialogService.Confirm('Duplicare il record selezionato?', function () {
178
+ var dynamicModuleParams = [
179
+ { ParamName: "id", ParamValue: record.ID, ParamType: ParamTypeEnum['Query param'] }
180
+ ];
181
+ _this.utilityHelperService.RunEndPointCall(_this.endPointConfiguration.Records.DuplicateEndPoint, dynamicModuleParams, function (res) {
182
+ _this.getRecordsByFormID();
183
+ _this.afterDuplicateRecord.emit(record);
184
+ });
185
+ }, false, 'Richiesta conferma');
186
+ }
187
+ else {
188
+ this.duplicateRecord.emit(record);
189
+ }
46
190
  };
191
+ /**
192
+ * Metodo per eliminare un record.
193
+ * Se è stato configurato un endPoint per l'eliminazione allora effettua una chiamata passando l'ID del record da eliminare
194
+ * come query param all'interno della rotta, altrimenti scatena l'evento di output "deleteRecord".
195
+ * @param record Oggetto di tipo Record da duplicare.
196
+ */
47
197
  EqpDynamicModuleComponent.prototype.onDeleteRecord = function (record) {
48
- this.deleteRecord.emit(record);
198
+ var _this = this;
199
+ if (this.endPointConfiguration && this.endPointConfiguration.Records.DeleteEndPoint) {
200
+ EqpDynamicModuleDialogService.Confirm('Eliminare il record selezionato?', function () {
201
+ var dynamicModuleParams = [
202
+ { ParamName: "id", ParamValue: record.ID, ParamType: ParamTypeEnum['Query param'] }
203
+ ];
204
+ _this.utilityHelperService.RunEndPointCall(_this.endPointConfiguration.Records.DeleteEndPoint, dynamicModuleParams, function (res) {
205
+ _this.getRecordsByFormID();
206
+ _this.afterDeleteRecord.emit(record);
207
+ });
208
+ }, false, 'Richiesta conferma');
209
+ }
210
+ else {
211
+ this.deleteRecord.emit(record);
212
+ }
49
213
  };
214
+ EqpDynamicModuleComponent.ctorParameters = function () { return [
215
+ { type: UtilityHelperService }
216
+ ]; };
50
217
  __decorate([
51
218
  Input()
52
219
  ], EqpDynamicModuleComponent.prototype, "context", void 0);
53
220
  __decorate([
54
221
  Input()
55
- ], EqpDynamicModuleComponent.prototype, "form", void 0);
222
+ ], EqpDynamicModuleComponent.prototype, "formID", void 0);
56
223
  __decorate([
57
224
  Input()
58
225
  ], EqpDynamicModuleComponent.prototype, "values", void 0);
@@ -64,7 +231,13 @@ var EqpDynamicModuleComponent = /** @class */ (function () {
64
231
  ], EqpDynamicModuleComponent.prototype, "showTitle", void 0);
65
232
  __decorate([
66
233
  Input()
67
- ], EqpDynamicModuleComponent.prototype, "viewMode", void 0);
234
+ ], EqpDynamicModuleComponent.prototype, "baseServerUrl", void 0);
235
+ __decorate([
236
+ Input()
237
+ ], EqpDynamicModuleComponent.prototype, "userToken", void 0);
238
+ __decorate([
239
+ Input()
240
+ ], EqpDynamicModuleComponent.prototype, "endPointConfiguration", void 0);
68
241
  __decorate([
69
242
  Output()
70
243
  ], EqpDynamicModuleComponent.prototype, "saveRecord", void 0);
@@ -74,14 +247,23 @@ var EqpDynamicModuleComponent = /** @class */ (function () {
74
247
  __decorate([
75
248
  Output()
76
249
  ], EqpDynamicModuleComponent.prototype, "duplicateRecord", void 0);
250
+ __decorate([
251
+ Output()
252
+ ], EqpDynamicModuleComponent.prototype, "afterSaveRecord", void 0);
253
+ __decorate([
254
+ Output()
255
+ ], EqpDynamicModuleComponent.prototype, "afterDeleteRecord", void 0);
256
+ __decorate([
257
+ Output()
258
+ ], EqpDynamicModuleComponent.prototype, "afterDuplicateRecord", void 0);
77
259
  EqpDynamicModuleComponent = __decorate([
78
260
  Component({
79
261
  selector: 'eqp-dynamic-module',
80
- template: "<add-form-record *ngIf=\"viewMode == FormTypeEnum.SCALAR\" [form]=\"form\" [record]=\"selectedRecord\"\r\n [showButtons]=\"showButtons\" [onlyView]=\"onlyView\" (saveRecordEvent)=\"onSaveForm($event)\" [showTitle]=\"showTitle\">\r\n</add-form-record>\r\n\r\n<list-form-record *ngIf=\"viewMode == FormTypeEnum.LIST\" [form]=\"form\" [values]=\"values\"\r\n (onAddViewEditRecord)=\"onAddViewEditRecord($event)\" [showTitle]=\"showTitle\"\r\n (onDeleteRecord)=\"onDeleteRecord($event)\" (onDuplicateRecord)=\"onDuplicateRecord($event)\">\r\n</list-form-record>",
262
+ template: "<eqp-dynamic-module-spinner></eqp-dynamic-module-spinner>\r\n\r\n<add-form-record *ngIf=\"viewMode == FormTypeEnum.SCALAR\" [form]=\"form\" [record]=\"selectedRecord\"\r\n [showButtons]=\"showButtons\" [onlyView]=\"onlyView\" (saveRecordEvent)=\"onSaveRecord($event)\" [showTitle]=\"showTitle\">\r\n</add-form-record>\r\n\r\n<list-form-record *ngIf=\"viewMode == FormTypeEnum.LIST && values\" [form]=\"form\" [values]=\"values\"\r\n (onAddViewEditRecord)=\"onAddViewEditRecord($event)\" [showTitle]=\"showTitle\"\r\n (onDeleteRecord)=\"onDeleteRecord($event)\" (onDuplicateRecord)=\"onDuplicateRecord($event)\">\r\n</list-form-record>",
81
263
  styles: ["::ng-deep mat-form-field{width:100%}"]
82
264
  })
83
265
  ], EqpDynamicModuleComponent);
84
266
  return EqpDynamicModuleComponent;
85
267
  }());
86
268
  export { EqpDynamicModuleComponent };
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWR5bmFtaWMtbW9kdWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWR5bmFtaWMtbW9kdWxlLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvZXhwb3J0ZWQvZXFwLWR5bmFtaWMtbW9kdWxlL2VxcC1keW5hbWljLW1vZHVsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFPaEY7SUFrQkU7UUFoQlMsWUFBTyxHQUFZLElBQUksT0FBTyxFQUFFLENBQUM7UUFDakMsU0FBSSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7UUFFeEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixhQUFRLEdBQWlCLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFHMUMsZUFBVSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzlELGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDaEUsb0JBQWUsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUU3RSxpQkFBWSxHQUFHLFlBQVksQ0FBQztJQUt4QixDQUFDO0lBRUwsNENBQVEsR0FBUjtRQUNFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELHVEQUFtQixHQUFuQixVQUFvQixLQUE0QztRQUM5RCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1NBQ2hDO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUN0QyxDQUFDO0lBRUQsOENBQVUsR0FBVixVQUFXLEtBQWE7UUFDdEIsMEJBQTBCO1FBRTFCLHVCQUF1QjtRQUN2QiwrREFBK0Q7UUFDL0QseUVBQXlFO1FBQ3pFLGFBQWE7UUFDYiwrQkFBK0I7UUFDL0IsTUFBTTtRQUNOLElBQUk7UUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELHFEQUFpQixHQUFqQixVQUFrQixNQUFjO1FBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxrREFBYyxHQUFkLFVBQWUsTUFBYztRQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBdERRO1FBQVIsS0FBSyxFQUFFOzhEQUFrQztJQUNqQztRQUFSLEtBQUssRUFBRTsyREFBeUI7SUFDeEI7UUFBUixLQUFLLEVBQUU7NkRBQXVCO0lBQ3RCO1FBQVIsS0FBSyxFQUFFO2tFQUFvQjtJQUNuQjtRQUFSLEtBQUssRUFBRTtnRUFBa0I7SUFDakI7UUFBUixLQUFLLEVBQUU7K0RBQTRDO0lBRzFDO1FBQVQsTUFBTSxFQUFFO2lFQUErRDtJQUM5RDtRQUFULE1BQU0sRUFBRTttRUFBaUU7SUFDaEU7UUFBVCxNQUFNLEVBQUU7c0VBQW9FO0lBWmxFLHlCQUF5QjtRQUxyQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLGtrQkFBa0Q7O1NBRW5ELENBQUM7T0FDVyx5QkFBeUIsQ0F5RHJDO0lBQUQsZ0NBQUM7Q0FBQSxBQXpERCxJQXlEQztTQXpEWSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY29udGV4dC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm0sIEZvcm1UeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VxcC1keW5hbWljLW1vZHVsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2VxcC1keW5hbWljLW1vZHVsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZXFwLWR5bmFtaWMtbW9kdWxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVxcER5bmFtaWNNb2R1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBjb250ZXh0OiBDb250ZXh0ID0gbmV3IENvbnRleHQoKTtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtID0gbmV3IEZvcm0oKTtcclxuICBASW5wdXQoKSB2YWx1ZXM6IEFycmF5PFJlY29yZD47XHJcbiAgQElucHV0KCkgc2hvd0J1dHRvbnMgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dUaXRsZSA9IHRydWU7XHJcbiAgQElucHV0KCkgdmlld01vZGU6IEZvcm1UeXBlRW51bSA9IEZvcm1UeXBlRW51bS5MSVNUO1xyXG5cclxuXHJcbiAgQE91dHB1dCgpIHNhdmVSZWNvcmQ6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZVJlY29yZDogRXZlbnRFbWl0dGVyPFJlY29yZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcclxuICBAT3V0cHV0KCkgZHVwbGljYXRlUmVjb3JkOiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG5cclxuICBGb3JtVHlwZUVudW0gPSBGb3JtVHlwZUVudW07XHJcbiAgc2VsZWN0ZWRSZWNvcmQ6IFJlY29yZDtcclxuICBvbmx5VmlldzogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBVdGlsaXR5SGVscGVyU2VydmljZS5TZXRDb250ZXh0KHRoaXMuY29udGV4dCk7XHJcbiAgfVxyXG5cclxuICBvbkFkZFZpZXdFZGl0UmVjb3JkKGV2ZW50OiB7IHJlY29yZDogUmVjb3JkLCBvbmx5VmlldzogYm9vbGVhbiB9KSB7XHJcbiAgICBpZiAoZXZlbnQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUmVjb3JkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShldmVudC5yZWNvcmQpKTtcclxuICAgICAgdGhpcy5vbmx5VmlldyA9IGV2ZW50Lm9ubHlWaWV3O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJlY29yZCA9IG51bGw7XHJcbiAgICAgIHRoaXMub25seVZpZXcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMudmlld01vZGUgPSBGb3JtVHlwZUVudW0uU0NBTEFSO1xyXG4gIH1cclxuXHJcbiAgb25TYXZlRm9ybShldmVudDogUmVjb3JkKSB7XHJcbiAgICAvL1RPRE86IFNhbHZhcmUgaWwgcmVjb3JkIVxyXG5cclxuICAgIC8vIGlmIChldmVudCAhPSBudWxsKSB7XHJcbiAgICAvLyAgIGlmIChldmVudC5JRCAmJiB0aGlzLnZhbHVlcy5maW5kKHYgPT4gdi5JRCA9PSBldmVudC5JRCkpIHtcclxuICAgIC8vICAgICB0aGlzLnZhbHVlc1t0aGlzLnZhbHVlcy5maW5kSW5kZXgodiA9PiB2LklEID09IGV2ZW50LklEKV0gPSBldmVudDtcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICB0aGlzLnZhbHVlcy5wdXNoKGV2ZW50KTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5zYXZlUmVjb3JkLmVtaXQoZXZlbnQpO1xyXG4gICAgdGhpcy52aWV3TW9kZSA9IEZvcm1UeXBlRW51bS5MSVNUO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGVSZWNvcmQocmVjb3JkOiBSZWNvcmQpIHtcclxuICAgIHRoaXMuZHVwbGljYXRlUmVjb3JkLmVtaXQocmVjb3JkKTtcclxuICB9XHJcblxyXG4gIG9uRGVsZXRlUmVjb3JkKHJlY29yZDogUmVjb3JkKSB7XHJcbiAgICB0aGlzLmRlbGV0ZVJlY29yZC5lbWl0KHJlY29yZCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWR5bmFtaWMtbW9kdWxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWR5bmFtaWMtbW9kdWxlLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvZXhwb3J0ZWQvZXFwLWR5bmFtaWMtbW9kdWxlL2VxcC1keW5hbWljLW1vZHVsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBMkQsYUFBYSxFQUFxQixNQUFNLDZDQUE2QyxDQUFDO0FBQ3hKLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQU9oRjtJQW1ERSxtQ0FDVSxvQkFBMEM7UUFBMUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQWxEM0MsWUFBTyxHQUFZLElBQUksT0FBTyxFQUFFLENBQUM7UUFJakMsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUUxQjs7O1dBR0c7UUFDTSxrQkFBYSxHQUFXLElBQUksQ0FBQztRQUV0Qzs7O1dBR0c7UUFDTSxjQUFTLEdBQVcsSUFBSSxDQUFDO1FBRWxDOzs7OztXQUtHO1FBQ00sMEJBQXFCLEdBQTBCLElBQUksQ0FBQztRQUU3RDs7O1dBR0c7UUFDTyxlQUFVLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDOUQsaUJBQVks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QUFNLEVBQUU7bUVBQWlFO0lBQ2hFO1FBQVQsTUFBTSxFQUFFO3NFQUFvRTtJQU1uRTtRQUFULE1BQU0sRUFBRTtzRUFBb0U7SUFDbkU7UUFBVCxNQUFNLEVBQUU7d0VBQXNFO0lBQ3JFO1FBQVQsTUFBTSxFQUFFOzJFQUF5RTtJQTNDdkUseUJBQXlCO1FBTHJDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxvQkFBb0I7WUFDOUIsK29CQUFrRDs7U0FFbkQsQ0FBQztPQUNXLHlCQUF5QixDQXNOckM7SUFBRCxnQ0FBQztDQUFBLEFBdE5ELElBc05DO1NBdE5ZLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb250ZXh0Lm1vZGVsJztcclxuaW1wb3J0IHsgRW5kUG9pbnRDb25maWd1cmF0aW9uLCBFbmRQb2ludERhdGEsIEVuZFBvaW50RGF0YVBhcmFtcywgUGFyYW1UeXBlRW51bSwgUmVxdWVzdE1ldGhvZEVudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybSwgRm9ybVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBEeW5SZWNvcmQsIFJlY29yZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yZWNvcmQubW9kZWwnO1xyXG5pbXBvcnQgeyBFcXBEeW5hbWljTW9kdWxlRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2VxcC1keW5hbWljLW1vZHVsZS1kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VxcC1keW5hbWljLW1vZHVsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2VxcC1keW5hbWljLW1vZHVsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZXFwLWR5bmFtaWMtbW9kdWxlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVxcER5bmFtaWNNb2R1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBjb250ZXh0OiBDb250ZXh0ID0gbmV3IENvbnRleHQoKTtcclxuICAvL0BJbnB1dCgpIGZvcm06IEZvcm0gPSBuZXcgRm9ybSgpO1xyXG4gIEBJbnB1dCgpIGZvcm1JRDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHZhbHVlczogQXJyYXk8UmVjb3JkPjtcclxuICBASW5wdXQoKSBzaG93QnV0dG9ucyA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd1RpdGxlID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogVXJsIGRlbCBzZXJ2ZXIgZGEgY2hpYW1hcmUgcGVyIHJlY3VwZXJhcmUsIHNhbHZhcmUgbyBlbGltaW5hcmUgaSByZWNvcmQuXHJcbiAgICogVXNhdG8gcGVyIGNyZWFyZSBsYSBjb25maWd1cmF6aW9uZSBkaSBkZWZhdWx0IGRlZ2xpIGVuZHBvaW50IGRhIGNoaWFtYXJlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhc2VTZXJ2ZXJVcmw6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRva2VuIGRhIHVzYXJlIG5lZ2xpIGVuZHBvaW50IGRhIGNoaWFtYXJlIHBlciByZWN1cGVyYXJlIG8gc2FsdmFyZSBpIHJlY29yZC5cclxuICAgKiBVc2F0byBzb2xvIHNlIHZpZW5lIHBvcG9sYXRhIGxhIHByb3ByaWV0w6AgXCJiYXNlU2VydmVyVXJsXCIuXHJcbiAgICovXHJcbiAgQElucHV0KCkgdXNlclRva2VuOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBDb25maWd1cmF6aW9uZSBkZWdsaSBlbmRwb2ludCBkYSBjaGlhbWFyZSBwZXIgcmVjdXBlcmFyZSBvIHNhbHZhcmUgaSBkYXRpLlxyXG4gICAqIFB1w7IgZXNzZXJlIGRlZmluaXRhIGRhbGwndXRlbnRlIG9wcHVyZSBsYXNjaWF0YSBudWxsLCB2aWVuZSBwb3BvbGF0YSBjb24gZGVpXHJcbiAgICogdmFsb3JpIGRpIGRlZmF1bHQgc2UgdmllbmUgdmFsb3JpenphdGEgbGEgcHJvcHJpZXTDoCBcImJhc2VTZXJ2ZXJVcmxcIiBhbHRyaW1lbnRpXHJcbiAgICogdmllbmUgbGFzY2lhdGEgbnVsbCBlIG5vbiB2aWVuZSBlc2VndWl0YSBuZXNzdW5hIGNoaWFtYXRhIGFsIHNlcnZlci5cclxuICAgKi9cclxuICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbiA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50aSBlbWVzc2kgcXVhbmRvIHNpIHNhbHZhLCBlbGltaW5hIG8gZHVwbGljYSB1biByZWNvcmRcclxuICAgKiBzZSBub24gw6ggc3RhdG8gc3BlY2lmaWNhdG8gdW4gZW5kcG9pbnQgZGEgY2hpYW1hcmUuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHNhdmVSZWNvcmQ6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZVJlY29yZDogRXZlbnRFbWl0dGVyPFJlY29yZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcclxuICBAT3V0cHV0KCkgZHVwbGljYXRlUmVjb3JkOiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudGkgZW1lc3NpIERPUE8gYXZlciBlc2VndWl0byB1bmEgY2hpYW1hdGEgYWwgc2VydmVyIHBlciBpbCBzYWx2YXRhZ2dpbyxcclxuICAgKiBsJ2VsaW1pbmF6aW9uZSBvIGxhIGR1cGxpY2F6aW9uZSBkaSB1biByZWNvcmQgYWxsJ2VuZHBvaW50IHNwZWNpZmljYXRvLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBhZnRlclNhdmVSZWNvcmQ6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgQE91dHB1dCgpIGFmdGVyRGVsZXRlUmVjb3JkOiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG4gIEBPdXRwdXQoKSBhZnRlckR1cGxpY2F0ZVJlY29yZDogRXZlbnRFbWl0dGVyPFJlY29yZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcclxuXHJcbiAgZm9ybTogRm9ybSA9IG5ldyBGb3JtKCk7XHJcbiAgdmlld01vZGU6IEZvcm1UeXBlRW51bSA9IEZvcm1UeXBlRW51bS5MSVNUO1xyXG4gIEZvcm1UeXBlRW51bSA9IEZvcm1UeXBlRW51bTtcclxuICBzZWxlY3RlZFJlY29yZDogUmVjb3JkO1xyXG4gIG9ubHlWaWV3OiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdXRpbGl0eUhlbHBlclNlcnZpY2U6IFV0aWxpdHlIZWxwZXJTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBVdGlsaXR5SGVscGVyU2VydmljZS5TZXRDb250ZXh0KHRoaXMuY29udGV4dCk7XHJcbiAgICB0aGlzLmNvbmZpZ3VyZURlZmF1bHRFbmRQb2ludHMoKTtcclxuICAgIHRoaXMuZ2V0Rm9ybUJ5SUQoKTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1CeUlEKCl7XHJcbiAgICBjb25zdCBkeW5hbWljTW9kdWxlUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID0gbmV3IEFycmF5PEVuZFBvaW50RGF0YVBhcmFtcz4oKTtcclxuICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMucHVzaCh7XHJcbiAgICAgIFBhcmFtTmFtZTogXCJpZFwiLFxyXG4gICAgICBQYXJhbVZhbHVlOiB0aGlzLmZvcm1JRCxcclxuICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zLkdldEJ5SURFbmRQb2ludCwgZHluYW1pY01vZHVsZVBhcmFtcywgKHJlczogRm9ybSkgPT4ge1xyXG4gICAgICB0aGlzLmZvcm0gPSByZXM7XHJcbiAgICAgIHRoaXMuZ2V0UmVjb3Jkc0J5Rm9ybUlEKCk7XHJcbiAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY29uZmlndXJhcmUgZ2xpIGVuZHBvaW50IGRhIHVzYXJlIGRpIGRlZmF1bHQgYSBwYXJ0aXJlIGRhbGwndXJsIGJhc2UgZGVsIHNlcnZlclxyXG4gICAqIGEgY3VpIHNpIGRldmUgY29ubmV0dGVyZSBlIGFsIHRva2VuIGRhIHBhc3NhcmUgcGVyIGF1dGVudGljYXJzaS5cclxuICAgKiBTZSBsYSBwcm9wcmlldMOgIFwiYmFzZVNlcnZlclVybFwiIMOoIG51bGwgZSBub24gc29ubyBzdGF0aSBjb25maWd1cmF0aSBpIHZhcmkgZW5kcG9pbnQgYWxsb3JhXHJcbiAgICogbm9uIHZpZW5lIGVzZWd1aXRhIG5lc3N1bmEgY2hpYW1hdGEgaHR0cCBwZXIgcmVjdXBlcmFyZS9zYWx2YXJlIGkgZGF0aS5cclxuICAgKi9cclxuICBjb25maWd1cmVEZWZhdWx0RW5kUG9pbnRzKCkge1xyXG4gICAgaWYgKCF0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbiAmJiB0aGlzLmJhc2VTZXJ2ZXJVcmwpIHtcclxuICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24gPSB0aGlzLnV0aWxpdHlIZWxwZXJTZXJ2aWNlLkNvbmZpZ3VyZURlZmF1bHRFbmRQb2ludHModGhpcy5iYXNlU2VydmVyVXJsLCB0aGlzLnVzZXJUb2tlbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHJlY3VwZXJhcmUgdHV0dGkgaSByZWNvcmQgc2FsdmF0aSBwZXIgdW5hIHBhcnRpY29sYXJlIEZvcm0uXHJcbiAgICogTGEgY2hpYW1hdGEgdmllbmUgZWZmZXR0dWF0YSBzb2xvIHNlIMOoIHN0YXRvIGNvbmZpZ3VyYXRvIGwnZW5kUG9pbnQgZGEgdXNhcmUuXHJcbiAgICogTGEgcmlzcG9zdGEgZGVsbGEgY2hpYW1hdGEgZGV2ZSBlc3NlcmUgdW4gYXJyYXkgZGkgb2dnZXR0aSBkaSB0aXBvIFwiRHluUmVjb3JkXCJcclxuICAgKiBhIHBhcnRpcmUgZGFpIHF1YWxpIHZlbmdvbm8gcmljcmVhdGkgaSBSZWNvcmQgdXNhdGkgbmVsIGNsaWVudC5cclxuICAgKi9cclxuICBnZXRSZWNvcmRzQnlGb3JtSUQoKSB7XHJcbiAgICBpZiAodGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24gJiYgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3JkcyAmJiB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkdldEJ5Rm9ybUlERW5kUG9pbnQpIHtcclxuICAgICAgdmFyIGR5bmFtaWNNb2R1bGVQYXJhbXMgPSBbXHJcbiAgICAgICAgeyBQYXJhbU5hbWU6ICdFbnRJRCcsIFBhcmFtVmFsdWU6IHRoaXMuZm9ybS5JRCwgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy51dGlsaXR5SGVscGVyU2VydmljZS5SdW5FbmRQb2ludENhbGwodGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5HZXRCeUZvcm1JREVuZFBvaW50LCBkeW5hbWljTW9kdWxlUGFyYW1zLCAocmVzOiBBcnJheTxEeW5SZWNvcmQ+KSA9PiB7XHJcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgQXJyYXk8UmVjb3JkPigpO1xyXG4gICAgICAgIHJlcy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgICAgdmFyIHRtcFJlYzogUmVjb3JkID0gbmV3IFJlY29yZCgpO1xyXG4gICAgICAgICAgdG1wUmVjID0gSlNPTi5wYXJzZShyLlNlcmlhbGl6ZWRWYWx1ZXMpO1xyXG4gICAgICAgICAgdG1wUmVjLklEID0gci5JRDtcclxuICAgICAgICAgIHRtcFJlYy5FbnRJRCA9IHIuRW50SUQ7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHRtcFJlYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIHF1YW5kbyBzaSB2dW9sZSBhZ2dpdW5nZXJlLCB2aXN1YWxpenphcmUgbyBtb2RpZmljYXJlIHVuIHJlY29yZC5cclxuICAgKiBTZSBsJ2V2ZW50byDDqCBudWxsIHZ1b2wgZGlyZSBjaGUgc3RpYW1vIGFnZ2l1bmdlbmRvIHVuIG51b3ZvIHJlY29yZCBhbHRyaW1lbnRpIHNpYW1vIGluIG1vZGlmaWNhXHJcbiAgICogbyB2aXN1YWxpenphemlvbmUuIEluIHF1ZXN0aSB1bHRpbWkgZHVlIGNhc2ksIHNlIMOoIHN0YXRvIGNvbmZpZ3VyYXRvIHVuIGVuZHBvaW50IHBlciBpbCByZWN1cGVyb1xyXG4gICAqIGRlbCByZWNvcmQgY29tcGxldG8gYWxsb3JhIHZpZW5lIGVmZmV0dHVhdGEgdW5hIGNoaWFtYXRhIGFsIHNlcnZlciwgYWx0cmltZW50aSB2aWVuZSB1c2F0byBsJ29nZ2V0dG8gc2VsZXppb25hdG8uXHJcbiAgICogQHBhcmFtIGV2ZW50IE9nZ2V0dG8gY29uIGR1ZSBwcm9wcmlldMOgOlxyXG4gICAqIFwicmVjb3JkXCIgPSBvZ2dldHRvIGRhIG1vZGlmaWNhcmUvdmlzdWFsaXp6YXJlLFxyXG4gICAqIFwib25seVZpZXdcIiA9IGJvb2xlYW5vIChzZSBUUlVFIHNpYW1vIGluIHZpc3VhbGl6emF6aW9uZSBhbHRyaW1lbnRpIGluIG1vZGlmaWNhKVxyXG4gICAqL1xyXG4gIG9uQWRkVmlld0VkaXRSZWNvcmQoZXZlbnQ6IHsgcmVjb3JkOiBSZWNvcmQsIG9ubHlWaWV3OiBib29sZWFuIH0pIHtcclxuICAgIGlmIChldmVudCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMub25seVZpZXcgPSBldmVudC5vbmx5VmlldztcclxuICAgICAgaWYgKHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uICYmIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMgJiYgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5HZXRCeUlERW5kUG9pbnQpIHtcclxuICAgICAgICB2YXIgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAgICAgIHsgUGFyYW1OYW1lOiBcImlkXCIsIFBhcmFtVmFsdWU6IGV2ZW50LnJlY29yZC5JRCwgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddIH1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuR2V0QnlJREVuZFBvaW50LCBkeW5hbWljTW9kdWxlUGFyYW1zLCAocmVzOiBEeW5SZWNvcmQpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZWNvcmQgPSBKU09OLnBhcnNlKHJlcy5TZXJpYWxpemVkVmFsdWVzKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZWNvcmQuSUQgPSByZXMuSUQ7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUmVjb3JkLkVudElEID0gcmVzLkVudElEO1xyXG4gICAgICAgICAgdGhpcy52aWV3TW9kZSA9IEZvcm1UeXBlRW51bS5TQ0FMQVI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJlY29yZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQucmVjb3JkKSk7XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IEZvcm1UeXBlRW51bS5TQ0FMQVI7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWNvcmQgPSBudWxsO1xyXG4gICAgICB0aGlzLm9ubHlWaWV3ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudmlld01vZGUgPSBGb3JtVHlwZUVudW0uU0NBTEFSO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBzYWx2YXJlIGlsIHJlY29yZCBhZ2dpdW50byBvIG1vZGlmaWNhdG8uXHJcbiAgICogU2Ugw6ggc3RhdG8gY29uZmlndXJhdG8gdW4gZW5kUG9pbnQgcGVyIGlsIHNhbHZhdGFnZ2lvIHZpZW5lIGVmZmV0dHVhdGEgdW5hIGNoaWFtYXRhIGFsIHNlcnZlciBwYXNzYW5kbyBsJ29nZ2V0byBkYSBzYWx2YXJlXHJcbiAgICogbmVsIGJvZHkgZGVsbGEgY2hpYW1hdGEsIGFsdHJpbWVudGkgc2NhdGVuYSBsJ2V2ZW50byBcInNhdmVSZWNvcmRcIi5cclxuICAgKiBAcGFyYW0gZXZlbnQgT2dnZXR0byBkaSB0aXBvIFJlY29yZCBkYSBzYWx2YXJlLlxyXG4gICAqL1xyXG4gIG9uU2F2ZVJlY29yZChldmVudDogUmVjb3JkKSB7XHJcbiAgICBpZiAoZXZlbnQgIT0gbnVsbCAmJiB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbiAhPSBudWxsICYmIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuU2F2ZUVuZFBvaW50KSB7XHJcbiAgICAgIHZhciBkeW5SZWM6IER5blJlY29yZCA9IG5ldyBEeW5SZWNvcmQoKTtcclxuICAgICAgZHluUmVjLklEID0gZXZlbnQuSUQgPz8gbnVsbDtcclxuICAgICAgZHluUmVjLkVudElEID0gdGhpcy5mb3JtLklEO1xyXG4gICAgICBkeW5SZWMuVmFsdWVzID0gZXZlbnQgPz8gbnVsbDtcclxuICAgICAgdmFyIGR5bmFtaWNNb2R1bGVQYXJhbXMgPSBbXHJcbiAgICAgICAgeyBQYXJhbU5hbWU6IFwiUmVjb3JkXCIsIFBhcmFtVmFsdWU6IGR5blJlYywgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtWydJbiBCb2R5J10gfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnV0aWxpdHlIZWxwZXJTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbCh0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLlNhdmVFbmRQb2ludCwgZHluYW1pY01vZHVsZVBhcmFtcywgKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2V0UmVjb3Jkc0J5Rm9ybUlEKCk7XHJcbiAgICAgICAgdGhpcy5hZnRlclNhdmVSZWNvcmQuZW1pdChldmVudCk7XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IEZvcm1UeXBlRW51bS5MSVNUO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2F2ZVJlY29yZC5lbWl0KGV2ZW50KTtcclxuICAgICAgdGhpcy52aWV3TW9kZSA9IEZvcm1UeXBlRW51bS5MSVNUO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBkdXBsaWNhcmUgdW4gcmVjb3JkIHByZWNlZGVudGVtZW50ZSBzYWx2YXRvLlxyXG4gICAqIFNlIMOoIHN0YXRvIGNvbmZpZ3VyYXRvIHVuIGVuZFBvaW50IHBlciBsYSBkdXBsaWNhemlvbmUgbGF0byBzZXJ2ZXIgYWxsb3JhIGVmZmV0dHVhIHVuYSBjaGlhbWF0YSBwYXNzYW5kbyBuZWwgYm9keVxyXG4gICAqIHVuIG9nZ2V0dG8gY29udGVuZW50ZSBpbCByZWNvcmQgZGEgZHVwbGljYXJlLCBhbHRyaW1lbnRpIHNjYXRlbmEgbCdldmVudG8gZGkgb3V0cHV0IFwiZHVwbGljYXRlUmVjb3JkXCIuXHJcbiAgICogQHBhcmFtIHJlY29yZCBPZ2dldHRvIGRpIHRpcG8gUmVjb3JkIGRhIGR1cGxpY2FyZS5cclxuICAgKi9cclxuICBvbkR1cGxpY2F0ZVJlY29yZChyZWNvcmQ6IFJlY29yZCkge1xyXG4gICAgaWYgKHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uICYmIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuRHVwbGljYXRlRW5kUG9pbnQpIHtcclxuICAgICAgRXFwRHluYW1pY01vZHVsZURpYWxvZ1NlcnZpY2UuQ29uZmlybSgnRHVwbGljYXJlIGlsIHJlY29yZCBzZWxlemlvbmF0bz8nLCAoKSA9PiB7XHJcbiAgICAgICAgdmFyIGR5bmFtaWNNb2R1bGVQYXJhbXMgPSBbXHJcbiAgICAgICAgICB7IFBhcmFtTmFtZTogXCJpZFwiLCBQYXJhbVZhbHVlOiByZWNvcmQuSUQsIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVsnUXVlcnkgcGFyYW0nXSB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLnV0aWxpdHlIZWxwZXJTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbCh0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkR1cGxpY2F0ZUVuZFBvaW50LCBkeW5hbWljTW9kdWxlUGFyYW1zLCAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldFJlY29yZHNCeUZvcm1JRCgpO1xyXG4gICAgICAgICAgdGhpcy5hZnRlckR1cGxpY2F0ZVJlY29yZC5lbWl0KHJlY29yZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sIGZhbHNlLCAnUmljaGllc3RhIGNvbmZlcm1hJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmR1cGxpY2F0ZVJlY29yZC5lbWl0KHJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGVsaW1pbmFyZSB1biByZWNvcmQuXHJcbiAgICogU2Ugw6ggc3RhdG8gY29uZmlndXJhdG8gdW4gZW5kUG9pbnQgcGVyIGwnZWxpbWluYXppb25lIGFsbG9yYSBlZmZldHR1YSB1bmEgY2hpYW1hdGEgcGFzc2FuZG8gbCdJRCBkZWwgcmVjb3JkIGRhIGVsaW1pbmFyZVxyXG4gICAqIGNvbWUgcXVlcnkgcGFyYW0gYWxsJ2ludGVybm8gZGVsbGEgcm90dGEsIGFsdHJpbWVudGkgc2NhdGVuYSBsJ2V2ZW50byBkaSBvdXRwdXQgXCJkZWxldGVSZWNvcmRcIi5cclxuICAgKiBAcGFyYW0gcmVjb3JkIE9nZ2V0dG8gZGkgdGlwbyBSZWNvcmQgZGEgZHVwbGljYXJlLlxyXG4gICAqL1xyXG4gIG9uRGVsZXRlUmVjb3JkKHJlY29yZDogUmVjb3JkKSB7XHJcbiAgICBpZiAodGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24gJiYgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5EZWxldGVFbmRQb2ludCkge1xyXG4gICAgICBFcXBEeW5hbWljTW9kdWxlRGlhbG9nU2VydmljZS5Db25maXJtKCdFbGltaW5hcmUgaWwgcmVjb3JkIHNlbGV6aW9uYXRvPycsICgpID0+IHtcclxuICAgICAgICB2YXIgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAgICAgIHsgUGFyYW1OYW1lOiBcImlkXCIsIFBhcmFtVmFsdWU6IHJlY29yZC5JRCwgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtWydRdWVyeSBwYXJhbSddIH1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuRGVsZXRlRW5kUG9pbnQsIGR5bmFtaWNNb2R1bGVQYXJhbXMsIChyZXMpID0+IHtcclxuICAgICAgICAgIHRoaXMuZ2V0UmVjb3Jkc0J5Rm9ybUlEKCk7XHJcbiAgICAgICAgICB0aGlzLmFmdGVyRGVsZXRlUmVjb3JkLmVtaXQocmVjb3JkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSwgZmFsc2UsICdSaWNoaWVzdGEgY29uZmVybWEnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlUmVjb3JkLmVtaXQocmVjb3JkKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19