brainloper-ui 1.2.16 → 4.0.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 (115) hide show
  1. package/{esm2022 → esm2020}/brainloper-ui.mjs +4 -4
  2. package/esm2020/public_api.mjs +51 -0
  3. package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +305 -0
  4. package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +29 -0
  5. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +23 -0
  6. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +83 -0
  7. package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +31 -0
  8. package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +159 -0
  9. package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +486 -0
  10. package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +118 -0
  11. package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +185 -0
  12. package/{esm2022 → esm2020}/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +1 -1
  13. package/{esm2022 → esm2020}/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +1 -1
  14. package/{esm2022 → esm2020}/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +1 -1
  15. package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +222 -0
  16. package/esm2020/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +80 -0
  17. package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +81 -0
  18. package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +108 -0
  19. package/{esm2022 → esm2020}/src/app/modules/interfaces/buttons/button-icon.mjs +1 -1
  20. package/{esm2022 → esm2020}/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +1 -1
  21. package/{esm2022 → esm2020}/src/app/modules/interfaces/combos/combos-configuration.mjs +1 -1
  22. package/{esm2022 → esm2020}/src/app/modules/interfaces/data-table/params.mjs +1 -1
  23. package/{esm2022 → esm2020}/src/app/modules/interfaces/data-table/rules.mjs +1 -1
  24. package/{esm2022 → esm2020}/src/app/modules/interfaces/data-table/table-columns.mjs +1 -1
  25. package/{esm2022 → esm2020}/src/app/modules/interfaces/data-table/table-configuration.mjs +1 -1
  26. package/{esm2022 → esm2020}/src/app/modules/interfaces/enum/enumActions.mjs +6 -6
  27. package/{esm2022 → esm2020}/src/app/modules/interfaces/enum/enumRules.mjs +7 -7
  28. package/{esm2022 → esm2020}/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +1 -1
  29. package/{esm2022 → esm2020}/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +1 -1
  30. package/{esm2022 → esm2020}/src/app/modules/interfaces/filters/header-filters.mjs +1 -1
  31. package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +8 -0
  32. package/{esm2022 → esm2020}/src/app/modules/interfaces/report/template-pdf-ot.mjs +1 -1
  33. package/{esm2022 → esm2020}/src/app/modules/interfaces/report/template-pfd-fo.mjs +1 -1
  34. package/esm2020/src/app/modules/services/crypto.service.mjs +37 -0
  35. package/esm2020/src/app/modules/services/export-data.service.mjs +143 -0
  36. package/{esm2022 → esm2020}/src/app/modules/services/file-forms.service.mjs +24 -24
  37. package/{esm2022 → esm2020}/src/app/modules/services/functions.service.mjs +54 -54
  38. package/esm2020/src/app/modules/services/generate-pdf.service.mjs +58 -0
  39. package/esm2020/src/app/modules/services/http.service.mjs +154 -0
  40. package/esm2020/src/app/modules/services/loading/loading.component.mjs +28 -0
  41. package/{esm2022 → esm2020}/src/app/modules/services/local-storage.service.mjs +115 -115
  42. package/esm2020/src/app/modules/services/message.service.mjs +196 -0
  43. package/{esm2022 → esm2020}/src/app/modules/services/screen-size-util.mjs +5 -5
  44. package/esm2020/src/app/modules/services/session.service.mjs +42 -0
  45. package/fesm2015/brainloper-ui.mjs +2690 -0
  46. package/fesm2015/brainloper-ui.mjs.map +1 -0
  47. package/{fesm2022 → fesm2020}/brainloper-ui.mjs +2563 -2520
  48. package/fesm2020/brainloper-ui.mjs.map +1 -0
  49. package/index.d.ts +5 -5
  50. package/package.json +25 -19
  51. package/public_api.d.ts +50 -49
  52. package/src/app/modules/brainloper-ui/brainloper-ui.module.d.ts +73 -71
  53. package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +13 -13
  54. package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +10 -10
  55. package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +24 -24
  56. package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +12 -12
  57. package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +46 -46
  58. package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +104 -104
  59. package/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.d.ts +21 -21
  60. package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +42 -42
  61. package/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.d.ts +2 -2
  62. package/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.d.ts +2 -2
  63. package/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.d.ts +2 -2
  64. package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +30 -30
  65. package/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.d.ts +35 -35
  66. package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +36 -36
  67. package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +26 -0
  68. package/src/app/modules/interfaces/buttons/button-icon.d.ts +9 -9
  69. package/src/app/modules/interfaces/buttons/button-lavel-edit.d.ts +6 -6
  70. package/src/app/modules/interfaces/combos/combos-configuration.d.ts +13 -13
  71. package/src/app/modules/interfaces/data-table/params.d.ts +7 -7
  72. package/src/app/modules/interfaces/data-table/rules.d.ts +8 -8
  73. package/src/app/modules/interfaces/data-table/table-columns.d.ts +25 -25
  74. package/src/app/modules/interfaces/data-table/table-configuration.d.ts +19 -19
  75. package/src/app/modules/interfaces/enum/enumActions.d.ts +5 -5
  76. package/src/app/modules/interfaces/enum/enumRules.d.ts +6 -6
  77. package/src/app/modules/interfaces/file-forms-service/file-forms-params.d.ts +4 -4
  78. package/src/app/modules/interfaces/file-forms-service/file-input-params.d.ts +13 -13
  79. package/src/app/modules/interfaces/filters/header-filters.d.ts +13 -13
  80. package/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.d.ts +10 -10
  81. package/src/app/modules/interfaces/report/template-pdf-ot.d.ts +19 -19
  82. package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +20 -20
  83. package/src/app/modules/services/crypto.service.d.ts +10 -10
  84. package/src/app/modules/services/export-data.service.d.ts +15 -15
  85. package/src/app/modules/services/file-forms.service.d.ts +7 -7
  86. package/src/app/modules/services/functions.service.d.ts +13 -13
  87. package/src/app/modules/services/generate-pdf.service.d.ts +12 -12
  88. package/src/app/modules/services/http.service.d.ts +21 -21
  89. package/src/app/modules/services/loading/loading.component.d.ts +15 -15
  90. package/src/app/modules/services/local-storage.service.d.ts +49 -49
  91. package/src/app/modules/services/message.service.d.ts +23 -23
  92. package/src/app/modules/services/screen-size-util.d.ts +3 -3
  93. package/src/app/modules/services/session.service.d.ts +14 -14
  94. package/esm2022/public_api.mjs +0 -50
  95. package/esm2022/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +0 -296
  96. package/esm2022/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +0 -30
  97. package/esm2022/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +0 -23
  98. package/esm2022/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +0 -83
  99. package/esm2022/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +0 -30
  100. package/esm2022/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +0 -165
  101. package/esm2022/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +0 -501
  102. package/esm2022/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +0 -122
  103. package/esm2022/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +0 -203
  104. package/esm2022/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +0 -226
  105. package/esm2022/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +0 -84
  106. package/esm2022/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +0 -85
  107. package/esm2022/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +0 -6
  108. package/esm2022/src/app/modules/services/crypto.service.mjs +0 -38
  109. package/esm2022/src/app/modules/services/export-data.service.mjs +0 -146
  110. package/esm2022/src/app/modules/services/generate-pdf.service.mjs +0 -59
  111. package/esm2022/src/app/modules/services/http.service.mjs +0 -156
  112. package/esm2022/src/app/modules/services/loading/loading.component.mjs +0 -30
  113. package/esm2022/src/app/modules/services/message.service.mjs +0 -198
  114. package/esm2022/src/app/modules/services/session.service.mjs +0 -43
  115. package/fesm2022/brainloper-ui.mjs.map +0 -1
@@ -1,501 +0,0 @@
1
- import { ScreenSizeUtil } from './../../../services/screen-size-util';
2
- import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
3
- import { TableModalComponent } from '../../../brainloper-ui/components/data-table/table-modal/table-modal.component';
4
- import { MatLegacyPaginator as MatPaginator } from '@angular/material/legacy-paginator';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/material/legacy-dialog";
7
- import * as i2 from "../../../services/http.service";
8
- import * as i3 from "../../../services/message.service";
9
- import * as i4 from "../../../services/functions.service";
10
- import * as i5 from "@angular/material/legacy-paginator";
11
- import * as i6 from "./../../../services/export-data.service";
12
- import * as i7 from "@angular/common";
13
- import * as i8 from "@angular/material/core";
14
- import * as i9 from "@angular/material/icon";
15
- import * as i10 from "@angular/material/legacy-menu";
16
- import * as i11 from "@angular/material/legacy-form-field";
17
- import * as i12 from "@angular/material/legacy-input";
18
- import * as i13 from "@angular/material/legacy-checkbox";
19
- import * as i14 from "@angular/material/legacy-tooltip";
20
- import * as i15 from "@angular/forms";
21
- import * as i16 from "../filters/filters.component";
22
- const spanishRangeLabel = (page, pageSize, length) => {
23
- if (length == 0 || pageSize == 0) {
24
- return `0 de ${length}`;
25
- }
26
- length = Math.max(length, 0);
27
- const startIndex = page * pageSize;
28
- const endIndex = startIndex < length
29
- ? Math.min(startIndex + pageSize, length)
30
- : startIndex + pageSize;
31
- return `${startIndex + 1} - ${endIndex} de ${length}`;
32
- };
33
- export class DataTableComponent {
34
- dialog;
35
- http;
36
- message;
37
- functionEter;
38
- paginatorTranslate;
39
- exportService;
40
- title;
41
- columns;
42
- data = [];
43
- combo;
44
- configuration = {
45
- add: false,
46
- edit: false,
47
- delete: false,
48
- active: false,
49
- selectable: false,
50
- print: false,
51
- addPer: false,
52
- editPer: false,
53
- primaryKey: 'id',
54
- exportXslx: false,
55
- hideTitle: true,
56
- hideFilter: true,
57
- notInitialize: false,
58
- exportXslxByRow: false,
59
- view: false,
60
- closeOrder: false,
61
- packOff: false
62
- };
63
- reloadTable;
64
- url;
65
- params;
66
- titleLoading = "";
67
- messageLoading = "";
68
- headerFileXlsm = [];
69
- clickRow = new EventEmitter();
70
- add = new EventEmitter();
71
- edit = new EventEmitter();
72
- delete = new EventEmitter();
73
- print = new EventEmitter();
74
- exportXslxByRow = new EventEmitter();
75
- active = new EventEmitter();
76
- selected = new EventEmitter();
77
- view = new EventEmitter();
78
- closeOrder = new EventEmitter();
79
- packOff = new EventEmitter();
80
- internalData = new EventEmitter();
81
- headerFilters = [];
82
- movil = ScreenSizeUtil.isMobile();
83
- filtersPost = [];
84
- paginator;
85
- selectedRows = []; /** almacena las filas seleccionadas */
86
- checkboxs = {};
87
- selectAll = false;
88
- indeterminateState = false;
89
- filters;
90
- originalData = [];
91
- paginatorActive = true;
92
- screen = true;
93
- id_compania;
94
- pageSizeOptions = [5, 10, 25, 50, 100];
95
- pageSize = screen.width > 500 ? 10 : 5;
96
- length = 0;
97
- page = 0;
98
- above = ['above'];
99
- constructor(dialog, http, message, functionEter, paginatorTranslate, exportService) {
100
- this.dialog = dialog;
101
- this.http = http;
102
- this.message = message;
103
- this.functionEter = functionEter;
104
- this.paginatorTranslate = paginatorTranslate;
105
- this.exportService = exportService;
106
- this.paginatorTranslate.itemsPerPageLabel = 'Elementos por página';
107
- this.paginatorTranslate.nextPageLabel = 'Siguiente página';
108
- this.paginatorTranslate.lastPageLabel = 'Última página';
109
- this.paginatorTranslate.previousPageLabel = 'Página anterior';
110
- this.paginatorTranslate.firstPageLabel = 'Primera página';
111
- this.paginatorTranslate.getRangeLabel = spanishRangeLabel;
112
- }
113
- buttonsConfig = [
114
- { action: 'edit', conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.edit, condition: () => this.configuration.edit, icon: 'fa-edit', tooltip: 'Editar' },
115
- { action: 'print', conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.print && this.screen, condition: () => this.configuration.print && this.screen, icon: 'fa-print', tooltip: 'Imprimir' },
116
- { action: 'delete', conditionShowHeader: () => this.selectedRows.length > 0 && this.configuration.delete, condition: () => this.configuration.delete, icon: 'fa-trash', tooltip: 'Eliminar' },
117
- { action: 'active', conditionShowHeader: () => this.selectedRows.length > 0 && this.configuration.active, condition: () => this.configuration.active, icon: 'fa-adjust', tooltip: 'Activar/Desactivar' },
118
- { action: 'add', conditionShowHeader: () => this.selectedRows.length === 0 && this.configuration.add, condition: () => false, icon: 'fa-plus-circle', tooltip: 'Nuevo' },
119
- { action: 'exportToExcel', conditionShowHeader: () => this.selectedRows.length === 0 && this.data.length > 0 && this.configuration.exportXslx, condition: () => false, icon: 'fa-download', tooltip: 'Exportar Tabla' },
120
- { action: 'exportToExcelByRow', conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.exportXslxByRow, condition: () => this.configuration.exportXslxByRow, icon: 'fa-download', tooltip: 'Exportar Registro' },
121
- { action: 'view', conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.view, condition: () => this.configuration.view, icon: 'fa-eye', tooltip: 'Ver detalle' },
122
- { action: 'closeOrder', conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.closeOrder, condition: () => this.configuration.closeOrder, icon: 'fa-check-circle', tooltip: 'Cerrar orden' },
123
- { action: 'packOff', conditionShowHeader: () => this.selectedRows.length === 1 && this.configuration.packOff, condition: () => this.configuration.packOff, icon: 'fa-cart-arrow-down', tooltip: 'Despachar recursos' }
124
- ];
125
- async ngOnInit() {
126
- if (window.screen.width > 1000) {
127
- this.screen = true;
128
- window.addEventListener("resize", () => { window.screen.width > 1000 ? this.screen = true : this.screen = false; });
129
- }
130
- else {
131
- this.screen = false;
132
- window.addEventListener("resize", () => { window.screen.width > 1000 ? this.screen = true : this.screen = false; });
133
- }
134
- if (this.reloadTable) {
135
- this.reloadTable.subscribe((res) => {
136
- this.originalData = [];
137
- this.selectAll = false;
138
- this.seletecAllEvent('');
139
- });
140
- }
141
- this.titleLoading == "" ? this.titleLoading = "Cargando" : '';
142
- this.messageLoading == "" ? this.messageLoading = "Obteniendo datos..." : '';
143
- this.url && !this.configuration.notInitialize ? this.message.openLoading(this.titleLoading, this.messageLoading) : '';
144
- try {
145
- if (this.url && !this.configuration.notInitialize) {
146
- let service = await this.getDateTableByUrl();
147
- this.data = service['data'];
148
- this.length = service['count'];
149
- this.data.forEach((row) => {
150
- this.checkboxs[row[this.configuration.primaryKey]] = false;
151
- });
152
- this.internalData.emit(service);
153
- setTimeout(() => {
154
- this.message.closeLoading();
155
- }, 1000);
156
- this.validateRules();
157
- }
158
- else if (!this.url) {
159
- this.paginatorActive = false;
160
- }
161
- }
162
- catch (error) {
163
- console.log(error);
164
- }
165
- }
166
- async getDateTableByUrl() {
167
- this.validarParams();
168
- if (this.filtersPost.length > 0) {
169
- return await this.http.postDataBody(this.url, this.filtersPost, this.params);
170
- }
171
- else {
172
- return await this.http.getDataBody(this.url, this.params);
173
- }
174
- }
175
- validarParams() {
176
- this.params = this.functionEter.removeDuplicateObjects(this.params);
177
- if (this.params) {
178
- if (!this.params.find(x => x.id == 'page')) {
179
- this.params.push({ id: 'page', value: '0' });
180
- }
181
- if (!this.params.find(x => x.id == 'per_page')) {
182
- this.params.push({ id: 'per_page', value: this.pageSize });
183
- }
184
- if (!this.params.find(x => x.id == 'filter')) {
185
- this.params.push({ id: 'filter', value: '' });
186
- }
187
- }
188
- }
189
- async validateRules() {
190
- for (const [index, columns] of this.columns.entries()) {
191
- for (const [indexData, element] of this.data.entries()) {
192
- if (columns.rules) {
193
- for (const rule of columns.rules) {
194
- if (rule.rule == enumRules['==']) {
195
- if (element[columns.ID] && element[columns.ID].toString() == rule.valueRule.toString()) {
196
- this.data[indexData][columns.ID] = rule.valueAction;
197
- }
198
- }
199
- }
200
- }
201
- const columnValue = element[columns.ID];
202
- if (columns.type == 'fecha' || columns.type == 'date')
203
- this.data[indexData][columns.ID] = this.functionEter.dateIso(columnValue);
204
- if (columns.type == 'dateWithTime')
205
- this.data[indexData][columns.ID] = this.functionEter.dateWithTime(columnValue?.toString() ?? columnValue);
206
- if (columns.type == 'currency')
207
- this.data[indexData][columns.ID] = Intl.NumberFormat('es-CO').format(columnValue);
208
- if (columns.type == 'boolean')
209
- this.data[indexData][columns.ID] = columnValue == 1 ? "Si" : "No";
210
- }
211
- }
212
- }
213
- ngOnChanges(changes) {
214
- if (changes.data) {
215
- if (this.data) {
216
- this.data.forEach((row) => {
217
- this.checkboxs[row[this.configuration.primaryKey]] = false;
218
- });
219
- if (this.originalData.length == 0) {
220
- if (this.data.length != 0) {
221
- this.data.forEach((element) => {
222
- this.originalData.push(element);
223
- });
224
- }
225
- }
226
- }
227
- this.validateRules();
228
- }
229
- }
230
- clickOnRoW(rowData) {
231
- let state = this.checkboxs[rowData[this.configuration.primaryKey]];
232
- if (!this.configuration.selectable) {
233
- this.clearCheckboxes();
234
- }
235
- this.selection(rowData, { checked: !state }, this.configuration.selectable);
236
- this.clickRow.emit(rowData);
237
- }
238
- showMenu($event) {
239
- $event.stopPropagation();
240
- }
241
- action(action, row = null) {
242
- var currentRow = row ? [row] : this.selectedRows;
243
- switch (action) {
244
- case 'add':
245
- if (this.configuration.addPer) {
246
- this.add.emit(this.length);
247
- }
248
- else {
249
- this.dialog
250
- .open(TableModalComponent, {
251
- data: {
252
- action,
253
- columns: JSON.parse(JSON.stringify(this.columns)),
254
- },
255
- width: '60vh',
256
- })
257
- .afterClosed()
258
- .subscribe((result) => {
259
- if (result) {
260
- this.add.emit(result);
261
- }
262
- });
263
- }
264
- break;
265
- case 'edit':
266
- if (this.configuration.editPer) {
267
- this.edit.emit(currentRow);
268
- }
269
- else {
270
- let columns;
271
- columns = this.columns;
272
- columns.forEach((column, index) => {
273
- Object.keys(currentRow[0]).forEach((key) => {
274
- if (column.ID == key) {
275
- columns[index].value = currentRow[0][key];
276
- }
277
- });
278
- });
279
- this.dialog
280
- .open(TableModalComponent, {
281
- data: {
282
- action,
283
- columns: JSON.parse(JSON.stringify(this.columns)),
284
- values: currentRow[0],
285
- },
286
- width: '60vh',
287
- })
288
- .afterClosed()
289
- .subscribe((result) => {
290
- if (result) {
291
- this.edit.emit({ new: result, old: currentRow[0] });
292
- }
293
- });
294
- }
295
- break;
296
- case 'delete':
297
- this.delete.emit(currentRow);
298
- break;
299
- case 'print':
300
- this.print.emit(currentRow);
301
- break;
302
- case 'active':
303
- this.active.emit(currentRow);
304
- break;
305
- case 'exportToExcel':
306
- this.exportToExcel();
307
- break;
308
- case 'exportToExcelByRow':
309
- this.exportXslxByRow.emit(currentRow);
310
- break;
311
- case 'view':
312
- this.view.emit(currentRow);
313
- break;
314
- case 'closeOrder':
315
- this.closeOrder.emit(currentRow);
316
- break;
317
- case 'packOff':
318
- this.packOff.emit(currentRow);
319
- break;
320
- }
321
- }
322
- shouldShowMenu() {
323
- return this.buttonsConfig.some(btn => btn.condition());
324
- }
325
- exportToExcel() {
326
- let params = [];
327
- if (this.url && this.params) {
328
- params = [...this.params];
329
- let i = params.findIndex(x => x.id == 'per_page');
330
- params[i].value = 1000000;
331
- }
332
- this.exportService.generateToXlsx(this.title, this.headerFileXlsm, this.title, this.url ? null : this.data, this.url, params, this.filtersPost);
333
- }
334
- selection(row, $event, emitEvent = true) {
335
- this.checkboxs[row[this.configuration.primaryKey]] = $event.checked;
336
- if ($event.checked) {
337
- this.selectedRows.push(row);
338
- }
339
- else {
340
- let index = this.selectedRows.indexOf(row);
341
- this.selectedRows.splice(index, 1);
342
- }
343
- if (this.configuration.selectable && emitEvent) {
344
- this.selected.emit(this.selectedRows);
345
- }
346
- if (this.selectedRows.length == this.data.length) {
347
- this.selectAll = true;
348
- }
349
- else {
350
- this.selectAll = false;
351
- }
352
- if (this.selectedRows.length > 0 &&
353
- this.selectedRows.length < this.data.length) {
354
- this.indeterminateState = true;
355
- }
356
- else {
357
- this.indeterminateState = false;
358
- }
359
- }
360
- clicked($event) {
361
- event.stopPropagation();
362
- }
363
- async seletecAllEvent($event) {
364
- this.indeterminateState = false;
365
- if (this.selectAll) {
366
- Object.keys(this.checkboxs).forEach((key) => {
367
- this.checkboxs[key] = true;
368
- });
369
- this.selectedRows = [];
370
- let data = this.data;
371
- data.forEach((element) => {
372
- this.selectedRows.push(element);
373
- });
374
- this.selected.emit(this.selectedRows);
375
- }
376
- else {
377
- this.clearCheckboxes();
378
- this.selected.emit(this.selectedRows);
379
- }
380
- let service = await this.getDateTableByUrl();
381
- this.data = service['data'];
382
- this.internalData.emit(service);
383
- this.length = service['count'];
384
- this.validateRules();
385
- }
386
- clearCheckboxes() {
387
- Object.keys(this.checkboxs).forEach((key) => {
388
- this.checkboxs[key] = false;
389
- });
390
- this.selectedRows = [];
391
- }
392
- changeFilters() {
393
- if (this.params)
394
- this.params.forEach((element) => {
395
- if (element.id == 'filter') {
396
- element.value = this.filters;
397
- }
398
- });
399
- this.applyFilters();
400
- }
401
- async applyFilters($event) {
402
- if ($event)
403
- this.filtersPost = $event;
404
- if (this.url) {
405
- let res = await this.getDateTableByUrl();
406
- this.data = res['data'];
407
- this.validateRules();
408
- this.length = res['count'];
409
- this.internalData.emit(res);
410
- }
411
- else {
412
- this.data = this.originalData.filter((data) => {
413
- for (let key of Object.keys(data)) {
414
- let result = data[key]
415
- .toString()
416
- .toLowerCase()
417
- .includes(this.filters.toLowerCase());
418
- if (result) {
419
- return data;
420
- }
421
- }
422
- });
423
- }
424
- }
425
- changePage($event) {
426
- this.params.forEach((element, index) => {
427
- if (element.id == 'per_page') {
428
- element.value = $event.pageSize;
429
- }
430
- if (element.id == 'page') {
431
- element.value = $event.pageIndex;
432
- }
433
- });
434
- this.applyFilters();
435
- }
436
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataTableComponent, deps: [{ token: i1.MatLegacyDialog }, { token: i2.HttpService }, { token: i3.MessageService }, { token: i4.FunctionsService }, { token: i5.MatLegacyPaginatorIntl }, { token: i6.ExportDataService }], target: i0.ɵɵFactoryTarget.Component });
437
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DataTableComponent, selector: "data-table", inputs: { title: "title", columns: "columns", data: "data", combo: "combo", configuration: "configuration", reloadTable: "reloadTable", url: "url", params: "params", titleLoading: "titleLoading", messageLoading: "messageLoading", headerFileXlsm: "headerFileXlsm", headerFilters: "headerFilters" }, outputs: { clickRow: "clickRow", add: "add", edit: "edit", delete: "delete", print: "print", exportXslxByRow: "exportXslxByRow", active: "active", selected: "selected", view: "view", closeOrder: "closeOrder", packOff: "packOff", internalData: "internalData" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"contenedor-tabla\">\r\n <app-filters [headerFilters]=\"headerFilters\" (applyFilters)=\"applyFilters($event)\">\r\n </app-filters>\r\n\r\n <div style='display: flex; flex-direction: row; justify-content: space-between; align-items: center;'>\r\n <div style='flex:1; font-size: 1rem;'>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>0 && selectedRows.length<2'> {{selectedRows.length}} Seleccionado </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>1'> {{selectedRows.length}} Seleccionados </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length<1 && !configuration.hideTitle'> {{title}} </p></strong>\r\n </div>\r\n\r\n <div *ngIf=\"!configuration.hideFilter\" style='flex:3; padding-right: 10px; margin-bottom: 5px;'>\r\n <mat-form-field class='filter'>\r\n <input type=\"text\" [(ngModel)]='filters' (keyup)='changeFilters()' matInput placeholder=\"Filtrar\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngTemplateOutlet=\"buttonsTable\"></ng-container>\r\n\r\n </div>\r\n\r\n <table class=\"table_Eter table-hover\">\r\n <thead class=\"dark\">\r\n <tr >\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'>\r\n <mat-checkbox color='primary' (change)='seletecAllEvent($event)' [(ngModel)]='selectAll' [indeterminate]='indeterminateState'> </mat-checkbox> </th>\r\n <th\r\n [class]=\"column.style?.movil\"\r\n *ngFor='let column of columns' scope=\"col\"\r\n [ngStyle]=\"column.style\"\r\n >{{column.label}}</th>\r\n <th *ngIf=\"shouldShowMenu()\"></th>\r\n </tr>\r\n </thead>\r\n <tbody class='mat-elevation-z3'>\r\n\r\n <tr style=\"cursor: pointer;\" *ngFor='let row of data' (click)='clickOnRoW(row)' [class]=\"checkboxs[row[configuration.primaryKey]]?'selected-row':''\">\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'> <mat-checkbox color='primary' [(ngModel)]='checkboxs[row[configuration.primaryKey]]' (click)='clicked($event)' (change)='selection(row, $event)'> </mat-checkbox> </th>\r\n <th [class]='column.style?.movil' [ngStyle]='column.style' scope=\"row\" *ngFor='let column of columns'>{{ row[column.ID] }}</th>\r\n\r\n <th *ngIf=\"shouldShowMenu()\" style=\"display: flex; justify-content: center; align-items: center; overflow: visible;\">\r\n <mat-icon\r\n (click)=\"showMenu($event)\"\r\n [matMenuTriggerFor]=\"menu\"\r\n matRipple\r\n class=\"menu_more_vert\"\r\n aria-hidden=\"false\"\r\n aria-label=\"Example delete icon\"\r\n >more_vert</mat-icon>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <div *ngFor=\"let btn of buttonsConfig\" >\r\n <button *ngIf=\"btn.condition()\" (click)=\"action(btn.action, row)\" mat-menu-item class=\"d-flex align-items-center w-100\" >\r\n <i class=\"fa {{btn.icon}} btn-accion\" style=\"font-size:120%; margin-right: 10px\"></i>\r\n {{btn.tooltip}}\r\n </button>\r\n </div>\r\n\r\n </mat-menu>\r\n </th>\r\n\r\n </tr>\r\n\r\n\r\n </tbody>\r\n\r\n </table>\r\n\r\n <div *ngIf='length == 0 && data.length == 0' style=\"margin-left: 10px;\"> <strong>No se encontr\u00F3 informaci\u00F3n</strong></div>\r\n\r\n <mat-paginator *ngIf=\"paginatorActive\"\r\n [length]=\"length\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons\r\n (page)=\"changePage($event)\"></mat-paginator>\r\n\r\n </div>\r\n\r\n<ng-template #buttonsTable let-fontSize=\"fontSize\" let-marginRight=\"marginRight\" style='flex:0.5; display:flex; flex-direction: row; justify-content: flex-end;'>\r\n <ng-container *ngFor=\"let btn of buttonsConfig\">\r\n <div *ngIf=\"btn.conditionShowHeader()\" (click)=\"action(btn.action)\" matTooltip=\"{{btn.tooltip}}\" matTooltipPosition=\"above\">\r\n <i class=\"fa {{btn.icon}} btn-accion\" [ngStyle]=\"{'font-size': fontSize ? fontSize : '170%', 'margin-right': marginRight ? marginRight : '15px'}\"></i>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".contenedor-tabla{width:100%;overflow-x:auto}.table_Eter{width:100%;margin-bottom:4px;color:primary;border-collapse:collapse}.table_Eter .dark th{color:#fff;background-color:#343a40;border-color:#454d55;text-align:center;vertical-align:middle}.table_Eter thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table_Eter th,.table_Eter td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}th{text-align:inherit}*,*:before,*:after{box-sizing:border-box}.btn-accion{cursor:pointer}mat-form-field{padding:0!important;width:100%}.filter{padding:0;margin-bottom:10px;width:100%}.filter ::ng-deep .mat-form-field-underline{bottom:3px!important}.filter ::ng-deep .mat-form-field-infix{border:0!important}.filter ::ng-deep .mat-form-field-wrapper{padding:0}.filter ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-wrapper{padding:0}.selected-row{color:#212529;background-color:#00000013}button:focus{outline:none!important}@media only screen and (max-width: 600px){.no-movil{display:none}}::ng-deep .mat-paginator{background:transparent!important}@media screen and (max-width: 400px){.filter{padding:0;margin-bottom:40px;width:70%}}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i8.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatLegacyMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i12.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i13.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i14.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i5.MatLegacyPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i16.FiltersComponent, selector: "app-filters", inputs: ["headerFilters"], outputs: ["applyFilters"] }] });
438
- }
439
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataTableComponent, decorators: [{
440
- type: Component,
441
- args: [{ selector: 'data-table', template: "<div class=\"contenedor-tabla\">\r\n <app-filters [headerFilters]=\"headerFilters\" (applyFilters)=\"applyFilters($event)\">\r\n </app-filters>\r\n\r\n <div style='display: flex; flex-direction: row; justify-content: space-between; align-items: center;'>\r\n <div style='flex:1; font-size: 1rem;'>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>0 && selectedRows.length<2'> {{selectedRows.length}} Seleccionado </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length>1'> {{selectedRows.length}} Seleccionados </p></strong>\r\n <strong><p style='margin:0' *ngIf='selectedRows.length<1 && !configuration.hideTitle'> {{title}} </p></strong>\r\n </div>\r\n\r\n <div *ngIf=\"!configuration.hideFilter\" style='flex:3; padding-right: 10px; margin-bottom: 5px;'>\r\n <mat-form-field class='filter'>\r\n <input type=\"text\" [(ngModel)]='filters' (keyup)='changeFilters()' matInput placeholder=\"Filtrar\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngTemplateOutlet=\"buttonsTable\"></ng-container>\r\n\r\n </div>\r\n\r\n <table class=\"table_Eter table-hover\">\r\n <thead class=\"dark\">\r\n <tr >\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'>\r\n <mat-checkbox color='primary' (change)='seletecAllEvent($event)' [(ngModel)]='selectAll' [indeterminate]='indeterminateState'> </mat-checkbox> </th>\r\n <th\r\n [class]=\"column.style?.movil\"\r\n *ngFor='let column of columns' scope=\"col\"\r\n [ngStyle]=\"column.style\"\r\n >{{column.label}}</th>\r\n <th *ngIf=\"shouldShowMenu()\"></th>\r\n </tr>\r\n </thead>\r\n <tbody class='mat-elevation-z3'>\r\n\r\n <tr style=\"cursor: pointer;\" *ngFor='let row of data' (click)='clickOnRoW(row)' [class]=\"checkboxs[row[configuration.primaryKey]]?'selected-row':''\">\r\n <th *ngIf='configuration.selectable' style='justify-content: center;'> <mat-checkbox color='primary' [(ngModel)]='checkboxs[row[configuration.primaryKey]]' (click)='clicked($event)' (change)='selection(row, $event)'> </mat-checkbox> </th>\r\n <th [class]='column.style?.movil' [ngStyle]='column.style' scope=\"row\" *ngFor='let column of columns'>{{ row[column.ID] }}</th>\r\n\r\n <th *ngIf=\"shouldShowMenu()\" style=\"display: flex; justify-content: center; align-items: center; overflow: visible;\">\r\n <mat-icon\r\n (click)=\"showMenu($event)\"\r\n [matMenuTriggerFor]=\"menu\"\r\n matRipple\r\n class=\"menu_more_vert\"\r\n aria-hidden=\"false\"\r\n aria-label=\"Example delete icon\"\r\n >more_vert</mat-icon>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <div *ngFor=\"let btn of buttonsConfig\" >\r\n <button *ngIf=\"btn.condition()\" (click)=\"action(btn.action, row)\" mat-menu-item class=\"d-flex align-items-center w-100\" >\r\n <i class=\"fa {{btn.icon}} btn-accion\" style=\"font-size:120%; margin-right: 10px\"></i>\r\n {{btn.tooltip}}\r\n </button>\r\n </div>\r\n\r\n </mat-menu>\r\n </th>\r\n\r\n </tr>\r\n\r\n\r\n </tbody>\r\n\r\n </table>\r\n\r\n <div *ngIf='length == 0 && data.length == 0' style=\"margin-left: 10px;\"> <strong>No se encontr\u00F3 informaci\u00F3n</strong></div>\r\n\r\n <mat-paginator *ngIf=\"paginatorActive\"\r\n [length]=\"length\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons\r\n (page)=\"changePage($event)\"></mat-paginator>\r\n\r\n </div>\r\n\r\n<ng-template #buttonsTable let-fontSize=\"fontSize\" let-marginRight=\"marginRight\" style='flex:0.5; display:flex; flex-direction: row; justify-content: flex-end;'>\r\n <ng-container *ngFor=\"let btn of buttonsConfig\">\r\n <div *ngIf=\"btn.conditionShowHeader()\" (click)=\"action(btn.action)\" matTooltip=\"{{btn.tooltip}}\" matTooltipPosition=\"above\">\r\n <i class=\"fa {{btn.icon}} btn-accion\" [ngStyle]=\"{'font-size': fontSize ? fontSize : '170%', 'margin-right': marginRight ? marginRight : '15px'}\"></i>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".contenedor-tabla{width:100%;overflow-x:auto}.table_Eter{width:100%;margin-bottom:4px;color:primary;border-collapse:collapse}.table_Eter .dark th{color:#fff;background-color:#343a40;border-color:#454d55;text-align:center;vertical-align:middle}.table_Eter thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table_Eter th,.table_Eter td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}th{text-align:inherit}*,*:before,*:after{box-sizing:border-box}.btn-accion{cursor:pointer}mat-form-field{padding:0!important;width:100%}.filter{padding:0;margin-bottom:10px;width:100%}.filter ::ng-deep .mat-form-field-underline{bottom:3px!important}.filter ::ng-deep .mat-form-field-infix{border:0!important}.filter ::ng-deep .mat-form-field-wrapper{padding:0}.filter ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-wrapper{padding:0}.selected-row{color:#212529;background-color:#00000013}button:focus{outline:none!important}@media only screen and (max-width: 600px){.no-movil{display:none}}::ng-deep .mat-paginator{background:transparent!important}@media screen and (max-width: 400px){.filter{padding:0;margin-bottom:40px;width:70%}}\n"] }]
442
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialog }, { type: i2.HttpService }, { type: i3.MessageService }, { type: i4.FunctionsService }, { type: i5.MatLegacyPaginatorIntl }, { type: i6.ExportDataService }]; }, propDecorators: { title: [{
443
- type: Input
444
- }], columns: [{
445
- type: Input
446
- }], data: [{
447
- type: Input
448
- }], combo: [{
449
- type: Input
450
- }], configuration: [{
451
- type: Input
452
- }], reloadTable: [{
453
- type: Input
454
- }], url: [{
455
- type: Input
456
- }], params: [{
457
- type: Input
458
- }], titleLoading: [{
459
- type: Input
460
- }], messageLoading: [{
461
- type: Input
462
- }], headerFileXlsm: [{
463
- type: Input
464
- }], clickRow: [{
465
- type: Output
466
- }], add: [{
467
- type: Output
468
- }], edit: [{
469
- type: Output
470
- }], delete: [{
471
- type: Output
472
- }], print: [{
473
- type: Output
474
- }], exportXslxByRow: [{
475
- type: Output
476
- }], active: [{
477
- type: Output
478
- }], selected: [{
479
- type: Output
480
- }], view: [{
481
- type: Output
482
- }], closeOrder: [{
483
- type: Output
484
- }], packOff: [{
485
- type: Output
486
- }], internalData: [{
487
- type: Output
488
- }], headerFilters: [{
489
- type: Input
490
- }], paginator: [{
491
- type: ViewChild,
492
- args: [MatPaginator, { static: true }]
493
- }] } });
494
- var enumRules;
495
- (function (enumRules) {
496
- enumRules[enumRules[">"] = 0] = ">";
497
- enumRules[enumRules["<"] = 1] = "<";
498
- enumRules[enumRules["=="] = 2] = "==";
499
- enumRules[enumRules["!="] = 3] = "!=";
500
- })(enumRules || (enumRules = {}));
501
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdEUsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFHWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0ZBQWdGLENBQUM7QUFFckgsT0FBTyxFQUFFLGtCQUFrQixJQUFJLFlBQVksRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNeEYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQVksRUFBRSxRQUFnQixFQUFFLE1BQWMsRUFBRSxFQUFFO0lBQzNFLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO1FBQ2hDLE9BQU8sUUFBUSxNQUFNLEVBQUUsQ0FBQztLQUN6QjtJQUVELE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU3QixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBRW5DLE1BQU0sUUFBUSxHQUNaLFVBQVUsR0FBRyxNQUFNO1FBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxRQUFRLEVBQUUsTUFBTSxDQUFDO1FB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c0JBQXJCLEtBQUs7Z0JBb0JHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLEdBQUc7c0JBQVosTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRSxhQUFhO3NCQUFyQixLQUFLO2dCQUlxQyxTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7O0FBNlkzQyxJQUFLLFNBS0o7QUFMRCxXQUFLLFNBQVM7SUFDWixtQ0FBRyxDQUFBO0lBQ0gsbUNBQUcsQ0FBQTtJQUNILHFDQUFJLENBQUE7SUFDSixxQ0FBSSxDQUFBO0FBQ04sQ0FBQyxFQUxJLFNBQVMsS0FBVCxTQUFTLFFBS2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY3JlZW5TaXplVXRpbCB9IGZyb20gJy4vLi4vLi4vLi4vc2VydmljZXMvc2NyZWVuLXNpemUtdXRpbCc7XHJcbmltcG9ydCB7IEV4cG9ydERhdGFTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9zZXJ2aWNlcy9leHBvcnQtZGF0YS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XHJcbmltcG9ydCB7IFRhYmxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9icmFpbmxvcGVyLXVpL2NvbXBvbmVudHMvZGF0YS10YWJsZS90YWJsZS1tb2RhbC90YWJsZS1tb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2h0dHAuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdExlZ2FjeVBhZ2luYXRvciBhcyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGdW5jdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZnVuY3Rpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXRMZWdhY3lQYWdpbmF0b3JJbnRsIGFzIE1hdFBhZ2luYXRvckludGwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTGVnYWN5VG9vbHRpcFBvc2l0aW9uIGFzIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS10b29sdGlwJztcclxuXHJcbmNvbnN0IHNwYW5pc2hSYW5nZUxhYmVsID0gKHBhZ2U6IG51bWJlciwgcGFnZVNpemU6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpID0+IHtcclxuICBpZiAobGVuZ3RoID09IDAgfHwgcGFnZVNpemUgPT0gMCkge1xyXG4gICAgcmV0dXJuIGAwIGRlICR7bGVuZ3RofWA7XHJcbiAgfVxyXG5cclxuICBsZW5ndGggPSBNYXRoLm1heChsZW5ndGgsIDApO1xyXG5cclxuICBjb25zdCBzdGFydEluZGV4ID0gcGFnZSAqIHBhZ2VTaXplO1xyXG5cclxuICBjb25zdCBlbmRJbmRleCA9XHJcbiAgICBzdGFydEluZGV4IDwgbGVuZ3RoXHJcbiAgICAgID8gTWF0aC5taW4oc3RhcnRJbmRleCArIHBhZ2VTaXplLCBsZW5ndGgpXHJcbiAgICAgIDogc3RhcnRJbmRleCArIHBhZ2VTaXplO1xyXG5cclxuICByZXR1cm4gYCR7c3RhcnRJbmRleCArIDF9IC0gJHtlbmRJbmRleH0gZGUgJHtsZW5ndGh9YDtcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGF0YS10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSB0aXRsZTtcclxuICBASW5wdXQoKSBjb2x1bW5zO1xyXG4gIEBJbnB1dCgpIGRhdGE6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNvbWJvO1xyXG4gIEBJbnB1dCgpIGNvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICBhZGQ6IGZhbHNlLFxyXG4gICAgZWRpdDogZmFsc2UsXHJcbiAgICBkZWxldGU6IGZhbHNlLFxyXG4gICAgYWN0aXZlOiBmYWxzZSxcclxuICAgIHNlbGVjdGFibGU6IGZhbHNlLFxyXG4gICAgcHJpbnQ6IGZhbHNlLFxyXG4gICAgYWRkUGVyOiBmYWxzZSxcclxuICAgIGVkaXRQZXI6IGZhbHNlLFxyXG4gICAgcHJpbWFyeUtleTogJ2lkJyxcclxuICAgIGV4cG9ydFhzbHg6IGZhbHNlLFxyXG4gICAgaGlkZVRpdGxlOiB0cnVlLFxyXG4gICAgaGlkZUZpbHRlcjogdHJ1ZSxcclxuICAgIG5vdEluaXRpYWxpemU6IGZhbHNlLFxyXG4gICAgZXhwb3J0WHNseEJ5Um93OiBmYWxzZSxcclxuICAgIHZpZXc6IGZhbHNlLFxyXG4gICAgY2xvc2VPcmRlcjogZmFsc2UsXHJcbiAgICBwYWNrT2ZmOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpIHJlbG9hZFRhYmxlOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBASW5wdXQoKSB1cmw6IHN0cmluZztcclxuICBASW5wdXQoKSBwYXJhbXM6IEFycmF5PGFueT47XHJcbiAgQElucHV0KCkgdGl0bGVMb2FkaW5nOiBzdHJpbmcgPSBcIlwiXHJcbiAgQElucHV0KCkgbWVzc2FnZUxvYWRpbmc6IHN0cmluZyA9IFwiXCJcclxuICBASW5wdXQoKSBoZWFkZXJGaWxlWGxzbTogQXJyYXk8YW55PiA9IFtdXHJcblxyXG4gIEBPdXRwdXQoKSBjbGlja1JvdyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBhZGQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBkZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZXhwb3J0WHNseEJ5Um93ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGFjdGl2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNsb3NlT3JkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcGFja09mZiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpbnRlcm5hbERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBASW5wdXQoKSBoZWFkZXJGaWx0ZXJzOiBBcnJheTxhbnk+ID0gW11cclxuXHJcbiAgbW92aWwgPSBTY3JlZW5TaXplVXRpbC5pc01vYmlsZSgpO1xyXG4gIGZpbHRlcnNQb3N0OiBBcnJheTxhbnk+ID0gW11cclxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvciwgeyBzdGF0aWM6IHRydWUgfSkgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcblxyXG4gIHNlbGVjdGVkUm93cyA9IFtdOyAvKiogYWxtYWNlbmEgbGFzIGZpbGFzIHNlbGVjY2lvbmFkYXMgKi9cclxuICBjaGVja2JveHMgPSB7fTtcclxuICBzZWxlY3RBbGwgPSBmYWxzZTtcclxuICBpbmRldGVybWluYXRlU3RhdGUgPSBmYWxzZTtcclxuICBmaWx0ZXJzO1xyXG4gIG9yaWdpbmFsRGF0YSA9IFtdO1xyXG4gIHBhZ2luYXRvckFjdGl2ZSA9IHRydWU7XHJcbiAgc2NyZWVuOiBib29sZWFuID0gdHJ1ZVxyXG5cclxuICBpZF9jb21wYW5pYTtcclxuXHJcbiAgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMjUsIDUwLCAxMDBdO1xyXG5cclxuICBwYWdlU2l6ZSA9IHNjcmVlbi53aWR0aCA+IDUwMCA/IDEwIDogNTtcclxuICBsZW5ndGggPSAwO1xyXG5cclxuICBwYWdlID0gMDtcclxuXHJcbiAgYWJvdmU6IFRvb2x0aXBQb3NpdGlvbltdID0gWydhYm92ZSddO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmdW5jdGlvbkV0ZXI6IEZ1bmN0aW9uc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBhZ2luYXRvclRyYW5zbGF0ZTogTWF0UGFnaW5hdG9ySW50bCxcclxuICAgIHByaXZhdGUgZXhwb3J0U2VydmljZTogRXhwb3J0RGF0YVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLml0ZW1zUGVyUGFnZUxhYmVsID0gJ0VsZW1lbnRvcyBwb3IgcMOhZ2luYSc7XHJcbiAgICB0aGlzLnBhZ2luYXRvclRyYW5zbGF0ZS5uZXh0UGFnZUxhYmVsID0gJ1NpZ3VpZW50ZSBww6FnaW5hJztcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLmxhc3RQYWdlTGFiZWwgPSAnw5psdGltYSBww6FnaW5hJztcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLnByZXZpb3VzUGFnZUxhYmVsID0gJ1DDoWdpbmEgYW50ZXJpb3InO1xyXG4gICAgdGhpcy5wYWdpbmF0b3JUcmFuc2xhdGUuZmlyc3RQYWdlTGFiZWwgPSAnUHJpbWVyYSBww6FnaW5hJztcclxuICAgIHRoaXMucGFnaW5hdG9yVHJhbnNsYXRlLmdldFJhbmdlTGFiZWwgPSBzcGFuaXNoUmFuZ2VMYWJlbDtcclxuICB9XHJcblxyXG4gIGJ1dHRvbnNDb25maWcgPSBbXHJcbiAgICB7IGFjdGlvbjogJ2VkaXQnLCBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PiB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT09IDEgJiYgdGhpcy5jb25maWd1cmF0aW9uLmVkaXQsIGNvbmRpdGlvbjogKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uLmVkaXQsIGljb246ICdmYS1lZGl0JywgdG9vbHRpcDogJ0VkaXRhcicgfSxcclxuICAgIHsgYWN0aW9uOiAncHJpbnQnLCBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PiB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT09IDEgJiYgdGhpcy5jb25maWd1cmF0aW9uLnByaW50ICYmIHRoaXMuc2NyZWVuLCBjb25kaXRpb246ICgpID0+IHRoaXMuY29uZmlndXJhdGlvbi5wcmludCAmJiB0aGlzLnNjcmVlbiwgaWNvbjogJ2ZhLXByaW50JywgdG9vbHRpcDogJ0ltcHJpbWlyJyB9LFxyXG4gICAgeyBhY3Rpb246ICdkZWxldGUnLCBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PiB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPiAwICYmIHRoaXMuY29uZmlndXJhdGlvbi5kZWxldGUsIGNvbmRpdGlvbjogKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uLmRlbGV0ZSwgaWNvbjogJ2ZhLXRyYXNoJywgdG9vbHRpcDogJ0VsaW1pbmFyJyB9LFxyXG4gICAgeyBhY3Rpb246ICdhY3RpdmUnLCBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PiB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPiAwICYmIHRoaXMuY29uZmlndXJhdGlvbi5hY3RpdmUsIGNvbmRpdGlvbjogKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uLmFjdGl2ZSwgaWNvbjogJ2ZhLWFkanVzdCcsIHRvb2x0aXA6ICdBY3RpdmFyL0Rlc2FjdGl2YXInIH0sXHJcbiAgICB7IGFjdGlvbjogJ2FkZCcsIGNvbmRpdGlvblNob3dIZWFkZXI6ICgpID0+IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkLCBjb25kaXRpb246ICgpID0+IGZhbHNlLCBpY29uOiAnZmEtcGx1cy1jaXJjbGUnLCB0b29sdGlwOiAnTnVldm8nIH0sXHJcbiAgICB7IGFjdGlvbjogJ2V4cG9ydFRvRXhjZWwnLCBjb25kaXRpb25TaG93SGVhZGVyOiAoKSA9PiB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT09IDAgJiYgdGhpcy5kYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5jb25maWd1cmF0aW9uLmV4cG9ydFhzbHgsIGNvbmRpdGlvbjogKCkgPT4gZmFsc2UsIGljb246ICdmYS1kb3dubG9hZCcsIHRvb2x0aXA6ICdFeHBvcnRhciBUYWJsYScgfSxcclxuICAgIHsgYWN0aW9uOiAnZXhwb3J0VG9FeGNlbEJ5Um93JywgY29uZGl0aW9uU2hvd0hlYWRlcjogKCkgPT4gdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmIHRoaXMuY29uZmlndXJhdGlvbi5leHBvcnRYc2x4QnlSb3csIGNvbmRpdGlvbjogKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uLmV4cG9ydFhzbHhCeVJvdywgaWNvbjogJ2ZhLWRvd25sb2FkJywgdG9vbHRpcDogJ0V4cG9ydGFyIFJlZ2lzdHJvJyB9LFxyXG4gICAgeyBhY3Rpb246ICd2aWV3JywgY29uZGl0aW9uU2hvd0hlYWRlcjogKCkgPT4gdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmIHRoaXMuY29uZmlndXJhdGlvbi52aWV3LCBjb25kaXRpb246ICgpID0+IHRoaXMuY29uZmlndXJhdGlvbi52aWV3LCBpY29uOiAnZmEtZXllJywgdG9vbHRpcDogJ1ZlciBkZXRhbGxlJyB9LFxyXG4gICAgeyBhY3Rpb246ICdjbG9zZU9yZGVyJywgY29uZGl0aW9uU2hvd0hlYWRlcjogKCkgPT4gdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAxICYmIHRoaXMuY29uZmlndXJhdGlvbi5jbG9zZU9yZGVyLCBjb25kaXRpb246ICgpID0+IHRoaXMuY29uZmlndXJhdGlvbi5jbG9zZU9yZGVyLCBpY29uOiAnZmEtY2hlY2stY2lyY2xlJywgdG9vbHRpcDogJ0NlcnJhciBvcmRlbicgfSxcclxuICAgIHsgYWN0aW9uOiAncGFja09mZicsIGNvbmRpdGlvblNob3dIZWFkZXI6ICgpID0+IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ucGFja09mZiwgY29uZGl0aW9uOiAoKSA9PiB0aGlzLmNvbmZpZ3VyYXRpb24ucGFja09mZiwgaWNvbjogJ2ZhLWNhcnQtYXJyb3ctZG93bicsIHRvb2x0aXA6ICdEZXNwYWNoYXIgcmVjdXJzb3MnIH1cclxuICBdO1xyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh3aW5kb3cuc2NyZWVuLndpZHRoID4gMTAwMCkge1xyXG4gICAgICB0aGlzLnNjcmVlbiA9IHRydWVcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgKCkgPT4geyB3aW5kb3cuc2NyZWVuLndpZHRoID4gMTAwMCA/IHRoaXMuc2NyZWVuID0gdHJ1ZSA6IHRoaXMuc2NyZWVuID0gZmFsc2U7IH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY3JlZW4gPSBmYWxzZTtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgKCkgPT4geyB3aW5kb3cuc2NyZWVuLndpZHRoID4gMTAwMCA/IHRoaXMuc2NyZWVuID0gdHJ1ZSA6IHRoaXMuc2NyZWVuID0gZmFsc2U7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnJlbG9hZFRhYmxlKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkVGFibGUuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxldGVjQWxsRXZlbnQoJycpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRpdGxlTG9hZGluZyA9PSBcIlwiID8gdGhpcy50aXRsZUxvYWRpbmcgPSBcIkNhcmdhbmRvXCIgOiAnJztcclxuICAgIHRoaXMubWVzc2FnZUxvYWRpbmcgPT0gXCJcIiA/IHRoaXMubWVzc2FnZUxvYWRpbmcgPSBcIk9idGVuaWVuZG8gZGF0b3MuLi5cIiA6ICcnO1xyXG4gICAgdGhpcy51cmwgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5ub3RJbml0aWFsaXplID8gdGhpcy5tZXNzYWdlLm9wZW5Mb2FkaW5nKHRoaXMudGl0bGVMb2FkaW5nLCB0aGlzLm1lc3NhZ2VMb2FkaW5nKSA6ICcnO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnVybCAmJiAhdGhpcy5jb25maWd1cmF0aW9uLm5vdEluaXRpYWxpemUpIHtcclxuICAgICAgICBsZXQgc2VydmljZSA9IGF3YWl0IHRoaXMuZ2V0RGF0ZVRhYmxlQnlVcmwoKVxyXG4gICAgICAgIHRoaXMuZGF0YSA9IHNlcnZpY2VbJ2RhdGEnXTtcclxuICAgICAgICB0aGlzLmxlbmd0aCA9IHNlcnZpY2VbJ2NvdW50J107XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hlY2tib3hzW3Jvd1t0aGlzLmNvbmZpZ3VyYXRpb24ucHJpbWFyeUtleV1dID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxEYXRhLmVtaXQoc2VydmljZSlcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZS5jbG9zZUxvYWRpbmcoKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRlUnVsZXMoKTtcclxuXHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMudXJsKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0b3JBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXREYXRlVGFibGVCeVVybCgpIHtcclxuICAgIHRoaXMudmFsaWRhclBhcmFtcygpO1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyc1Bvc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5odHRwLnBvc3REYXRhQm9keSh0aGlzLnVybCwgdGhpcy5maWx0ZXJzUG9zdCwgdGhpcy5wYXJhbXMpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5odHRwLmdldERhdGFCb2R5KHRoaXMudXJsLCB0aGlzLnBhcmFtcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXJQYXJhbXMoKSB7XHJcbiAgICB0aGlzLnBhcmFtcyA9IHRoaXMuZnVuY3Rpb25FdGVyLnJlbW92ZUR1cGxpY2F0ZU9iamVjdHModGhpcy5wYXJhbXMpXHJcbiAgICBpZiAodGhpcy5wYXJhbXMpIHtcclxuICAgICAgaWYgKCF0aGlzLnBhcmFtcy5maW5kKHggPT4geC5pZCA9PSAncGFnZScpKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMucHVzaCh7IGlkOiAncGFnZScsIHZhbHVlOiAnMCcgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLnBhcmFtcy5maW5kKHggPT4geC5pZCA9PSAncGVyX3BhZ2UnKSkge1xyXG4gICAgICAgIHRoaXMucGFyYW1zLnB1c2goeyBpZDogJ3Blcl9wYWdlJywgdmFsdWU6IHRoaXMucGFnZVNpemUgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLnBhcmFtcy5maW5kKHggPT4geC5pZCA9PSAnZmlsdGVyJykpIHtcclxuICAgICAgICB0aGlzLnBhcmFtcy5wdXNoKHsgaWQ6ICdmaWx0ZXInLCB2YWx1ZTogJycgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHZhbGlkYXRlUnVsZXMoKSB7XHJcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sdW1uc10gb2YgdGhpcy5jb2x1bW5zLmVudHJpZXMoKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleERhdGEsIGVsZW1lbnRdIG9mIHRoaXMuZGF0YS5lbnRyaWVzKCkpIHtcclxuICAgICAgICBpZiAoY29sdW1ucy5ydWxlcykge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNvbHVtbnMucnVsZXMpIHtcclxuICAgICAgICAgICAgaWYgKHJ1bGUucnVsZSA9PSBlbnVtUnVsZXNbJz09J10pIHtcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudFtjb2x1bW5zLklEXSAmJiBlbGVtZW50W2NvbHVtbnMuSURdLnRvU3RyaW5nKCkgPT0gcnVsZS52YWx1ZVJ1bGUudG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhW2luZGV4RGF0YV1bY29sdW1ucy5JRF0gPSBydWxlLnZhbHVlQWN0aW9uXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gZWxlbWVudFtjb2x1bW5zLklEXTtcclxuICAgICAgICBpZiAoY29sdW1ucy50eXBlID09ICdmZWNoYScgfHwgY29sdW1ucy50eXBlID09ICdkYXRlJykgdGhpcy5kYXRhW2luZGV4RGF0YV1bY29sdW1ucy5JRF0gPSB0aGlzLmZ1bmN0aW9uRXRlci5kYXRlSXNvKGNvbHVtblZhbHVlKTtcclxuICAgICAgICBpZiAoY29sdW1ucy50eXBlID09ICdkYXRlV2l0aFRpbWUnKSB0aGlzLmRhdGFbaW5kZXhEYXRhXVtjb2x1bW5zLklEXSA9IHRoaXMuZnVuY3Rpb25FdGVyLmRhdGVXaXRoVGltZShjb2x1bW5WYWx1ZT8udG9TdHJpbmcoKSA/PyBjb2x1bW5WYWx1ZSk7XHJcbiAgICAgICAgaWYgKGNvbHVtbnMudHlwZSA9PSAnY3VycmVuY3knKSB0aGlzLmRhdGFbaW5kZXhEYXRhXVtjb2x1bW5zLklEXSA9IEludGwuTnVtYmVyRm9ybWF0KCdlcy1DTycpLmZvcm1hdChjb2x1bW5WYWx1ZSk7XHJcbiAgICAgICAgaWYgKGNvbHVtbnMudHlwZSA9PSAnYm9vbGVhbicpIHRoaXMuZGF0YVtpbmRleERhdGFdW2NvbHVtbnMuSURdID0gY29sdW1uVmFsdWUgPT0gMSA/IFwiU2lcIiA6IFwiTm9cIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMuZGF0YSkge1xyXG4gICAgICBpZiAodGhpcy5kYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jaGVja2JveHNbcm93W3RoaXMuY29uZmlndXJhdGlvbi5wcmltYXJ5S2V5XV0gPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbERhdGEubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YS5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52YWxpZGF0ZVJ1bGVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGlja09uUm9XKHJvd0RhdGEpIHtcclxuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2hlY2tib3hzW3Jvd0RhdGFbdGhpcy5jb25maWd1cmF0aW9uLnByaW1hcnlLZXldXVxyXG5cclxuICAgIGlmKCF0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0YWJsZSl7XHJcbiAgICAgIHRoaXMuY2xlYXJDaGVja2JveGVzKClcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbihyb3dEYXRhLCB7IGNoZWNrZWQ6ICFzdGF0ZSB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0YWJsZSlcclxuICAgIHRoaXMuY2xpY2tSb3cuZW1pdChyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIHNob3dNZW51KCRldmVudCl7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb24oYWN0aW9uLCByb3cgPSBudWxsKSB7XHJcbiAgICB2YXIgY3VycmVudFJvdyA9IHJvdyA/IFtyb3ddIDogdGhpcy5zZWxlY3RlZFJvd3NcclxuXHJcbiAgICBzd2l0Y2ggKGFjdGlvbikge1xyXG4gICAgICBjYXNlICdhZGQnOlxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGVyKSB7XHJcbiAgICAgICAgICB0aGlzLmFkZC5lbWl0KHRoaXMubGVuZ3RoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kaWFsb2dcclxuICAgICAgICAgICAgLm9wZW4oVGFibGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbixcclxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb2x1bW5zKSksXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB3aWR0aDogJzYwdmgnLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZC5lbWl0KHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnZWRpdCc6XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5lZGl0UGVyKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXQuZW1pdChjdXJyZW50Um93KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGNvbHVtbnM6IGFueTtcclxuICAgICAgICAgIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XHJcblxyXG4gICAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGN1cnJlbnRSb3dbMF0pLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChjb2x1bW4uSUQgPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zW2luZGV4XS52YWx1ZSA9IGN1cnJlbnRSb3dbMF1ba2V5XTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5kaWFsb2dcclxuICAgICAgICAgICAgLm9wZW4oVGFibGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIGFjdGlvbixcclxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb2x1bW5zKSksXHJcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGN1cnJlbnRSb3dbMF0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB3aWR0aDogJzYwdmgnLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXQuZW1pdCh7IG5ldzogcmVzdWx0LCBvbGQ6IGN1cnJlbnRSb3dbMF0gfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnZGVsZXRlJzpcclxuICAgICAgICB0aGlzLmRlbGV0ZS5lbWl0KGN1cnJlbnRSb3cpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwcmludCc6XHJcbiAgICAgICAgdGhpcy5wcmludC5lbWl0KGN1cnJlbnRSb3cpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdhY3RpdmUnOlxyXG4gICAgICAgIHRoaXMuYWN0aXZlLmVtaXQoY3VycmVudFJvdyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2V4cG9ydFRvRXhjZWwnOlxyXG4gICAgICAgIHRoaXMuZXhwb3J0VG9FeGNlbCgpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2V4cG9ydFRvRXhjZWxCeVJvdyc6XHJcbiAgICAgICAgdGhpcy5leHBvcnRYc2x4QnlSb3cuZW1pdChjdXJyZW50Um93KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAndmlldyc6XHJcbiAgICAgICAgdGhpcy52aWV3LmVtaXQoY3VycmVudFJvdyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Nsb3NlT3JkZXInOlxyXG4gICAgICAgIHRoaXMuY2xvc2VPcmRlci5lbWl0KGN1cnJlbnRSb3cpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdwYWNrT2ZmJzpcclxuICAgICAgICB0aGlzLnBhY2tPZmYuZW1pdChjdXJyZW50Um93KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3VsZFNob3dNZW51KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uc0NvbmZpZy5zb21lKGJ0biA9PiBidG4uY29uZGl0aW9uKCkpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBleHBvcnRUb0V4Y2VsKCkge1xyXG4gICAgbGV0IHBhcmFtcyA9IFtdXHJcbiAgICBpZiAodGhpcy51cmwgJiYgdGhpcy5wYXJhbXMpIHtcclxuICAgICAgcGFyYW1zID0gWy4uLnRoaXMucGFyYW1zXVxyXG4gICAgICBsZXQgaSA9IHBhcmFtcy5maW5kSW5kZXgoeCA9PiB4LmlkID09ICdwZXJfcGFnZScpXHJcbiAgICAgIHBhcmFtc1tpXS52YWx1ZSA9IDEwMDAwMDBcclxuICAgIH1cclxuICAgIHRoaXMuZXhwb3J0U2VydmljZS5nZW5lcmF0ZVRvWGxzeDxhbnk+KHRoaXMudGl0bGUsIHRoaXMuaGVhZGVyRmlsZVhsc20sIHRoaXMudGl0bGUsIHRoaXMudXJsID8gbnVsbCA6IHRoaXMuZGF0YSwgdGhpcy51cmwsIHBhcmFtcywgdGhpcy5maWx0ZXJzUG9zdClcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbihyb3csICRldmVudCwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5jaGVja2JveHNbcm93W3RoaXMuY29uZmlndXJhdGlvbi5wcmltYXJ5S2V5XV0gPSAkZXZlbnQuY2hlY2tlZDtcclxuICAgIGlmICgkZXZlbnQuY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5wdXNoKHJvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLnNlbGVjdGVkUm93cy5pbmRleE9mKHJvdyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RhYmxlICYmIGVtaXRFdmVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPT0gdGhpcy5kYXRhLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID4gMCAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5sZW5ndGggPCB0aGlzLmRhdGEubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5pbmRldGVybWluYXRlU3RhdGUgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbmRldGVybWluYXRlU3RhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsaWNrZWQoJGV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbGV0ZWNBbGxFdmVudCgkZXZlbnQpIHtcclxuICAgIHRoaXMuaW5kZXRlcm1pbmF0ZVN0YXRlID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0QWxsKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tib3hzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrYm94c1trZXldID0gdHJ1ZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MucHVzaChlbGVtZW50KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbGVhckNoZWNrYm94ZXMoKVxyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXREYXRlVGFibGVCeVVybCgpXHJcbiAgICB0aGlzLmRhdGEgPSBzZXJ2aWNlWydkYXRhJ107XHJcbiAgICB0aGlzLmludGVybmFsRGF0YS5lbWl0KHNlcnZpY2UpXHJcbiAgICB0aGlzLmxlbmd0aCA9IHNlcnZpY2VbJ2NvdW50J107XHJcbiAgICB0aGlzLnZhbGlkYXRlUnVsZXMoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQ2hlY2tib3hlcygpIHtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tib3hzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgdGhpcy5jaGVja2JveHNba2V5XSA9IGZhbHNlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUZpbHRlcnMoKSB7XHJcbiAgICBpZiAodGhpcy5wYXJhbXMpXHJcbiAgICAgIHRoaXMucGFyYW1zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSAnZmlsdGVyJykge1xyXG4gICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHRoaXMuZmlsdGVycztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKClcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhcHBseUZpbHRlcnMoJGV2ZW50PzogYW55KSB7XHJcbiAgICBpZiAoJGV2ZW50KSB0aGlzLmZpbHRlcnNQb3N0ID0gJGV2ZW50XHJcbiAgICBpZiAodGhpcy51cmwpIHtcclxuICAgICAgbGV0IHJlczogYW55ID0gYXdhaXQgdGhpcy5nZXREYXRlVGFibGVCeVVybCgpXHJcbiAgICAgIHRoaXMuZGF0YSA9IHJlc1snZGF0YSddO1xyXG4gICAgICB0aGlzLnZhbGlkYXRlUnVsZXMoKTtcclxuICAgICAgdGhpcy5sZW5ndGggPSByZXNbJ2NvdW50J107XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxEYXRhLmVtaXQocmVzKVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLmZpbHRlcigoZGF0YSkgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhkYXRhKSkge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGRhdGFba2V5XVxyXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAuaW5jbHVkZXModGhpcy5maWx0ZXJzLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNoYW5nZVBhZ2UoJGV2ZW50KSB7XHJcbiAgICB0aGlzLnBhcmFtcy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC5pZCA9PSAncGVyX3BhZ2UnKSB7XHJcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9ICRldmVudC5wYWdlU2l6ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZWxlbWVudC5pZCA9PSAncGFnZScpIHtcclxuICAgICAgICBlbGVtZW50LnZhbHVlID0gJGV2ZW50LnBhZ2VJbmRleDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVycygpXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZW51bSBlbnVtUnVsZXMge1xyXG4gIFwiPlwiLFxyXG4gIFwiPFwiLFxyXG4gIFwiPT1cIixcclxuICBcIiE9XCJcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29udGVuZWRvci10YWJsYVwiPlxyXG4gIDxhcHAtZmlsdGVycyBbaGVhZGVyRmlsdGVyc109XCJoZWFkZXJGaWx0ZXJzXCIgKGFwcGx5RmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPlxyXG4gIDwvYXBwLWZpbHRlcnM+XHJcblxyXG4gIDxkaXYgc3R5bGU9J2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Jz5cclxuICAgIDxkaXYgc3R5bGU9J2ZsZXg6MTsgZm9udC1zaXplOiAxcmVtOyc+XHJcbiAgICAgIDxzdHJvbmc+PHAgc3R5bGU9J21hcmdpbjowJyAqbmdJZj0nc2VsZWN0ZWRSb3dzLmxlbmd0aD4wICYmIHNlbGVjdGVkUm93cy5sZW5ndGg8Mic+IHt7c2VsZWN0ZWRSb3dzLmxlbmd0aH19IFNlbGVjY2lvbmFkbyA8L3A+PC9zdHJvbmc+XHJcbiAgICAgIDxzdHJvbmc+PHAgc3R5bGU9J21hcmdpbjowJyAqbmdJZj0nc2VsZWN0ZWRSb3dzLmxlbmd0aD4xJz4ge3tzZWxlY3RlZFJvd3MubGVuZ3RofX0gU2VsZWNjaW9uYWRvcyA8L3A+PC9zdHJvbmc+XHJcbiAgICAgIDxzdHJvbmc+PHAgc3R5bGU9J21hcmdpbjowJyAqbmdJZj0nc2VsZWN0ZWRSb3dzLmxlbmd0aDwxICYmICFjb25maWd1cmF0aW9uLmhpZGVUaXRsZSc+IHt7dGl0bGV9fSA8L3A+PC9zdHJvbmc+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZ3VyYXRpb24uaGlkZUZpbHRlclwiIHN0eWxlPSdmbGV4OjM7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IG1hcmdpbi1ib3R0b206IDVweDsnPlxyXG4gICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSdmaWx0ZXInPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPSdmaWx0ZXJzJyAoa2V5dXApPSdjaGFuZ2VGaWx0ZXJzKCknICBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkZpbHRyYXJcIj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zVGFibGVcIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gPHRhYmxlIGNsYXNzPVwidGFibGVfRXRlciB0YWJsZS1ob3ZlclwiPlxyXG4gICAgIDx0aGVhZCBjbGFzcz1cImRhcmtcIj5cclxuICAgICAgIDx0ciA+XHJcbiAgICAgICAgPHRoICpuZ0lmPSdjb25maWd1cmF0aW9uLnNlbGVjdGFibGUnIHN0eWxlPSdqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsnPlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj0ncHJpbWFyeScgKGNoYW5nZSk9J3NlbGV0ZWNBbGxFdmVudCgkZXZlbnQpJyBbKG5nTW9kZWwpXT0nc2VsZWN0QWxsJyBbaW5kZXRlcm1pbmF0ZV09J2luZGV0ZXJtaW5hdGVTdGF0ZSc+IDwvbWF0LWNoZWNrYm94PiAgPC90aD5cclxuICAgICAgIDx0aFxyXG4gICAgICAgW2NsYXNzXT1cImNvbHVtbi5zdHlsZT8ubW92aWxcIlxyXG4gICAgICAgKm5nRm9yPSdsZXQgY29sdW1uIG9mIGNvbHVtbnMnIHNjb3BlPVwiY29sXCJcclxuICAgICAgIFtuZ1N0eWxlXT1cImNvbHVtbi5zdHlsZVwiXHJcbiAgICAgICA+e3tjb2x1bW4ubGFiZWx9fTwvdGg+XHJcbiAgICAgICA8dGggKm5nSWY9XCJzaG91bGRTaG93TWVudSgpXCI+PC90aD5cclxuICAgICAgIDwvdHI+XHJcbiAgICAgPC90aGVhZD5cclxuICAgICA8dGJvZHkgY2xhc3M9J21hdC1lbGV2YXRpb24tejMnPlxyXG5cclxuICAgICAgIDx0ciBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiAqbmdGb3I9J2xldCByb3cgb2YgZGF0YScgKGNsaWNrKT0nY2xpY2tPblJvVyhyb3cpJyBbY2xhc3NdPVwiY2hlY2tib3hzW3Jvd1tjb25maWd1cmF0aW9uLnByaW1hcnlLZXldXT8nc2VsZWN0ZWQtcm93JzonJ1wiPlxyXG4gICAgICAgIDx0aCAqbmdJZj0nY29uZmlndXJhdGlvbi5zZWxlY3RhYmxlJyBzdHlsZT0nanVzdGlmeS1jb250ZW50OiBjZW50ZXI7Jz4gPG1hdC1jaGVja2JveCBjb2xvcj0ncHJpbWFyeScgWyhuZ01vZGVsKV09J2NoZWNrYm94c1tyb3dbY29uZmlndXJhdGlvbi5wcmltYXJ5S2V5XV0nIChjbGljayk9J2NsaWNrZWQoJGV2ZW50KScgKGNoYW5nZSk9J3NlbGVjdGlvbihyb3csICRldmVudCknPiA8L21hdC1jaGVja2JveD4gIDwvdGg+XHJcbiAgICAgICAgPHRoIFtjbGFzc109J2NvbHVtbi5zdHlsZT8ubW92aWwnIFtuZ1N0eWxlXT0nY29sdW1uLnN0eWxlJyBzY29wZT1cInJvd1wiICpuZ0Zvcj0nbGV0IGNvbHVtbiBvZiBjb2x1bW5zJz57eyByb3dbY29sdW1uLklEXSB9fTwvdGg+XHJcblxyXG4gICAgICAgIDx0aCAqbmdJZj1cInNob3VsZFNob3dNZW51KClcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyBvdmVyZmxvdzogdmlzaWJsZTtcIj5cclxuICAgICAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dNZW51KCRldmVudClcIlxyXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIlxyXG4gICAgICAgICAgbWF0UmlwcGxlXHJcbiAgICAgICAgICBjbGFzcz1cIm1lbnVfbW9yZV92ZXJ0XCJcclxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxyXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkV4YW1wbGUgZGVsZXRlIGljb25cIlxyXG4gICAgICAgICAgPm1vcmVfdmVydDwvbWF0LWljb24+XHJcblxyXG4gICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBidG4gb2YgYnV0dG9uc0NvbmZpZ1wiID5cclxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYnRuLmNvbmRpdGlvbigpXCIgKGNsaWNrKT1cImFjdGlvbihidG4uYWN0aW9uLCByb3cpXCIgbWF0LW1lbnUtaXRlbSBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIiA+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIHt7YnRuLmljb259fSBidG4tYWNjaW9uXCIgc3R5bGU9XCJmb250LXNpemU6MTIwJTsgbWFyZ2luLXJpZ2h0OiAxMHB4XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAge3tidG4udG9vbHRpcH19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICA8L3RyPlxyXG5cclxuXHJcbiAgICAgPC90Ym9keT5cclxuXHJcbiAgIDwvdGFibGU+XHJcblxyXG4gICA8ZGl2ICpuZ0lmPSdsZW5ndGggPT0gMCAmJiBkYXRhLmxlbmd0aCA9PSAwJyBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4O1wiPiA8c3Ryb25nPk5vIHNlIGVuY29udHLDsyBpbmZvcm1hY2nDs248L3N0cm9uZz48L2Rpdj5cclxuXHJcbiAgIDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hdG9yQWN0aXZlXCJcclxuICAgW2xlbmd0aF09XCJsZW5ndGhcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiIHNob3dGaXJzdExhc3RCdXR0b25zXHJcbiAgIChwYWdlKT1cImNoYW5nZVBhZ2UoJGV2ZW50KVwiPjwvbWF0LXBhZ2luYXRvcj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2J1dHRvbnNUYWJsZSBsZXQtZm9udFNpemU9XCJmb250U2l6ZVwiIGxldC1tYXJnaW5SaWdodD1cIm1hcmdpblJpZ2h0XCIgc3R5bGU9J2ZsZXg6MC41OyBkaXNwbGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Jz5cclxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgYnV0dG9uc0NvbmZpZ1wiPlxyXG4gICAgPGRpdiAqbmdJZj1cImJ0bi5jb25kaXRpb25TaG93SGVhZGVyKClcIiAoY2xpY2spPVwiYWN0aW9uKGJ0bi5hY3Rpb24pXCIgbWF0VG9vbHRpcD1cInt7YnRuLnRvb2x0aXB9fVwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmEge3tidG4uaWNvbn19IGJ0bi1hY2Npb25cIiBbbmdTdHlsZV09XCJ7J2ZvbnQtc2l6ZSc6IGZvbnRTaXplID8gZm9udFNpemUgOiAnMTcwJScsICdtYXJnaW4tcmlnaHQnOiBtYXJnaW5SaWdodCA/IG1hcmdpblJpZ2h0IDogJzE1cHgnfVwiPjwvaT5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuIl19