@rosoftlab/ionic 1.0.0-alpha-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +27 -0
  2. package/esm2022/lib/components/index.mjs +4 -0
  3. package/esm2022/lib/components/rsl-ionic-crud.component/rsl-ionic-crud.component.mjs +266 -0
  4. package/esm2022/lib/components/rsl-ionic-data-table/rsl-ionic-data-table.component.mjs +292 -0
  5. package/esm2022/lib/components/rsl-ionic-grid/rsl-ionic-grid.component.mjs +269 -0
  6. package/esm2022/lib/decorators/index.mjs +3 -0
  7. package/esm2022/lib/decorators/ionic-datatable-layout.mjs +10 -0
  8. package/esm2022/lib/decorators/ionic-list.decorator.mjs +9 -0
  9. package/esm2022/lib/interfaces/index.mjs +2 -0
  10. package/esm2022/lib/interfaces/ionic-list-layout-config.mjs +2 -0
  11. package/esm2022/lib/ionic-dialog.service.mjs +51 -0
  12. package/esm2022/lib/rsl-ionic-module.module.mjs +86 -0
  13. package/esm2022/lib/translate.extension.mjs +48 -0
  14. package/esm2022/lib/types/index.mjs +2 -0
  15. package/esm2022/lib/types/repeat/repeat-section.type.mjs +135 -0
  16. package/esm2022/lib/validators/index.mjs +2 -0
  17. package/esm2022/lib/validators/must-match.mjs +12 -0
  18. package/esm2022/lib/wrappers/accordion-wrapper.component.mjs +50 -0
  19. package/esm2022/lib/wrappers/index.mjs +3 -0
  20. package/esm2022/lib/wrappers/panel-wrapper.component.mjs +37 -0
  21. package/esm2022/lib/wrappers/wrappers.module.mjs +56 -0
  22. package/esm2022/public-api.mjs +12 -0
  23. package/esm2022/rosoftlab-ionic.mjs +5 -0
  24. package/fesm2022/rosoftlab-ionic.mjs +1251 -0
  25. package/fesm2022/rosoftlab-ionic.mjs.map +1 -0
  26. package/index.d.ts +5 -0
  27. package/lib/components/index.d.ts +3 -0
  28. package/lib/components/rsl-ionic-crud.component/rsl-ionic-crud.component.d.ts +69 -0
  29. package/lib/components/rsl-ionic-data-table/rsl-ionic-data-table.component.d.ts +66 -0
  30. package/lib/components/rsl-ionic-grid/rsl-ionic-grid.component.d.ts +58 -0
  31. package/lib/decorators/index.d.ts +2 -0
  32. package/lib/decorators/ionic-datatable-layout.d.ts +7 -0
  33. package/lib/decorators/ionic-list.decorator.d.ts +2 -0
  34. package/lib/interfaces/index.d.ts +1 -0
  35. package/lib/interfaces/ionic-list-layout-config.d.ts +8 -0
  36. package/lib/ionic-dialog.service.d.ts +10 -0
  37. package/lib/rsl-ionic-module.module.d.ts +13 -0
  38. package/lib/translate.extension.d.ts +17 -0
  39. package/lib/types/index.d.ts +1 -0
  40. package/lib/types/repeat/repeat-section.type.d.ts +51 -0
  41. package/lib/validators/index.d.ts +1 -0
  42. package/lib/validators/must-match.d.ts +6 -0
  43. package/lib/wrappers/accordion-wrapper.component.d.ts +6 -0
  44. package/lib/wrappers/index.d.ts +2 -0
  45. package/lib/wrappers/panel-wrapper.component.d.ts +6 -0
  46. package/lib/wrappers/wrappers.module.d.ts +13 -0
  47. package/package.json +31 -0
  48. package/public-api.d.ts +8 -0
@@ -0,0 +1,292 @@
1
+ import { Location } from '@angular/common';
2
+ import { Component, ElementRef, Injector, Input, TemplateRef, ViewChild } from '@angular/core';
3
+ import { ActivatedRoute, NavigationStart, Router, UrlSegment } from '@angular/router';
4
+ import { NavController } from '@ionic/angular';
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import { ColumnMode, SelectionType } from '@swimlane/ngx-datatable';
7
+ import * as jsonLogic from 'json-logic-js/logic.js';
8
+ import { IonicDialogService } from '../../ionic-dialog.service';
9
+ import { RslIonicModuleModule } from '../../rsl-ionic-module.module';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/router";
12
+ import * as i2 from "@ngx-translate/core";
13
+ import * as i3 from "@angular/common";
14
+ import * as i4 from "@ionic/angular";
15
+ import * as i5 from "../../ionic-dialog.service";
16
+ import * as i6 from "@swimlane/ngx-datatable";
17
+ export class RslIonicDataTableComponent {
18
+ constructor(router, route, translate, location, injector, navCtrl, dialogService, el) {
19
+ this.router = router;
20
+ this.route = route;
21
+ this.translate = translate;
22
+ this.location = location;
23
+ this.injector = injector;
24
+ this.navCtrl = navCtrl;
25
+ this.dialogService = dialogService;
26
+ this.el = el;
27
+ this.data = [];
28
+ this.pageIndex = 1;
29
+ this.pageSize = 30;
30
+ this.columns = [];
31
+ this.allColumns = [];
32
+ this.ColumnMode = ColumnMode;
33
+ this.SelectionType = SelectionType;
34
+ this.headerHeight = 50;
35
+ this.rowHeight = 50;
36
+ }
37
+ ngOnInit() {
38
+ this.setValueFromSnapshot(this, this.route.snapshot, 'showSerach', false);
39
+ this.setValueFromSnapshot(this, this.route.snapshot, 'searchFields', null);
40
+ this.setValueFromSnapshot(this, this.route.snapshot, 'customInclude', null);
41
+ this.setValueFromSnapshot(this, this.route.snapshot, 'defaultSort', null);
42
+ this.setValueFromSnapshot(this, this.route.snapshot, 'defaultSortDirection', '');
43
+ this.setValueFromSnapshot(this, this.route.snapshot, 'deletePropertyName', 'name');
44
+ this.setValueFromSnapshot(this, this.route.snapshot, 'defaultFilter', null);
45
+ this.setValueFromSnapshot(this, this.route.snapshot, 'showHeader', true);
46
+ this.setValueFromSnapshot(this, this.route.snapshot, 'deleteDisableRule', null);
47
+ this.setValueFromSnapshot(this, this.route.snapshot, 'hasAdd', true);
48
+ this.setValueFromSnapshot(this, this.route.snapshot, 'canDelete', true);
49
+ this.setValueFromSnapshot(this, this.route.snapshot, 'canEdit', true);
50
+ if (!this.modelService) {
51
+ const SERVICE_TOKEN = this.route.snapshot.data['requiredService'];
52
+ this.modelService = this.injector.get(SERVICE_TOKEN);
53
+ }
54
+ this.model = this.modelService.newModel();
55
+ this.title = this.model.modelConfig.formTitle;
56
+ this.getListLayout();
57
+ const currentUrlSegments = this.router.url.split('/').map(segment => new UrlSegment(segment, {}));
58
+ this.basePath = currentUrlSegments.map(segment => segment.path).join('/');
59
+ this.router.events.subscribe(event => {
60
+ if (event instanceof NavigationStart) {
61
+ // Navigation to another page is about to occur
62
+ this.data = [];
63
+ this.pageIndex = 1;
64
+ // Perform actions or update component as needed
65
+ }
66
+ });
67
+ // this.isLoading = true;
68
+ // this.onScroll(0);
69
+ }
70
+ setValueFromSnapshot(component, snapshot, key, defaultValue) {
71
+ if (component[key] === undefined) {
72
+ let dataFromSnapshot = snapshot.data[key];
73
+ if (dataFromSnapshot === null || dataFromSnapshot === undefined) {
74
+ dataFromSnapshot = snapshot.params[key];
75
+ }
76
+ component[key] = dataFromSnapshot !== undefined ? dataFromSnapshot : defaultValue;
77
+ }
78
+ }
79
+ onScroll(offsetY) {
80
+ if (offsetY) {
81
+ if (this.oldOffsetY !== offsetY) {
82
+ this.oldOffsetY = offsetY;
83
+ const viewHeight = this.el.nativeElement.getBoundingClientRect().height - this.headerHeight;
84
+ if (!this.isLoading && offsetY + viewHeight >= this.data.length * this.rowHeight) {
85
+ // total number of results to load
86
+ let limit = this.pageSize;
87
+ // check if we haven't fetched any results yet
88
+ if (this.data.length === 0) {
89
+ // calculate the number of rows that fit within viewport
90
+ const pageSize = Math.ceil(viewHeight / this.rowHeight);
91
+ // change the limit to pageSize such that we fill the first page entirely
92
+ // (otherwise, we won't be able to scroll past it)
93
+ limit = Math.max(pageSize, this.pageSize);
94
+ }
95
+ // this.pageIndex
96
+ this.pageSize = limit;
97
+ this.loadData();
98
+ // this.loadPage(limit);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ async ionViewWillEnter() {
104
+ this.data = [];
105
+ this.loadData();
106
+ }
107
+ async handleChange(event) {
108
+ this.filterValue = event.target.value.toLowerCase();
109
+ this.data = [];
110
+ this.pageIndex = 1;
111
+ this.loadData();
112
+ }
113
+ loadData(event = null) {
114
+ const filters = [];
115
+ let sorts = '';
116
+ this.isLoading = true;
117
+ if (this.defaultSort) {
118
+ if (this.defaultSortDirection === 'desc') {
119
+ sorts = '-' + this.defaultSort;
120
+ }
121
+ else {
122
+ sorts = this.defaultSort;
123
+ }
124
+ }
125
+ if (this.showSerach) {
126
+ if (this.filterValue) {
127
+ const y = '(' + this.searchFields.replace(',', '|') + ')';
128
+ filters.push(y + '@=*' + this.filterValue);
129
+ }
130
+ }
131
+ if (this.defaultFilter) {
132
+ filters.push(this.defaultFilter);
133
+ }
134
+ setTimeout(() => {
135
+ const filtersValue = filters.join(', ');
136
+ this.modelService.getAll(this.pageIndex, this.pageSize, sorts, filtersValue, this.customInclude).subscribe((response) => {
137
+ if (this.pageIndex !== response.getMeta().meta.count) {
138
+ this.pageIndex++;
139
+ }
140
+ else {
141
+ if (event)
142
+ event.target.disabled = true;
143
+ }
144
+ // if (this.filterValue)
145
+ // this.data = response.getModels();
146
+ // else
147
+ const rows = [...this.data, ...response.getModels()];
148
+ this.data = rows;
149
+ // this.data = this.data.concat();
150
+ if (event)
151
+ event.target.complete();
152
+ this.isLoading = false;
153
+ });
154
+ }, 700);
155
+ }
156
+ async handleRefresh(event) {
157
+ this.pageIndex = 1;
158
+ this.data = [];
159
+ this.loadData();
160
+ event.target.complete();
161
+ }
162
+ onAdd() {
163
+ console.log(this.basePath);
164
+ this.router.navigate([this.basePath + '/add']);
165
+ // this.navCtrl.navigateForward(this.basePath + '/add');
166
+ }
167
+ editModel(model) {
168
+ if (this.canEdit)
169
+ this.router.navigate([this.basePath + '/edit/', model.id]);
170
+ // this.navCtrl.navigateForward(this.basePath + '/edit/' + model.id);
171
+ }
172
+ getListLayout() {
173
+ if (!this.model) {
174
+ this.model = this.modelService.newModel();
175
+ }
176
+ this.allColumns = [];
177
+ this.columns = [];
178
+ this.allColumns = Reflect.getMetadata('IonicDataTableLayout', this.model).map((item) => {
179
+ if (!item.isTranslated) {
180
+ item.name = this.translate.instant(item.name);
181
+ item.isTranslated = true;
182
+ }
183
+ return item;
184
+ });
185
+ this.allColumns.sort((a, b) => a.order - b.order);
186
+ if (this.canDelete || this.canEdit) {
187
+ this.allColumns.push({
188
+ cellTemplate: this.actionsTmpl,
189
+ name: '',
190
+ cellClass: 'actions-cell',
191
+ draggable: false,
192
+ sortable: false,
193
+ visible: true
194
+ // width: 100,
195
+ // maxWidth: 100,
196
+ // minWidth: 100
197
+ });
198
+ }
199
+ this.columns = this.allColumns.filter((item) => item.visible);
200
+ // Sort the columns array by the order property
201
+ }
202
+ deleteModel(model) {
203
+ const msg = 'Do you want to delete ' + model[this.deletePropertyName] + '?';
204
+ this.dialogService.confirm(msg).then((value) => {
205
+ if (value.data) {
206
+ this.modelService.delete(model.id).subscribe(() => {
207
+ const tempData = [];
208
+ // this.selectedObject.emit(null);
209
+ this.data.map((item) => {
210
+ if (item.id !== model.id) {
211
+ tempData.push(item);
212
+ }
213
+ });
214
+ this.data = tempData;
215
+ });
216
+ }
217
+ });
218
+ }
219
+ deleteEnabled(model) {
220
+ if (this.canDelete) {
221
+ if (this.deleteDisableRule) {
222
+ return this.evaluateRule(this.deleteDisableRule, model);
223
+ }
224
+ else {
225
+ return true;
226
+ }
227
+ }
228
+ else {
229
+ return false;
230
+ }
231
+ }
232
+ evaluateRule(rules, model) {
233
+ let result = true;
234
+ rules.forEach(rule => {
235
+ let jsonRule;
236
+ if (typeof rule.rule === 'string') {
237
+ jsonRule = JSON.parse(rule.rule);
238
+ }
239
+ else {
240
+ jsonRule = rule.rule;
241
+ }
242
+ if (rule.parameters) {
243
+ const data = '{' + rule.parameters.map((item) => {
244
+ return '"' + item + '":"' + model[item] + '"';
245
+ }).join(',') + '}';
246
+ result = jsonLogic.apply(jsonRule, JSON.parse(data));
247
+ }
248
+ else {
249
+ result = jsonLogic.apply(jsonRule);
250
+ }
251
+ });
252
+ return result;
253
+ }
254
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: RslIonicDataTableComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.Location }, { token: i0.Injector }, { token: i4.NavController }, { token: i5.IonicDialogService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
255
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: RslIonicDataTableComponent, isStandalone: true, selector: "app-rsl-ionic-data-table", inputs: { showSerach: "showSerach", searchFields: "searchFields", customInclude: "customInclude", defaultSort: "defaultSort", defaultSortDirection: "defaultSortDirection", deletePropertyName: "deletePropertyName", defaultFilter: "defaultFilter", showHeader: "showHeader", deleteDisableRule: "deleteDisableRule", hasAdd: "hasAdd", canDelete: "canDelete", canEdit: "canEdit", model: "model", modelService: "modelService" }, viewQueries: [{ propertyName: "actionsTmpl", first: true, predicate: ["actionsTmpl"], descendants: true, static: true }], ngImport: i0, template: "<ion-header *ngIf=\"showHeader\">\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-menu-button></ion-menu-button>\n <ion-back-button></ion-back-button>\n </ion-buttons>\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\n </ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"search\"></ng-container>\n</ion-header>\n\n<ion-content [fullscreen]=\"true\">\n\n <ion-refresher slot=\"fixed\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <ngx-datatable class=\"material fullscreen rls-server-scrolling\" style=\"top: 115px\" [rows]=\"data\" [columns]=\"columns\"\n [columnMode]=\"ColumnMode.standard\" [headerHeight]=\"headerHeight\" [rowHeight]=\"rowHeight\" [scrollbarV]=\"true\"\n [loadingIndicator]=\"isLoading\" [scrollbarH]=\"true\" (scroll)=\"onScroll($event.offsetY)\"\n >\n </ngx-datatable>\n \n <ng-template #actionsTmpl let-row=\"row\" let-value=\"value\">\n <ion-button fill=\"clear\" *ngIf=\"canEdit\" (click)='editModel(row)'>\n <ion-icon slot=\"icon-only\" name=\"create\" (click)='editModel(row)'></ion-icon>\n </ion-button>\n <ion-button fill=\"clear\" *ngIf=\"deleteEnabled(row)\" (click)='deleteModel(row)'>\n <ion-icon color=\"danger\" slot=\"icon-only\" name=\"trash\" (click)='deleteModel(row)'></ion-icon>\n </ion-button>\n </ng-template>\n\n</ion-content>\n\n<ng-template #header>\n <ion-title class=\"ion-text-center\">{{title}}</ion-title>\n <ion-button slot=\"end\" (click)=\"onAdd()\" fill=\"clear\" *ngIf=\"hasAdd\">\n <ion-icon size=\"large\" name=\"add\"></ion-icon>\n </ion-button>\n</ng-template>\n\n<ng-template #search>\n <ion-toolbar *ngIf=\"showSerach\">\n <ion-searchbar [debounce]=\"1000\" (ionChange)=\"handleChange($event)\"></ion-searchbar>\n </ion-toolbar>\n</ng-template>", styles: [".rls-server-scrolling{height:calc(100vh - 110px)}::ng-deep .progress-linear{position:fixed!important;bottom:0}::ng-deep .actions-cell{padding:5px 0 0 .9rem!important}::ng-deep .align-right{text-align:right!important}\n"], dependencies: [{ kind: "ngmodule", type: RslIonicModuleModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.IonBackButton, selector: "ion-back-button", inputs: ["color", "defaultHref", "disabled", "icon", "mode", "routerAnimation", "text", "type"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonMenuButton, selector: "ion-menu-button", inputs: ["autoHide", "color", "disabled", "menu", "mode", "type"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "mode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i4.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i4.IonBackButtonDelegate, selector: "ion-back-button", inputs: ["defaultHref", "routerAnimation"] }, { kind: "component", type: i6.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }] }); }
256
+ }
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: RslIonicDataTableComponent, decorators: [{
258
+ type: Component,
259
+ args: [{ standalone: true, selector: 'app-rsl-ionic-data-table', imports: [RslIonicModuleModule], template: "<ion-header *ngIf=\"showHeader\">\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-menu-button></ion-menu-button>\n <ion-back-button></ion-back-button>\n </ion-buttons>\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\n </ion-toolbar>\n <ng-container [ngTemplateOutlet]=\"search\"></ng-container>\n</ion-header>\n\n<ion-content [fullscreen]=\"true\">\n\n <ion-refresher slot=\"fixed\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <ngx-datatable class=\"material fullscreen rls-server-scrolling\" style=\"top: 115px\" [rows]=\"data\" [columns]=\"columns\"\n [columnMode]=\"ColumnMode.standard\" [headerHeight]=\"headerHeight\" [rowHeight]=\"rowHeight\" [scrollbarV]=\"true\"\n [loadingIndicator]=\"isLoading\" [scrollbarH]=\"true\" (scroll)=\"onScroll($event.offsetY)\"\n >\n </ngx-datatable>\n \n <ng-template #actionsTmpl let-row=\"row\" let-value=\"value\">\n <ion-button fill=\"clear\" *ngIf=\"canEdit\" (click)='editModel(row)'>\n <ion-icon slot=\"icon-only\" name=\"create\" (click)='editModel(row)'></ion-icon>\n </ion-button>\n <ion-button fill=\"clear\" *ngIf=\"deleteEnabled(row)\" (click)='deleteModel(row)'>\n <ion-icon color=\"danger\" slot=\"icon-only\" name=\"trash\" (click)='deleteModel(row)'></ion-icon>\n </ion-button>\n </ng-template>\n\n</ion-content>\n\n<ng-template #header>\n <ion-title class=\"ion-text-center\">{{title}}</ion-title>\n <ion-button slot=\"end\" (click)=\"onAdd()\" fill=\"clear\" *ngIf=\"hasAdd\">\n <ion-icon size=\"large\" name=\"add\"></ion-icon>\n </ion-button>\n</ng-template>\n\n<ng-template #search>\n <ion-toolbar *ngIf=\"showSerach\">\n <ion-searchbar [debounce]=\"1000\" (ionChange)=\"handleChange($event)\"></ion-searchbar>\n </ion-toolbar>\n</ng-template>", styles: [".rls-server-scrolling{height:calc(100vh - 110px)}::ng-deep .progress-linear{position:fixed!important;bottom:0}::ng-deep .actions-cell{padding:5px 0 0 .9rem!important}::ng-deep .align-right{text-align:right!important}\n"] }]
260
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.Location }, { type: i0.Injector }, { type: i4.NavController }, { type: i5.IonicDialogService }, { type: i0.ElementRef }]; }, propDecorators: { actionsTmpl: [{
261
+ type: ViewChild,
262
+ args: ['actionsTmpl', { static: true }]
263
+ }], showSerach: [{
264
+ type: Input
265
+ }], searchFields: [{
266
+ type: Input
267
+ }], customInclude: [{
268
+ type: Input
269
+ }], defaultSort: [{
270
+ type: Input
271
+ }], defaultSortDirection: [{
272
+ type: Input
273
+ }], deletePropertyName: [{
274
+ type: Input
275
+ }], defaultFilter: [{
276
+ type: Input
277
+ }], showHeader: [{
278
+ type: Input
279
+ }], deleteDisableRule: [{
280
+ type: Input
281
+ }], hasAdd: [{
282
+ type: Input
283
+ }], canDelete: [{
284
+ type: Input
285
+ }], canEdit: [{
286
+ type: Input
287
+ }], model: [{
288
+ type: Input
289
+ }], modelService: [{
290
+ type: Input
291
+ }] } });
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNsLWlvbmljLWRhdGEtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcm9zb2Z0bGFiL2lvbmljL3NyYy9saWIvY29tcG9uZW50cy9yc2wtaW9uaWMtZGF0YS10YWJsZS9yc2wtaW9uaWMtZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvaW9uaWMvc3JjL2xpYi9jb21wb25lbnRzL3JzbC1pb25pYy1kYXRhLXRhYmxlL3JzbC1pb25pYy1kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLGNBQWMsRUFBMEIsZUFBZSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEtBQUssU0FBUyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7OztBQVNyRSxNQUFNLE9BQU8sMEJBQTBCO0lBbUNyQyxZQUNTLE1BQWMsRUFDZCxLQUFxQixFQUNyQixTQUEyQixF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S0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIE5hdmlnYXRpb25TdGFydCwgUm91dGVyLCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCYXNlUXVlcnlEYXRhLCBCYXNlU2VydmljZSwgUnVsZSB9IGZyb20gJ0Byb3NvZnRsYWIvY29yZSc7XG5pbXBvcnQgeyBCYXNlTW9kZWxGb3JtbHkgfSBmcm9tICdAcm9zb2Z0bGFiL2Zvcm1seSc7XG5pbXBvcnQgeyBDb2x1bW5Nb2RlLCBTZWxlY3Rpb25UeXBlIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xuaW1wb3J0ICogYXMganNvbkxvZ2ljIGZyb20gJ2pzb24tbG9naWMtanMvbG9naWMuanMnO1xuaW1wb3J0IHsgSW9uaWNEYXRhVGFibGVMYXlvdXRDb25maWcgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lvbmljLWRhdGF0YWJsZS1sYXlvdXQnO1xuaW1wb3J0IHsgSW9uaWNEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW9uaWMtZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnNsSW9uaWNNb2R1bGVNb2R1bGUgfSBmcm9tICcuLi8uLi9yc2wtaW9uaWMtbW9kdWxlLm1vZHVsZSc7XG5leHBvcnQgZGVjbGFyZSB0eXBlIFNvcnREaXJlY3Rpb24gPSAnYXNjJyB8ICdkZXNjJyB8ICcnO1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYXBwLXJzbC1pb25pYy1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JzbC1pb25pYy1kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcnNsLWlvbmljLWRhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW1JzbElvbmljTW9kdWxlTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgUnNsSW9uaWNEYXRhVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIEJhc2VNb2RlbEZvcm1seSwgVSBleHRlbmRzIEJhc2VTZXJ2aWNlPFQ+PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2FjdGlvbnNUbXBsJywgeyBzdGF0aWM6IHRydWUgfSkgYWN0aW9uc1RtcGw6IFRlbXBsYXRlUmVmPGFueT47XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93U2VyYWNoOiBib29sZWFuO1xuICBASW5wdXQoKSBzZWFyY2hGaWVsZHM6IHN0cmluZztcbiAgQElucHV0KCkgY3VzdG9tSW5jbHVkZTogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0U29ydDogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0U29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbjtcbiAgQElucHV0KCkgZGVsZXRlUHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlZmF1bHRGaWx0ZXI6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVsZXRlRGlzYWJsZVJ1bGU6IFJ1bGVbXTtcbiAgQElucHV0KCkgaGFzQWRkOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5EZWxldGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkVkaXQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgbW9kZWw6IFQ7XG4gIEBJbnB1dCgpIG1vZGVsU2VydmljZTogVVxuXG4gIGRhdGE6IGFueVtdID0gW107XG4gIHBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgcGFnZVNpemU6IG51bWJlciA9IDMwXG5cbiAgYmFzZVBhdGg6IHN0cmluZztcblxuICBjb2x1bW5zID0gW107XG4gIGFsbENvbHVtbnMgPSBbXTtcbiAgQ29sdW1uTW9kZSA9IENvbHVtbk1vZGU7XG4gIFNlbGVjdGlvblR5cGUgPSBTZWxlY3Rpb25UeXBlO1xuXG4gIHJlYWRvbmx5IGhlYWRlckhlaWdodCA9IDUwO1xuICByZWFkb25seSByb3dIZWlnaHQgPSA1MDtcbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xuICBvbGRPZmZzZXRZOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIG5hdkN0cmw6IE5hdkNvbnRyb2xsZXIsXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IElvbmljRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7XG5cbiAgfVxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldFZhbHVlRnJvbVNuYXBzaG90KHRoaXMsIHRoaXMucm91dGUuc25hcHNob3QsICdzaG93U2VyYWNoJywgZmFsc2UpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ3NlYXJjaEZpZWxkcycsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2N1c3RvbUluY2x1ZGUnLCBudWxsKTtcbiAgICB0aGlzLnNldFZhbHVlRnJvbVNuYXBzaG90KHRoaXMsIHRoaXMucm91dGUuc25hcHNob3QsICdkZWZhdWx0U29ydCcsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2RlZmF1bHRTb3J0RGlyZWN0aW9uJywgJycpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2RlbGV0ZVByb3BlcnR5TmFtZScsICduYW1lJyk7XG4gICAgdGhpcy5zZXRWYWx1ZUZyb21TbmFwc2hvdCh0aGlzLCB0aGlzLnJvdXRlLnNuYXBzaG90LCAnZGVmYXVsdEZpbHRlcicsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ3Nob3dIZWFkZXInLCB0cnVlKTtcbiAgICB0aGlzLnNldFZhbHVlRnJvbVNuYXBzaG90KHRoaXMsIHRoaXMucm91dGUuc25hcHNob3QsICdkZWxldGVEaXNhYmxlUnVsZScsIG51bGwpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2hhc0FkZCcsIHRydWUpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2NhbkRlbGV0ZScsIHRydWUpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tU25hcHNob3QodGhpcywgdGhpcy5yb3V0ZS5zbmFwc2hvdCwgJ2NhbkVkaXQnLCB0cnVlKTtcbiAgICBpZiAoIXRoaXMubW9kZWxTZXJ2aWNlKSB7XG4gICAgICBjb25zdCBTRVJWSUNFX1RPS0VOID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhWydyZXF1aXJlZFNlcnZpY2UnXTtcbiAgICAgIHRoaXMubW9kZWxTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8VT4oPGFueT5TRVJWSUNFX1RPS0VOKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbCA9IHRoaXMubW9kZWxTZXJ2aWNlLm5ld01vZGVsKClcbiAgICB0aGlzLnRpdGxlID0gdGhpcy5tb2RlbC5tb2RlbENvbmZpZy5mb3JtVGl0bGVcbiAgICB0aGlzLmdldExpc3RMYXlvdXQoKVxuXG4gICAgY29uc3QgY3VycmVudFVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10gPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJy8nKS5tYXAoc2VnbWVudCA9PiBuZXcgVXJsU2VnbWVudChzZWdtZW50LCB7fSkpO1xuICAgIHRoaXMuYmFzZVBhdGggPSBjdXJyZW50VXJsU2VnbWVudHMubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5wYXRoKS5qb2luKCcvJyk7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgICAgICAgLy8gTmF2aWdhdGlvbiB0byBhbm90aGVyIHBhZ2UgaXMgYWJvdXQgdG8gb2NjdXJcbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIHRoaXMucGFnZUluZGV4ID0gMVxuICAgICAgICAvLyBQZXJmb3JtIGFjdGlvbnMgb3IgdXBkYXRlIGNvbXBvbmVudCBhcyBuZWVkZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgLy8gdGhpcy5vblNjcm9sbCgwKTtcbiAgfVxuICBzZXRWYWx1ZUZyb21TbmFwc2hvdDxUPihjb21wb25lbnQ6IGFueSwgc25hcHNob3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAoY29tcG9uZW50W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGRhdGFGcm9tU25hcHNob3QgPSBzbmFwc2hvdC5kYXRhW2tleV07XG4gICAgICBpZiAoZGF0YUZyb21TbmFwc2hvdCA9PT0gbnVsbCB8fCBkYXRhRnJvbVNuYXBzaG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGF0YUZyb21TbmFwc2hvdCA9IHNuYXBzaG90LnBhcmFtc1trZXldO1xuICAgICAgfVxuICAgICAgY29tcG9uZW50W2tleV0gPSBkYXRhRnJvbVNuYXBzaG90ICE9PSB1bmRlZmluZWQgPyBkYXRhRnJvbVNuYXBzaG90IDogZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuICBvblNjcm9sbChvZmZzZXRZOiBudW1iZXIpIHtcbiAgICBpZiAob2Zmc2V0WSkge1xuICAgICAgaWYgKHRoaXMub2xkT2Zmc2V0WSAhPT0gb2Zmc2V0WSkge1xuICAgICAgICB0aGlzLm9sZE9mZnNldFkgPSBvZmZzZXRZO1xuICAgICAgICBjb25zdCB2aWV3SGVpZ2h0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIHRoaXMuaGVhZGVySGVpZ2h0O1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nICYmIG9mZnNldFkgKyB2aWV3SGVpZ2h0ID49IHRoaXMuZGF0YS5sZW5ndGggKiB0aGlzLnJvd0hlaWdodCkge1xuICAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZXN1bHRzIHRvIGxvYWRcbiAgICAgICAgICBsZXQgbGltaXQgPSB0aGlzLnBhZ2VTaXplO1xuXG4gICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZW4ndCBmZXRjaGVkIGFueSByZXN1bHRzIHlldFxuICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiByb3dzIHRoYXQgZml0IHdpdGhpbiB2aWV3cG9ydFxuICAgICAgICAgICAgY29uc3QgcGFnZVNpemUgPSBNYXRoLmNlaWwodmlld0hlaWdodCAvIHRoaXMucm93SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBsaW1pdCB0byBwYWdlU2l6ZSBzdWNoIHRoYXQgd2UgZmlsbCB0aGUgZmlyc3QgcGFnZSBlbnRpcmVseVxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSwgd2Ugd29uJ3QgYmUgYWJsZSB0byBzY3JvbGwgcGFzdCBpdClcbiAgICAgICAgICAgIGxpbWl0ID0gTWF0aC5tYXgocGFnZVNpemUsIHRoaXMucGFnZVNpemUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzLnBhZ2VJbmRleFxuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBsaW1pdFxuICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICAgICAgICAvLyB0aGlzLmxvYWRQYWdlKGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhc3luYyBpb25WaWV3V2lsbEVudGVyKCkge1xuICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgfVxuICBhc3luYyBoYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlclZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5kYXRhID0gW107XG4gICAgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG4gIGxvYWREYXRhKGV2ZW50ID0gbnVsbCkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSBbXTtcbiAgICBsZXQgc29ydHMgPSAnJztcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFNvcnQpIHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRTb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgICAgc29ydHMgPSAnLScgKyB0aGlzLmRlZmF1bHRTb3J0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc29ydHMgPSB0aGlzLmRlZmF1bHRTb3J0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zaG93U2VyYWNoKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJWYWx1ZSkge1xuICAgICAgICBjb25zdCB5ID0gJygnICsgdGhpcy5zZWFyY2hGaWVsZHMucmVwbGFjZSgnLCcsICd8JykgKyAnKSc7XG4gICAgICAgIGZpbHRlcnMucHVzaCh5ICsgJ0A9KicgKyB0aGlzLmZpbHRlclZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGVmYXVsdEZpbHRlcikge1xuICAgICAgZmlsdGVycy5wdXNoKHRoaXMuZGVmYXVsdEZpbHRlcilcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJzVmFsdWUgPSBmaWx0ZXJzLmpvaW4oJywgJyk7XG4gICAgICB0aGlzLm1vZGVsU2VydmljZS5nZXRBbGwodGhpcy5wYWdlSW5kZXgsIHRoaXMucGFnZVNpemUsIHNvcnRzLCBmaWx0ZXJzVmFsdWUsIHRoaXMuY3VzdG9tSW5jbHVkZSkuc3Vic2NyaWJlKFxuICAgICAgICAocmVzcG9uc2U6IEJhc2VRdWVyeURhdGE8VD4pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5wYWdlSW5kZXggIT09IHJlc3BvbnNlLmdldE1ldGEoKS5tZXRhLmNvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCsrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChldmVudCkgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgKHRoaXMuZmlsdGVyVmFsdWUpXG4gICAgICAgICAgLy8gICB0aGlzLmRhdGEgPSByZXNwb25zZS5nZXRNb2RlbHMoKTtcbiAgICAgICAgICAvLyBlbHNlXG4gICAgICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLmRhdGEsIC4uLnJlc3BvbnNlLmdldE1vZGVscygpXTtcbiAgICAgICAgICB0aGlzLmRhdGEgPSByb3dzO1xuICAgICAgICAgIC8vIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoKTtcblxuICAgICAgICAgIGlmIChldmVudCkgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICB9LCA3MDApO1xuICB9XG4gIGFzeW5jIGhhbmRsZVJlZnJlc2goZXZlbnQpIHtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDFcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKCk7XG4gIH1cbiAgb25BZGQoKSB7XG4gICAgY29uc29sZS5sb2codGhpcy5iYXNlUGF0aClcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5iYXNlUGF0aCArICcvYWRkJ10pXG4gICAgLy8gdGhpcy5uYXZDdHJsLm5hdmlnYXRlRm9yd2FyZCh0aGlzLmJhc2VQYXRoICsgJy9hZGQnKTtcbiAgfVxuICBlZGl0TW9kZWwobW9kZWw6IEJhc2VNb2RlbEZvcm1seSkge1xuICAgIGlmICh0aGlzLmNhbkVkaXQpXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5iYXNlUGF0aCArICcvZWRpdC8nLCBtb2RlbC5pZF0pO1xuICAgIC8vIHRoaXMubmF2Q3RybC5uYXZpZ2F0ZUZvcndhcmQodGhpcy5iYXNlUGF0aCArICcvZWRpdC8nICsgbW9kZWwuaWQpO1xuICB9XG4gIGdldExpc3RMYXlvdXQoKSB7XG4gICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICB0aGlzLm1vZGVsID0gdGhpcy5tb2RlbFNlcnZpY2UubmV3TW9kZWwoKTsgICAgXG4gICAgfVxuICAgIHRoaXMuYWxsQ29sdW1ucz1bXTtcbiAgICB0aGlzLmNvbHVtbnM9W107XG4gICAgdGhpcy5hbGxDb2x1bW5zID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgnSW9uaWNEYXRhVGFibGVMYXlvdXQnLCB0aGlzLm1vZGVsKS5tYXAoKGl0ZW06IElvbmljRGF0YVRhYmxlTGF5b3V0Q29uZmlnKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0uaXNUcmFuc2xhdGVkKSB7XG4gICAgICAgIGl0ZW0ubmFtZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoaXRlbS5uYW1lKTtcbiAgICAgICAgaXRlbS5pc1RyYW5zbGF0ZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWxsQ29sdW1ucy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG5cbiAgICBpZiAodGhpcy5jYW5EZWxldGUgfHwgdGhpcy5jYW5FZGl0KSB7XG4gICAgICB0aGlzLmFsbENvbHVtbnMucHVzaCh7XG4gICAgICAgIGNlbGxUZW1wbGF0ZTogdGhpcy5hY3Rpb25zVG1wbCxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIGNlbGxDbGFzczogJ2FjdGlvbnMtY2VsbCcsXG4gICAgICAgIGRyYWdnYWJsZTogZmFsc2UsXG4gICAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgICAvLyB3aWR0aDogMTAwLFxuICAgICAgICAvLyBtYXhXaWR0aDogMTAwLFxuICAgICAgICAvLyBtaW5XaWR0aDogMTAwXG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmFsbENvbHVtbnMuZmlsdGVyKChpdGVtOiBJb25pY0RhdGFUYWJsZUxheW91dENvbmZpZykgPT4gaXRlbS52aXNpYmxlKTtcbiAgICAvLyBTb3J0IHRoZSBjb2x1bW5zIGFycmF5IGJ5IHRoZSBvcmRlciBwcm9wZXJ0eVxuXG4gIH1cbiAgZGVsZXRlTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCBtc2cgPSAnRG8geW91IHdhbnQgdG8gZGVsZXRlICcgKyBtb2RlbFt0aGlzLmRlbGV0ZVByb3BlcnR5TmFtZV0gKyAnPyc7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm0obXNnKS50aGVuKFxuICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmRhdGEpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsU2VydmljZS5kZWxldGUobW9kZWwuaWQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wRGF0YSA9IFtdO1xuICAgICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZE9iamVjdC5lbWl0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS5pZCAhPT0gbW9kZWwuaWQpIHtcbiAgICAgICAgICAgICAgICB0ZW1wRGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRlbXBEYXRhO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgZGVsZXRlRW5hYmxlZChtb2RlbDogVCkge1xuICAgIGlmICh0aGlzLmNhbkRlbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuZGVsZXRlRGlzYWJsZVJ1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVSdWxlKHRoaXMuZGVsZXRlRGlzYWJsZVJ1bGUsIG1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZXZhbHVhdGVSdWxlKHJ1bGVzOiBSdWxlW10sIG1vZGVsOiBUKTogYm9vbGVhbiB7XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgIGxldCBqc29uUnVsZTogYW55O1xuICAgICAgaWYgKHR5cGVvZiBydWxlLnJ1bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGpzb25SdWxlID0gSlNPTi5wYXJzZShydWxlLnJ1bGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvblJ1bGUgPSBydWxlLnJ1bGU7XG4gICAgICB9XG4gICAgICBpZiAocnVsZS5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAneycgKyBydWxlLnBhcmFtZXRlcnMubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gJ1wiJyArIGl0ZW0gKyAnXCI6XCInICsgbW9kZWxbaXRlbV0gKyAnXCInO1xuICAgICAgICB9KS5qb2luKCcsJykgKyAnfSc7XG4gICAgICAgIHJlc3VsdCA9IGpzb25Mb2dpYy5hcHBseShqc29uUnVsZSwgSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBqc29uTG9naWMuYXBwbHkoanNvblJ1bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuXG59XG4iLCI8aW9uLWhlYWRlciAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgPGlvbi10b29sYmFyPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cbiAgICAgIDxpb24tbWVudS1idXR0b24+PC9pb24tbWVudS1idXR0b24+XG4gICAgICA8aW9uLWJhY2stYnV0dG9uPjwvaW9uLWJhY2stYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9pb24tdG9vbGJhcj5cbiAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWFyY2hcIj48L25nLWNvbnRhaW5lcj5cbjwvaW9uLWhlYWRlcj5cblxuPGlvbi1jb250ZW50IFtmdWxsc2NyZWVuXT1cInRydWVcIj5cblxuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiAoaW9uUmVmcmVzaCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50PjwvaW9uLXJlZnJlc2hlci1jb250ZW50PlxuICA8L2lvbi1yZWZyZXNoZXI+XG5cbiAgPG5neC1kYXRhdGFibGUgY2xhc3M9XCJtYXRlcmlhbCBmdWxsc2NyZWVuIHJscy1zZXJ2ZXItc2Nyb2xsaW5nXCIgc3R5bGU9XCJ0b3A6IDExNXB4XCIgW3Jvd3NdPVwiZGF0YVwiIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtjb2x1bW5Nb2RlXT1cIkNvbHVtbk1vZGUuc3RhbmRhcmRcIiBbaGVhZGVySGVpZ2h0XT1cImhlYWRlckhlaWdodFwiIFtyb3dIZWlnaHRdPVwicm93SGVpZ2h0XCIgW3Njcm9sbGJhclZdPVwidHJ1ZVwiXG4gICAgW2xvYWRpbmdJbmRpY2F0b3JdPVwiaXNMb2FkaW5nXCIgW3Njcm9sbGJhckhdPVwidHJ1ZVwiIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50Lm9mZnNldFkpXCJcbiAgID5cbiAgPC9uZ3gtZGF0YXRhYmxlPlxuICBcbiAgPG5nLXRlbXBsYXRlICNhY3Rpb25zVG1wbCBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgICA8aW9uLWJ1dHRvbiAgZmlsbD1cImNsZWFyXCIgKm5nSWY9XCJjYW5FZGl0XCIgKGNsaWNrKT0nZWRpdE1vZGVsKHJvdyknPlxuICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY3JlYXRlXCIgKGNsaWNrKT0nZWRpdE1vZGVsKHJvdyknPjwvaW9uLWljb24+XG4gICAgPC9pb24tYnV0dG9uPlxuICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiICpuZ0lmPVwiZGVsZXRlRW5hYmxlZChyb3cpXCIgKGNsaWNrKT0nZGVsZXRlTW9kZWwocm93KSc+XG4gICAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cInRyYXNoXCIgKGNsaWNrKT0nZGVsZXRlTW9kZWwocm93KSc+PC9pb24taWNvbj5cbiAgICA8L2lvbi1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyPlxuICA8aW9uLXRpdGxlIGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+e3t0aXRsZX19PC9pb24tdGl0bGU+XG4gIDxpb24tYnV0dG9uIHNsb3Q9XCJlbmRcIiAoY2xpY2spPVwib25BZGQoKVwiIGZpbGw9XCJjbGVhclwiICpuZ0lmPVwiaGFzQWRkXCI+XG4gICAgPGlvbi1pY29uIHNpemU9XCJsYXJnZVwiIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NlYXJjaD5cbiAgPGlvbi10b29sYmFyICpuZ0lmPVwic2hvd1NlcmFjaFwiPlxuICAgIDxpb24tc2VhcmNoYmFyIFtkZWJvdW5jZV09XCIxMDAwXCIgKGlvbkNoYW5nZSk9XCJoYW5kbGVDaGFuZ2UoJGV2ZW50KVwiPjwvaW9uLXNlYXJjaGJhcj5cbiAgPC9pb24tdG9vbGJhcj5cbjwvbmctdGVtcGxhdGU+Il19