@universis/ngx-tables 6.14.2 → 9.14.2

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 (101) hide show
  1. package/bundles/universis-ngx-tables.umd.js +4902 -6847
  2. package/bundles/universis-ngx-tables.umd.js.map +1 -1
  3. package/bundles/universis-ngx-tables.umd.min.js +15 -1
  4. package/bundles/universis-ngx-tables.umd.min.js.map +1 -1
  5. package/esm2015/lib/actions/table.actions.js +7 -49
  6. package/esm2015/lib/advanced-aggregator.js +0 -5
  7. package/esm2015/lib/components/add-items/add-items.component.js +36 -96
  8. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +48 -103
  9. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +36 -58
  10. package/esm2015/lib/components/advanced-list/advanced-list.component.js +67 -120
  11. package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +61 -118
  12. package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +47 -99
  13. package/esm2015/lib/components/advanced-select/advanced-select.component.js +25 -58
  14. package/esm2015/lib/components/advanced-select/advanced-select.service.js +10 -27
  15. package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +13 -36
  16. package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +22 -50
  17. package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +15 -37
  18. package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +55 -227
  19. package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +23 -96
  20. package/esm2015/lib/components/advanced-table/advanced-table.component.js +303 -688
  21. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +1 -10
  22. package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +19 -230
  23. package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -5
  24. package/esm2015/lib/components/advanced-table/custom-button.formatter.js +3 -17
  25. package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +77 -198
  26. package/esm2015/lib/components/column-selector/column-selector.component.js +39 -109
  27. package/esm2015/lib/components/column-selector/column-selector.service.js +9 -26
  28. package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +28 -51
  29. package/esm2015/lib/directives/advance-search-state.directive.js +22 -54
  30. package/esm2015/lib/directives/advance-table-state.directive.js +20 -39
  31. package/esm2015/lib/directives/advanced-search-router-state.directive.js +15 -37
  32. package/esm2015/lib/directives/advanced-table-editor.directive.js +24 -54
  33. package/esm2015/lib/directives/btnexp.directive.js +55 -97
  34. package/esm2015/lib/i18n/tables.el.js +3 -7
  35. package/esm2015/lib/i18n/tables.en.js +3 -7
  36. package/esm2015/lib/pipes/advanced-aggregator.pipe.js +15 -18
  37. package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +13 -25
  38. package/esm2015/lib/reducers/index.js +7 -37
  39. package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +27 -48
  40. package/esm2015/lib/tables.activated-table.service.js +11 -46
  41. package/esm2015/lib/tables.module.js +90 -105
  42. package/esm2015/public_api.js +29 -34
  43. package/esm2015/universis-ngx-tables.js +2 -7
  44. package/esm5/lib/actions/table.actions.js +7 -38
  45. package/esm5/lib/advanced-aggregator.js +0 -5
  46. package/esm5/lib/components/add-items/add-items.component.js +42 -127
  47. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +58 -141
  48. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +32 -71
  49. package/esm5/lib/components/advanced-list/advanced-list.component.js +67 -136
  50. package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +62 -139
  51. package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +45 -116
  52. package/esm5/lib/components/advanced-select/advanced-select.component.js +23 -57
  53. package/esm5/lib/components/advanced-select/advanced-select.service.js +8 -27
  54. package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +15 -50
  55. package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +18 -52
  56. package/esm5/lib/components/advanced-table/advanced-table-search-base.js +17 -48
  57. package/esm5/lib/components/advanced-table/advanced-table-search.component.js +84 -329
  58. package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +27 -116
  59. package/esm5/lib/components/advanced-table/advanced-table.component.js +324 -863
  60. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +1 -10
  61. package/esm5/lib/components/advanced-table/advanced-table.formatters.js +58 -393
  62. package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -5
  63. package/esm5/lib/components/advanced-table/custom-button.formatter.js +6 -27
  64. package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +90 -296
  65. package/esm5/lib/components/column-selector/column-selector.component.js +46 -143
  66. package/esm5/lib/components/column-selector/column-selector.service.js +7 -26
  67. package/esm5/lib/components/table-simple-header/table-simple-header.component.js +26 -61
  68. package/esm5/lib/directives/advance-search-state.directive.js +24 -74
  69. package/esm5/lib/directives/advance-table-state.directive.js +17 -37
  70. package/esm5/lib/directives/advanced-search-router-state.directive.js +13 -43
  71. package/esm5/lib/directives/advanced-table-editor.directive.js +31 -81
  72. package/esm5/lib/directives/btnexp.directive.js +43 -175
  73. package/esm5/lib/i18n/tables.el.js +3 -7
  74. package/esm5/lib/i18n/tables.en.js +3 -7
  75. package/esm5/lib/pipes/advanced-aggregator.pipe.js +9 -35
  76. package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +9 -36
  77. package/esm5/lib/reducers/index.js +8 -38
  78. package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +21 -82
  79. package/esm5/lib/tables.activated-table.service.js +10 -42
  80. package/esm5/lib/tables.module.js +89 -105
  81. package/esm5/public_api.js +29 -34
  82. package/esm5/universis-ngx-tables.js +2 -7
  83. package/fesm2015/universis-ngx-tables.js +1177 -2186
  84. package/fesm2015/universis-ngx-tables.js.map +1 -1
  85. package/fesm5/universis-ngx-tables.js +1235 -3067
  86. package/fesm5/universis-ngx-tables.js.map +1 -1
  87. package/lib/actions/table.actions.d.ts +3 -3
  88. package/lib/components/add-items/add-items.component.d.ts +1 -1
  89. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +7 -4
  90. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +1 -1
  91. package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +1 -1
  92. package/lib/components/advanced-table/advanced-table-search-base.d.ts +3 -2
  93. package/lib/components/advanced-table/advanced-table-search.component.d.ts +3 -2
  94. package/lib/components/advanced-table/advanced-table.component.d.ts +13 -8
  95. package/lib/directives/advanced-table-editor.directive.d.ts +1 -1
  96. package/lib/i18n/tables.el.d.ts +108 -108
  97. package/lib/i18n/tables.en.d.ts +107 -107
  98. package/lib/reducers/index.d.ts +3 -3
  99. package/lib/tables.activated-table.service.d.ts +2 -1
  100. package/package.json +20 -31
  101. package/universis-ngx-tables.metadata.json +1 -1
@@ -1,26 +1,14 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
1
+ import { __awaiter, __decorate } from "tslib";
6
2
  import { Component, ViewChild, Input } from '@angular/core';
7
3
  import { AngularDataContext } from '@themost/angular';
8
4
  import { TranslateService } from '@ngx-translate/core';
9
5
  import { ActivatedRoute } from '@angular/router';
10
- import { AdvancedTableComponent, AdvancedTableConfiguration } from '../advanced-table/advanced-table.component';
6
+ // tslint:disable-next-line: max-line-length
7
+ import { AdvancedTableConfiguration } from '../advanced-table/advanced-table.component';
11
8
  import { ErrorService, DIALOG_BUTTONS, ModalService, UserActivityService } from '@universis/common';
12
9
  import { ResponseError } from '@themost/client';
13
10
  import { ToastService } from '@universis/common';
14
- export class AdvancedListComponent {
15
- /**
16
- * @param {?} _context
17
- * @param {?} _translateService
18
- * @param {?} _activatedRoute
19
- * @param {?} _errorService
20
- * @param {?} _toastService
21
- * @param {?} _modalService
22
- * @param {?} _userActivityService
23
- */
11
+ let AdvancedListComponent = class AdvancedListComponent {
24
12
  constructor(_context, _translateService, _activatedRoute, _errorService, _toastService, _modalService, _userActivityService) {
25
13
  this._context = _context;
26
14
  this._translateService = _translateService;
@@ -33,9 +21,6 @@ export class AdvancedListComponent {
33
21
  this.allowSaveOption = true;
34
22
  this.readonly = false;
35
23
  }
36
- /**
37
- * @return {?}
38
- */
39
24
  ngOnDestroy() {
40
25
  if (this.dataSubscription) {
41
26
  this.dataSubscription.unsubscribe();
@@ -47,24 +32,19 @@ export class AdvancedListComponent {
47
32
  this.subscription.unsubscribe();
48
33
  }
49
34
  }
50
- /**
51
- * @return {?}
52
- */
53
35
  ngAfterViewInit() {
54
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
36
+ return __awaiter(this, void 0, void 0, function* () {
55
37
  try {
56
38
  if (this.table == null) {
57
39
  return;
58
40
  }
59
- /** @type {?} */
60
41
  const table = this.table;
61
- /** @type {?} */
42
+ // get metadata
62
43
  const metadata = yield this._context.getMetadata();
63
44
  // get route data
64
45
  this.dataSubscription = this._activatedRoute.data.subscribe(routeData => {
65
- /** @type {?} */
66
- const re = new RegExp(`^${routeData["model"]}$`, 'ig');
67
- /** @type {?} */
46
+ // get entityType
47
+ const re = new RegExp(`^${routeData.model}$`, 'ig');
68
48
  const entitySet = metadata.EntityContainer.EntitySet.find(x => {
69
49
  return re.test(x.Name);
70
50
  });
@@ -73,49 +53,48 @@ export class AdvancedListComponent {
73
53
  // navigate to error
74
54
  return this._errorService.navigateToError(new ResponseError('EntitySet Not Found', 404));
75
55
  }
76
- /** @type {?} */
56
+ // get entity type
77
57
  const entityType = metadata.EntityType.find(x => {
78
58
  return x.Name === entitySet.EntityType;
79
59
  });
80
60
  if (entityType == null) {
81
61
  return this._errorService.navigateToError(new ResponseError('EntityType Not Found', 404));
82
62
  }
83
- if (routeData["searchConfiguration"]) {
84
- if (Object.prototype.hasOwnProperty.call(routeData["searchConfiguration"], 'allowSave')) {
85
- this.allowSaveOption = routeData["searchConfiguration"].allowSave;
63
+ if (routeData.searchConfiguration) {
64
+ if (Object.prototype.hasOwnProperty.call(routeData.searchConfiguration, 'allowSave')) {
65
+ this.allowSaveOption = routeData.searchConfiguration.allowSave;
86
66
  }
87
- this.searchConfiguration = routeData["searchConfiguration"];
67
+ this.searchConfiguration = routeData.searchConfiguration;
88
68
  }
89
- if (routeData["tableConfiguration"]) {
90
- this.tableConfiguration = routeData["tableConfiguration"];
69
+ if (routeData.tableConfiguration) {
70
+ this.tableConfiguration = routeData.tableConfiguration;
91
71
  }
92
- if (routeData["description"]) {
93
- this.description = this._translateService.instant(routeData["description"]);
72
+ if (routeData.description) {
73
+ this.description = this._translateService.instant(routeData.description);
94
74
  }
95
- if (routeData["longDescription"]) {
96
- this.longDescription = this._translateService.instant(routeData["longDescription"]);
75
+ if (routeData.longDescription) {
76
+ this.longDescription = this._translateService.instant(routeData.longDescription);
97
77
  }
98
- if (routeData["category"]) {
99
- this.category = this._translateService.instant(routeData["category"]);
78
+ if (routeData.category) {
79
+ this.category = this._translateService.instant(routeData.category);
100
80
  }
101
81
  if (Object.prototype.hasOwnProperty.call(routeData, 'readonly')) {
102
- this.readonly = routeData["readonly"];
82
+ this.readonly = routeData.readonly;
103
83
  }
104
- /** @type {?} */
84
+ // clone default configuration
105
85
  const defaultConfiguration = AdvancedTableConfiguration.cast(this.tableConfiguration, true);
106
- /** @type {?} */
86
+ // correct edit button link
107
87
  const column = defaultConfiguration.columns.find(col => {
108
88
  return col.formatter === 'ButtonFormatter' && col.formatString === '(modal:edit)';
109
89
  });
110
90
  if (column) {
111
- /** @type {?} */
112
91
  const url = [];
113
92
  this._activatedRoute.snapshot.pathFromRoot.forEach(route => {
114
93
  url.push.apply(url, route.url);
115
94
  });
116
95
  column.formatString = `#/${url.join('/')}/(modal:\$\{id\}/edit)`;
117
96
  }
118
- /** @type {?} */
97
+ // create list configuration by assigning list entity set
119
98
  const setConfig = Object.assign({
120
99
  model: entitySet.Name
121
100
  }, defaultConfiguration);
@@ -128,14 +107,14 @@ export class AdvancedListComponent {
128
107
  // do reload by using hidden fragment e.g. /classes#reload
129
108
  this.reloadSubscription = this._activatedRoute.fragment.subscribe(fragment => {
130
109
  if (fragment && fragment === 'reload') {
131
- this._toastService.show(/** @type {?} */ (this.description), this._translateService.instant('Settings.OperationCompleted'));
110
+ this._toastService.show(this.description, this._translateService.instant('Settings.OperationCompleted'));
132
111
  table.fetch(true);
133
112
  }
134
113
  });
135
114
  // finally add user activity
136
115
  this._userActivityService.setItem({
137
- category: /** @type {?} */ (this.category),
138
- description: /** @type {?} */ (this.description),
116
+ category: this.category,
117
+ description: this.description,
139
118
  url: window.location.hash.substring(1),
140
119
  dateCreated: new Date
141
120
  });
@@ -149,21 +128,18 @@ export class AdvancedListComponent {
149
128
  }
150
129
  /**
151
130
  * Data load event handler of advanced table component
152
- * @param {?} data
153
- * @return {?}
131
+ * @param data
154
132
  */
155
133
  onDataLoad(data) {
156
134
  this.recordsTotal = data.recordsTotal;
157
135
  }
158
136
  /**
159
137
  * Remove selected items
160
- * @return {?}
161
138
  */
162
139
  remove() {
163
- /** @type {?} */
164
140
  const table = this.table;
165
141
  if (table && table.selected && table.selected.length) {
166
- /** @type {?} */
142
+ // get items to remove
167
143
  const items = table.selected;
168
144
  return this._modalService.showWarningDialog(this._translateService.instant('Tables.RemoveItemsTitle'), this._translateService.instant('Tables.RemoveItemsMessage'), DIALOG_BUTTONS.OkCancel).then(result => {
169
145
  if (result === 'ok') {
@@ -180,15 +156,7 @@ export class AdvancedListComponent {
180
156
  });
181
157
  }
182
158
  }
183
- }
184
- AdvancedListComponent.decorators = [
185
- { type: Component, args: [{
186
- // tslint:disable-next-line:component-selector
187
- selector: 'app-advanced-list',
188
- template: "<div>\n <div class=\"row\" *ngIf=\"description\">\n <div class=\"col-auto\">\n <h2>{{description}}</h2>\n <ng-container *ngIf=\"longDescription\">\n <p [innerHTML]=\"longDescription\"></p>\n </ng-container>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"searchConfiguration\">\n <div class=\"col-12\" [ngVar]=\"{}\" #filter=\"ngVar\">\n <app-advanced-table-search #advancedSearch [(filter)]=\"filter.value\" [collapsed]=\"true\" [table]=\"table\" [allowSave]=\"allowSaveOption\">\n <advanced-search>\n <app-advanced-search-form [form]=\"searchConfiguration\" (filterChange)=\"advancedSearch.asyncAdvancedSearch()\" #search [(filter)]=\"filter.value\"></app-advanced-search-form>\n </advanced-search>\n </app-advanced-table-search>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-auto mt-4\">\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal > 1\">\n <span>{{recordsTotal}}</span><span>&nbsp;</span><span [translate]=\"'Tables.Items'\"></span>\n </div>\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal === 1\">\n <span>{{recordsTotal}}</span><span>&nbsp;</span><span [translate]=\"'Tables.Item'\"></span>\n </div>\n </div>\n <div class=\"pull-right ml-auto mr-3 mt-3\">\n <div class=\"font-lg btn-toolbar mt-3\">\n <a *ngIf=\"readonly === false && table.selected && table.selected.length\"\n class=\"text-danger text-decoration-none mr-2\" href=\"javascript:void(0)\" (click)=\"remove()\">\n <span>-</span><span>&nbsp;</span><span [translate]=\"'Tables.RemoveItem'\"></span>\n </a>\n <a *ngIf=\"readonly === false\" class=\"text-indigo text-decoration-none\" [routerLink]=\"['.', { outlets:{ modal:'add'} }]\">\n <span>+</span><span>&nbsp;</span><span [translate]=\"'Tables.AddItem'\"></span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-12 mb-4\">\n <app-advanced-table [selectable]=\"true\" #table\n [showFooter]=\"false\"\n (load)=\"onDataLoad($event)\" [height]=\"600\"></app-advanced-table>\n </div>\n </div>\n <router-modal></router-modal>\n</div>\n"
189
- }] }
190
- ];
191
- /** @nocollapse */
159
+ };
192
160
  AdvancedListComponent.ctorParameters = () => [
193
161
  { type: AngularDataContext },
194
162
  { type: TranslateService },
@@ -198,60 +166,39 @@ AdvancedListComponent.ctorParameters = () => [
198
166
  { type: ModalService },
199
167
  { type: UserActivityService }
200
168
  ];
201
- AdvancedListComponent.propDecorators = {
202
- entitySet: [{ type: Input, args: ['entitySet',] }],
203
- category: [{ type: Input, args: ['category',] }],
204
- description: [{ type: Input, args: ['description',] }],
205
- longDescription: [{ type: Input, args: ['longDescription',] }],
206
- tableConfiguration: [{ type: Input, args: ['tableConfiguration',] }],
207
- searchConfiguration: [{ type: Input, args: ['searchConfiguration',] }],
208
- table: [{ type: ViewChild, args: ['table',] }],
209
- allowSaveOption: [{ type: Input, args: ['allowSaveOption',] }],
210
- readonly: [{ type: Input, args: ['readonly',] }]
211
- };
212
- if (false) {
213
- /** @type {?} */
214
- AdvancedListComponent.prototype.recordsTotal;
215
- /** @type {?} */
216
- AdvancedListComponent.prototype.config;
217
- /** @type {?} */
218
- AdvancedListComponent.prototype.subscription;
219
- /** @type {?} */
220
- AdvancedListComponent.prototype.dataSubscription;
221
- /** @type {?} */
222
- AdvancedListComponent.prototype.reloadSubscription;
223
- /** @type {?} */
224
- AdvancedListComponent.prototype.entitySet;
225
- /** @type {?} */
226
- AdvancedListComponent.prototype.category;
227
- /** @type {?} */
228
- AdvancedListComponent.prototype.description;
229
- /** @type {?} */
230
- AdvancedListComponent.prototype.longDescription;
231
- /** @type {?} */
232
- AdvancedListComponent.prototype.tableConfiguration;
233
- /** @type {?} */
234
- AdvancedListComponent.prototype.searchConfiguration;
235
- /** @type {?} */
236
- AdvancedListComponent.prototype.table;
237
- /** @type {?} */
238
- AdvancedListComponent.prototype.allowSaveOption;
239
- /** @type {?} */
240
- AdvancedListComponent.prototype.readonly;
241
- /** @type {?} */
242
- AdvancedListComponent.prototype._context;
243
- /** @type {?} */
244
- AdvancedListComponent.prototype._translateService;
245
- /** @type {?} */
246
- AdvancedListComponent.prototype._activatedRoute;
247
- /** @type {?} */
248
- AdvancedListComponent.prototype._errorService;
249
- /** @type {?} */
250
- AdvancedListComponent.prototype._toastService;
251
- /** @type {?} */
252
- AdvancedListComponent.prototype._modalService;
253
- /** @type {?} */
254
- AdvancedListComponent.prototype._userActivityService;
255
- }
256
-
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdW5pdmVyc2lzL25neC10YWJsZXMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hZHZhbmNlZC1saXN0L2FkdmFuY2VkLWxpc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsS0FBSyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsT0FBTyxFQUFFLHNCQUFzQixFQUEyQiwwQkFBMEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pJLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFPakQsTUFBTTs7Ozs7Ozs7OztJQWlCSixZQUFvQixRQUE0QixFQUN0QyxtQkFDQSxpQkFDQSxlQUNBLGVBQ0EsZUFDQTtRQU5VLGFBQVEsR0FBUixRQUFRLENBQW9CO1FBQ3RDLHNCQUFpQixHQUFqQixpQkFBaUI7UUFDakIsb0JBQWUsR0FBZixlQUFlO1FBQ2Ysa0JBQWEsR0FBYixhQUFhO1FBQ2Isa0JBQWEsR0FBYixhQUFhO1FBQ2Isa0JBQWEsR0FBYixhQUFhO1FBQ2IseUJBQW9CLEdBQXBCLG9CQUFvQjs0QkFyQkEsR0FBRzsrQkFZVyxJQUFJO3dCQUNULEtBQUs7S0FTckM7Ozs7SUFDUCxXQUFXO1FBQ1QsSUFBSSxJ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U0FBQzs7Z0JBRVQsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsK3JFQUE2QzthQUM5Qzs7OztZQWZRLGtCQUFrQjtZQUNsQixnQkFBZ0I7WUFFaEIsY0FBYztZQUdkLFlBQVk7WUFHWixZQUFZO1lBSGtCLFlBQVk7WUFBRSxtQkFBbUI7Ozt3QkFpQnJFLEtBQUssU0FBQyxXQUFXO3VCQUNqQixLQUFLLFNBQUMsVUFBVTswQkFDaEIsS0FBSyxTQUFDLGFBQWE7OEJBQ25CLEtBQUssU0FBQyxpQkFBaUI7aUNBQ3ZCLEtBQUssU0FBQyxvQkFBb0I7a0NBQzFCLEtBQUssU0FBQyxxQkFBcUI7b0JBQzNCLFNBQVMsU0FBQyxPQUFPOzhCQUNqQixLQUFLLFNBQUMsaUJBQWlCO3VCQUN2QixLQUFLLFNBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgSW5wdXQsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZ3VsYXJEYXRhQ29udGV4dCB9IGZyb20gJ0B0aGVtb3N0L2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuaW1wb3J0IHsgQWR2YW5jZWRUYWJsZUNvbXBvbmVudCwgQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQsIEFkdmFuY2VkVGFibGVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVycm9yU2VydmljZSwgRElBTE9HX0JVVFRPTlMsIE1vZGFsU2VydmljZSwgVXNlckFjdGl2aXR5U2VydmljZSB9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcbmltcG9ydCB7IFJlc3BvbnNlRXJyb3IgfSBmcm9tICdAdGhlbW9zdC9jbGllbnQnO1xuaW1wb3J0IHsgVGFibGVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnYXBwLWFkdmFuY2VkLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBwdWJsaWMgcmVjb3Jkc1RvdGFsOiBudW1iZXIgPSBOYU47XG4gIHB1YmxpYyBjb25maWc/OiBUYWJsZUNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRhdGFTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVsb2FkU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBASW5wdXQoJ2VudGl0eVNldCcpIGVudGl0eVNldD86IHN0cmluZztcbiAgQElucHV0KCdjYXRlZ29yeScpIGNhdGVnb3J5Pzogc3RyaW5nO1xuICBASW5wdXQoJ2Rlc2NyaXB0aW9uJykgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgnbG9uZ0Rlc2NyaXB0aW9uJykgbG9uZ0Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoJ3RhYmxlQ29uZmlndXJhdGlvbicpIHRhYmxlQ29uZmlndXJhdGlvbjogYW55O1xuICBASW5wdXQoJ3NlYXJjaENvbmZpZ3VyYXRpb24nKSBzZWFyY2hDb25maWd1cmF0aW9uOiBhbnk7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJykgdGFibGU/OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50O1xuICBASW5wdXQoJ2FsbG93U2F2ZU9wdGlvbicpIGFsbG93U2F2ZU9wdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgncmVhZG9ubHknKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbnRleHQ6IEFuZ3VsYXJEYXRhQ29udGV4dCxcbiAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9lcnJvclNlcnZpY2U6IEVycm9yU2VydmljZSxcbiAgICBwcml2YXRlIF90b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIF9tb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIF91c2VyQWN0aXZpdHlTZXJ2aWNlOiBVc2VyQWN0aXZpdHlTZXJ2aWNlXG4gICAgKSB7IH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMudGFibGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGU7XG4gICAgICAvLyBnZXQgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5fY29udGV4dC5nZXRNZXRhZGF0YSgpO1xuICAgICAgLy8gZ2V0IHJvdXRlIGRhdGFcbiAgICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMuX2FjdGl2YXRlZFJvdXRlLmRhdGEuc3Vic2NyaWJlKCByb3V0ZURhdGEgPT4ge1xuICAgICAgICAvLyBnZXQgZW50aXR5VHlwZVxuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF4ke3JvdXRlRGF0YS5tb2RlbH0kYCwgJ2lnJyk7XG4gICAgICAgIGNvbnN0IGVudGl0eVNldCA9IG1ldGFkYXRhLkVudGl0eUNvbnRhaW5lci5FbnRpdHlTZXQuZmluZCggeCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlLnRlc3QoeC5OYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIGVudGl0eSB0eXBlIGlzIG51bGxcbiAgICAgICAgaWYgKGVudGl0eVNldCA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gbmF2aWdhdGUgdG8gZXJyb3JcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3JTZXJ2aWNlLm5hdmlnYXRlVG9FcnJvcihuZXcgUmVzcG9uc2VFcnJvcignRW50aXR5U2V0IE5vdCBGb3VuZCcsIDQwNCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBlbnRpdHkgdHlwZVxuICAgICAgICBjb25zdCBlbnRpdHlUeXBlID0gbWV0YWRhdGEuRW50aXR5VHlwZS5maW5kKCB4ID0+IHtcbiAgICAgICAgICByZXR1cm4geC5OYW1lID09PSBlbnRpdHlTZXQuRW50aXR5VHlwZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3JTZXJ2aWNlLm5hdmlnYXRlVG9FcnJvcihuZXcgUmVzcG9uc2VFcnJvcignRW50aXR5VHlwZSBOb3QgRm91bmQnLCA0MDQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLnNlYXJjaENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJvdXRlRGF0YS5zZWFyY2hDb25maWd1cmF0aW9uLCAnYWxsb3dTYXZlJykpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dTYXZlT3B0aW9uID0gcm91dGVEYXRhLnNlYXJjaENvbmZpZ3VyYXRpb24uYWxsb3dTYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNlYXJjaENvbmZpZ3VyYXRpb24gPSByb3V0ZURhdGEuc2VhcmNoQ29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLnRhYmxlQ29uZmlndXJhdGlvbikge1xuICAgICAgICAgIHRoaXMudGFibGVDb25maWd1cmF0aW9uID0gcm91dGVEYXRhLnRhYmxlQ29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChyb3V0ZURhdGEuZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZURhdGEubG9uZ0Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5sb25nRGVzY3JpcHRpb24gPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQocm91dGVEYXRhLmxvbmdEZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlRGF0YS5jYXRlZ29yeSkge1xuICAgICAgICAgIHRoaXMuY2F0ZWdvcnkgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQocm91dGVEYXRhLmNhdGVnb3J5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJvdXRlRGF0YSwgJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICB0aGlzLnJlYWRvbmx5ID0gcm91dGVEYXRhLnJlYWRvbmx5O1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsb25lIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgICAgICBjb25zdCBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IEFkdmFuY2VkVGFibGVDb25maWd1cmF0aW9uLmNhc3QodGhpcy50YWJsZUNvbmZpZ3VyYXRpb24sIHRydWUpO1xuICAgICAgICAvLyBjb3JyZWN0IGVkaXQgYnV0dG9uIGxpbmtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZGVmYXVsdENvbmZpZ3VyYXRpb24uY29sdW1ucy5maW5kKCBjb2wgPT4ge1xuICAgICAgICAgIHJldHVybiBjb2wuZm9ybWF0dGVyID09PSAnQnV0dG9uRm9ybWF0dGVyJyAmJiBjb2wuZm9ybWF0U3RyaW5nID09PSAnKG1vZGFsOmVkaXQpJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICBjb25zdCB1cmw6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXRoRnJvbVJvb3QuZm9yRWFjaCggcm91dGUgPT4ge1xuICAgICAgICAgICAgdXJsLnB1c2guYXBwbHkodXJsLCByb3V0ZS51cmwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbHVtbi5mb3JtYXRTdHJpbmcgPSBgIy8ke3VybC5qb2luKCcvJyl9Lyhtb2RhbDpcXCRcXHtpZFxcfS9lZGl0KWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY3JlYXRlIGxpc3QgY29uZmlndXJhdGlvbiBieSBhc3NpZ25pbmcgbGlzdCBlbnRpdHkgc2V0XG4gICAgICAgIGNvbnN0IHNldENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIG1vZGVsOiBlbnRpdHlTZXQuTmFtZVxuICAgICAgICB9LCBkZWZhdWx0Q29uZmlndXJhdGlvbik7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0Q29uZmlnLCAnc2VsZWN0YWJsZScpKSB7XG4gICAgICAgICAgc2V0Q29uZmlnLnNlbGVjdGFibGUgPSAhdGhpcy5yZWFkb25seTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZS5jb25maWcgPSBzZXRDb25maWc7XG4gICAgICAgIC8vIGZldGNoIGRhdGFcbiAgICAgICAgdGFibGUuZmV0Y2godHJ1ZSk7XG4gICAgICAgIC8vIGRvIHJlbG9hZCBieSB1c2luZyBoaWRkZW4gZnJhZ21lbnQgZS5nLiAvY2xhc3NlcyNyZWxvYWRcbiAgICAgICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoZnJhZ21lbnQgPT4ge1xuICAgICAgICAgIGlmIChmcmFnbWVudCAmJiBmcmFnbWVudCA9PT0gJ3JlbG9hZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvYXN0U2VydmljZS5zaG93KFxuICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdTZXR0aW5ncy5PcGVyYXRpb25Db21wbGV0ZWQnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRhYmxlLmZldGNoKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpbmFsbHkgYWRkIHVzZXIgYWN0aXZpdHlcbiAgICAgICAgdGhpcy5fdXNlckFjdGl2aXR5U2VydmljZS5zZXRJdGVtKHtcbiAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGRhdGVDcmVhdGVkOiBuZXcgRGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yU2VydmljZS5zaG93RXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBEYXRhIGxvYWQgZXZlbnQgaGFuZGxlciBvZiBhZHZhbmNlZCB0YWJsZSBjb21wb25lbnRcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIG9uRGF0YUxvYWQoZGF0YTogQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQpIHtcbiAgICB0aGlzLnJlY29yZHNUb3RhbCA9IGRhdGEucmVjb3Jkc1RvdGFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBzZWxlY3RlZCBpdGVtc1xuICAgKi9cbiAgcmVtb3ZlKCkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZTtcbiAgICBpZiAodGFibGUgJiYgdGFibGUuc2VsZWN0ZWQgJiYgdGFibGUuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgaXRlbXMgdG8gcmVtb3ZlXG4gICAgICBjb25zdCBpdGVtcyA9IHRhYmxlLnNlbGVjdGVkO1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGFsU2VydmljZS5zaG93V2FybmluZ0RpYWxvZyhcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuUmVtb3ZlSXRlbXNUaXRsZScpLFxuICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5SZW1vdmVJdGVtc01lc3NhZ2UnKSxcbiAgICAgICAgRElBTE9HX0JVVFRPTlMuT2tDYW5jZWwpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAnb2snKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0Lm1vZGVsKHRhYmxlLmNvbmZpZy5tb2RlbCkucmVtb3ZlKGl0ZW1zKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiArICc6JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlJlbW92ZUl0ZW1NZXNzYWdlLnRpdGxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KChpdGVtcy5sZW5ndGggPT09IDEgP1xuICAgICAgICAgICAgICAgICAgJ1RhYmxlcy5SZW1vdmVJdGVtTWVzc2FnZS5vbmUnIDogJ1RhYmxlcy5SZW1vdmVJdGVtTWVzc2FnZS5tYW55JylcbiAgICAgICAgICAgICAgICAgICwgeyB2YWx1ZTogaXRlbXMubGVuZ3RoIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRhYmxlLmZldGNoKHRydWUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIsIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZUxpbms6ICcuJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
169
+ __decorate([
170
+ Input('entitySet')
171
+ ], AdvancedListComponent.prototype, "entitySet", void 0);
172
+ __decorate([
173
+ Input('category')
174
+ ], AdvancedListComponent.prototype, "category", void 0);
175
+ __decorate([
176
+ Input('description')
177
+ ], AdvancedListComponent.prototype, "description", void 0);
178
+ __decorate([
179
+ Input('longDescription')
180
+ ], AdvancedListComponent.prototype, "longDescription", void 0);
181
+ __decorate([
182
+ Input('tableConfiguration')
183
+ ], AdvancedListComponent.prototype, "tableConfiguration", void 0);
184
+ __decorate([
185
+ Input('searchConfiguration')
186
+ ], AdvancedListComponent.prototype, "searchConfiguration", void 0);
187
+ __decorate([
188
+ ViewChild('table')
189
+ ], AdvancedListComponent.prototype, "table", void 0);
190
+ __decorate([
191
+ Input('allowSaveOption')
192
+ ], AdvancedListComponent.prototype, "allowSaveOption", void 0);
193
+ __decorate([
194
+ Input('readonly')
195
+ ], AdvancedListComponent.prototype, "readonly", void 0);
196
+ AdvancedListComponent = __decorate([
197
+ Component({
198
+ // tslint:disable-next-line:component-selector
199
+ selector: 'app-advanced-list',
200
+ template: "<div>\n <div class=\"row\" *ngIf=\"description\">\n <div class=\"col-auto\">\n <h2>{{description}}</h2>\n <ng-container *ngIf=\"longDescription\">\n <p [innerHTML]=\"longDescription\"></p>\n </ng-container>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"searchConfiguration\">\n <div class=\"col-12\" [ngVar]=\"{}\" #filter=\"ngVar\">\n <app-advanced-table-search #advancedSearch [(filter)]=\"filter.value\" [collapsed]=\"true\" [table]=\"table\" [allowSave]=\"allowSaveOption\">\n <advanced-search>\n <app-advanced-search-form [form]=\"searchConfiguration\" (filterChange)=\"advancedSearch.asyncAdvancedSearch()\" #search [(filter)]=\"filter.value\"></app-advanced-search-form>\n </advanced-search>\n </app-advanced-table-search>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-auto mt-4\">\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal > 1\">\n <span>{{recordsTotal}}</span><span>&nbsp;</span><span [translate]=\"'Tables.Items'\"></span>\n </div>\n <div class=\"font-xl text-secondary\" *ngIf=\"recordsTotal === 1\">\n <span>{{recordsTotal}}</span><span>&nbsp;</span><span [translate]=\"'Tables.Item'\"></span>\n </div>\n </div>\n <div class=\"pull-right ml-auto mr-3 mt-3\">\n <div class=\"font-lg btn-toolbar mt-3\">\n <a *ngIf=\"readonly === false && table.selected && table.selected.length\"\n class=\"text-danger text-decoration-none mr-2\" href=\"javascript:void(0)\" (click)=\"remove()\">\n <span>-</span><span>&nbsp;</span><span [translate]=\"'Tables.RemoveItem'\"></span>\n </a>\n <a *ngIf=\"readonly === false\" class=\"text-indigo text-decoration-none\" [routerLink]=\"['.', { outlets:{ modal:'add'} }]\">\n <span>+</span><span>&nbsp;</span><span [translate]=\"'Tables.AddItem'\"></span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-12 mb-4\">\n <app-advanced-table [selectable]=\"true\" #table\n [showFooter]=\"false\"\n (load)=\"onDataLoad($event)\" [height]=\"600\"></app-advanced-table>\n </div>\n </div>\n <router-modal></router-modal>\n</div>\n"
201
+ })
202
+ ], AdvancedListComponent);
203
+ export { AdvancedListComponent };
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdW5pdmVyc2lzL25neC10YWJsZXMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hZHZhbmNlZC1saXN0L2FkdmFuY2VkLWxpc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBYSxLQUFLLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCw0Q0FBNEM7QUFDNUMsT0FBTyxFQUFtRCwwQkFBMEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pJLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFPakQsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFpQmhDLFlBQW9CLFFBQTRCLEVBQ3RDLGlCQUFtQyxFQUNuQyxlQUErQixFQUMvQixhQUEyQixFQUMzQixhQUEyQixFQUMzQixhQUEyQixFQUMzQixvQkFBeUM7UUFOL0IsYUFBUSxHQUFSLFFBQVEsQ0FBb0I7UUFDdEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNuQyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0Isa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWM7UUFD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QyxVQUFVLENBQUM7dURBQTJCO0FBZmxDLHFCQUFxQjtJQUxqQyxTQUFTLENBQUM7UUFDVCw4Q0FBOEM7UUFDOUMsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QiwrckVBQTZDO0tBQzlDLENBQUM7R0FDVyxxQkFBcUIsQ0EyS2pDO1NBM0tZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgSW5wdXQsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZ3VsYXJEYXRhQ29udGV4dCB9IGZyb20gJ0B0aGVtb3N0L2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuaW1wb3J0IHsgQWR2YW5jZWRUYWJsZUNvbXBvbmVudCwgQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQsIEFkdmFuY2VkVGFibGVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVycm9yU2VydmljZSwgRElBTE9HX0JVVFRPTlMsIE1vZGFsU2VydmljZSwgVXNlckFjdGl2aXR5U2VydmljZSB9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcbmltcG9ydCB7IFJlc3BvbnNlRXJyb3IgfSBmcm9tICdAdGhlbW9zdC9jbGllbnQnO1xuaW1wb3J0IHsgVGFibGVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnYXBwLWFkdmFuY2VkLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBwdWJsaWMgcmVjb3Jkc1RvdGFsOiBudW1iZXIgPSBOYU47XG4gIHB1YmxpYyBjb25maWc/OiBUYWJsZUNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRhdGFTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVsb2FkU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBASW5wdXQoJ2VudGl0eVNldCcpIGVudGl0eVNldD86IHN0cmluZztcbiAgQElucHV0KCdjYXRlZ29yeScpIGNhdGVnb3J5Pzogc3RyaW5nO1xuICBASW5wdXQoJ2Rlc2NyaXB0aW9uJykgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgnbG9uZ0Rlc2NyaXB0aW9uJykgbG9uZ0Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoJ3RhYmxlQ29uZmlndXJhdGlvbicpIHRhYmxlQ29uZmlndXJhdGlvbjogYW55O1xuICBASW5wdXQoJ3NlYXJjaENvbmZpZ3VyYXRpb24nKSBzZWFyY2hDb25maWd1cmF0aW9uOiBhbnk7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJykgdGFibGU/OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50O1xuICBASW5wdXQoJ2FsbG93U2F2ZU9wdGlvbicpIGFsbG93U2F2ZU9wdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgncmVhZG9ubHknKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbnRleHQ6IEFuZ3VsYXJEYXRhQ29udGV4dCxcbiAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2FjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9lcnJvclNlcnZpY2U6IEVycm9yU2VydmljZSxcbiAgICBwcml2YXRlIF90b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIF9tb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIF91c2VyQWN0aXZpdHlTZXJ2aWNlOiBVc2VyQWN0aXZpdHlTZXJ2aWNlXG4gICAgKSB7IH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMudGFibGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGU7XG4gICAgICAvLyBnZXQgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5fY29udGV4dC5nZXRNZXRhZGF0YSgpO1xuICAgICAgLy8gZ2V0IHJvdXRlIGRhdGFcbiAgICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMuX2FjdGl2YXRlZFJvdXRlLmRhdGEuc3Vic2NyaWJlKCByb3V0ZURhdGEgPT4ge1xuICAgICAgICAvLyBnZXQgZW50aXR5VHlwZVxuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF4ke3JvdXRlRGF0YS5tb2RlbH0kYCwgJ2lnJyk7XG4gICAgICAgIGNvbnN0IGVudGl0eVNldCA9IG1ldGFkYXRhLkVudGl0eUNvbnRhaW5lci5FbnRpdHlTZXQuZmluZCggeCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlLnRlc3QoeC5OYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIGVudGl0eSB0eXBlIGlzIG51bGxcbiAgICAgICAgaWYgKGVudGl0eVNldCA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gbmF2aWdhdGUgdG8gZXJyb3JcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3JTZXJ2aWNlLm5hdmlnYXRlVG9FcnJvcihuZXcgUmVzcG9uc2VFcnJvcignRW50aXR5U2V0IE5vdCBGb3VuZCcsIDQwNCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBlbnRpdHkgdHlwZVxuICAgICAgICBjb25zdCBlbnRpdHlUeXBlID0gbWV0YWRhdGEuRW50aXR5VHlwZS5maW5kKCB4ID0+IHtcbiAgICAgICAgICByZXR1cm4geC5OYW1lID09PSBlbnRpdHlTZXQuRW50aXR5VHlwZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3JTZXJ2aWNlLm5hdmlnYXRlVG9FcnJvcihuZXcgUmVzcG9uc2VFcnJvcignRW50aXR5VHlwZSBOb3QgRm91bmQnLCA0MDQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLnNlYXJjaENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJvdXRlRGF0YS5zZWFyY2hDb25maWd1cmF0aW9uLCAnYWxsb3dTYXZlJykpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dTYXZlT3B0aW9uID0gcm91dGVEYXRhLnNlYXJjaENvbmZpZ3VyYXRpb24uYWxsb3dTYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNlYXJjaENvbmZpZ3VyYXRpb24gPSByb3V0ZURhdGEuc2VhcmNoQ29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLnRhYmxlQ29uZmlndXJhdGlvbikge1xuICAgICAgICAgIHRoaXMudGFibGVDb25maWd1cmF0aW9uID0gcm91dGVEYXRhLnRhYmxlQ29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVEYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChyb3V0ZURhdGEuZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZURhdGEubG9uZ0Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5sb25nRGVzY3JpcHRpb24gPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQocm91dGVEYXRhLmxvbmdEZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlRGF0YS5jYXRlZ29yeSkge1xuICAgICAgICAgIHRoaXMuY2F0ZWdvcnkgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQocm91dGVEYXRhLmNhdGVnb3J5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJvdXRlRGF0YSwgJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICB0aGlzLnJlYWRvbmx5ID0gcm91dGVEYXRhLnJlYWRvbmx5O1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsb25lIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgICAgICBjb25zdCBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IEFkdmFuY2VkVGFibGVDb25maWd1cmF0aW9uLmNhc3QodGhpcy50YWJsZUNvbmZpZ3VyYXRpb24sIHRydWUpO1xuICAgICAgICAvLyBjb3JyZWN0IGVkaXQgYnV0dG9uIGxpbmtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZGVmYXVsdENvbmZpZ3VyYXRpb24uY29sdW1ucy5maW5kKCBjb2wgPT4ge1xuICAgICAgICAgIHJldHVybiBjb2wuZm9ybWF0dGVyID09PSAnQnV0dG9uRm9ybWF0dGVyJyAmJiBjb2wuZm9ybWF0U3RyaW5nID09PSAnKG1vZGFsOmVkaXQpJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICBjb25zdCB1cmw6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXRoRnJvbVJvb3QuZm9yRWFjaCggcm91dGUgPT4ge1xuICAgICAgICAgICAgdXJsLnB1c2guYXBwbHkodXJsLCByb3V0ZS51cmwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbHVtbi5mb3JtYXRTdHJpbmcgPSBgIy8ke3VybC5qb2luKCcvJyl9Lyhtb2RhbDpcXCRcXHtpZFxcfS9lZGl0KWA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY3JlYXRlIGxpc3QgY29uZmlndXJhdGlvbiBieSBhc3NpZ25pbmcgbGlzdCBlbnRpdHkgc2V0XG4gICAgICAgIGNvbnN0IHNldENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgIG1vZGVsOiBlbnRpdHlTZXQuTmFtZVxuICAgICAgICB9LCBkZWZhdWx0Q29uZmlndXJhdGlvbik7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0Q29uZmlnLCAnc2VsZWN0YWJsZScpKSB7XG4gICAgICAgICAgc2V0Q29uZmlnLnNlbGVjdGFibGUgPSAhdGhpcy5yZWFkb25seTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZS5jb25maWcgPSBzZXRDb25maWc7XG4gICAgICAgIC8vIGZldGNoIGRhdGFcbiAgICAgICAgdGFibGUuZmV0Y2godHJ1ZSk7XG4gICAgICAgIC8vIGRvIHJlbG9hZCBieSB1c2luZyBoaWRkZW4gZnJhZ21lbnQgZS5nLiAvY2xhc3NlcyNyZWxvYWRcbiAgICAgICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoZnJhZ21lbnQgPT4ge1xuICAgICAgICAgIGlmIChmcmFnbWVudCAmJiBmcmFnbWVudCA9PT0gJ3JlbG9hZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3RvYXN0U2VydmljZS5zaG93KFxuICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdTZXR0aW5ncy5PcGVyYXRpb25Db21wbGV0ZWQnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRhYmxlLmZldGNoKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpbmFsbHkgYWRkIHVzZXIgYWN0aXZpdHlcbiAgICAgICAgdGhpcy5fdXNlckFjdGl2aXR5U2VydmljZS5zZXRJdGVtKHtcbiAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGRhdGVDcmVhdGVkOiBuZXcgRGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yU2VydmljZS5zaG93RXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBEYXRhIGxvYWQgZXZlbnQgaGFuZGxlciBvZiBhZHZhbmNlZCB0YWJsZSBjb21wb25lbnRcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIG9uRGF0YUxvYWQoZGF0YTogQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQpIHtcbiAgICB0aGlzLnJlY29yZHNUb3RhbCA9IGRhdGEucmVjb3Jkc1RvdGFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBzZWxlY3RlZCBpdGVtc1xuICAgKi9cbiAgcmVtb3ZlKCkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZTtcbiAgICBpZiAodGFibGUgJiYgdGFibGUuc2VsZWN0ZWQgJiYgdGFibGUuc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgaXRlbXMgdG8gcmVtb3ZlXG4gICAgICBjb25zdCBpdGVtcyA9IHRhYmxlLnNlbGVjdGVkO1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGFsU2VydmljZS5zaG93V2FybmluZ0RpYWxvZyhcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuUmVtb3ZlSXRlbXNUaXRsZScpLFxuICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5SZW1vdmVJdGVtc01lc3NhZ2UnKSxcbiAgICAgICAgRElBTE9HX0JVVFRPTlMuT2tDYW5jZWwpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAnb2snKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0Lm1vZGVsKHRhYmxlLmNvbmZpZy5tb2RlbCkucmVtb3ZlKGl0ZW1zKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiArICc6JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlJlbW92ZUl0ZW1NZXNzYWdlLnRpdGxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KChpdGVtcy5sZW5ndGggPT09IDEgP1xuICAgICAgICAgICAgICAgICAgJ1RhYmxlcy5SZW1vdmVJdGVtTWVzc2FnZS5vbmUnIDogJ1RhYmxlcy5SZW1vdmVJdGVtTWVzc2FnZS5tYW55JylcbiAgICAgICAgICAgICAgICAgICwgeyB2YWx1ZTogaXRlbXMubGVuZ3RoIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRhYmxlLmZldGNoKHRydWUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIsIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZUxpbms6ICcuJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=