coer-elements 0.0.11 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (173) hide show
  1. package/components/index.d.ts +13 -0
  2. package/components/lib/coer-button/coer-button.component.d.ts +44 -0
  3. package/components/lib/coer-checkbox/coer-checkbox.component.d.ts +28 -0
  4. package/components/lib/coer-filebox/coer-filebox.component.d.ts +33 -0
  5. package/components/lib/coer-form/coer-form.component.d.ts +33 -0
  6. package/components/lib/coer-grid/coer-grid.component.d.ts +53 -0
  7. package/components/lib/coer-grid/coer-grid.extension.d.ts +105 -0
  8. package/components/lib/coer-modal/coer-modal.component.d.ts +38 -0
  9. package/components/lib/coer-numberbox/coer-numberbox.component.d.ts +56 -0
  10. package/components/lib/coer-page-title/coer-page-title.component.d.ts +12 -0
  11. package/components/lib/coer-selectbox/coer-selectbox.component.d.ts +75 -0
  12. package/components/lib/coer-switch/coer-switch.component.d.ts +31 -0
  13. package/components/lib/coer-tab/coer-tab.component.d.ts +35 -0
  14. package/components/lib/coer-textarea/coer-textarea.component.d.ts +51 -0
  15. package/components/lib/coer-textbox/coer-textbox.component.d.ts +57 -0
  16. package/components/lib/components.module.d.ts +25 -4
  17. package/directives/index.d.ts +3 -0
  18. package/directives/lib/coer-ref.directive.d.ts +14 -0
  19. package/directives/lib/directives.module.d.ts +8 -0
  20. package/directives/lib/life-cycle.directive.d.ts +14 -0
  21. package/esm2022/components/index.mjs +14 -1
  22. package/esm2022/components/lib/coer-button/coer-button.component.mjs +133 -0
  23. package/esm2022/components/lib/coer-checkbox/coer-checkbox.component.mjs +84 -0
  24. package/esm2022/components/lib/coer-filebox/coer-filebox.component.mjs +104 -0
  25. package/esm2022/components/lib/coer-form/coer-form.component.mjs +102 -0
  26. package/esm2022/components/lib/coer-grid/coer-grid.component.mjs +515 -0
  27. package/esm2022/components/lib/coer-grid/coer-grid.extension.mjs +412 -0
  28. package/esm2022/components/lib/coer-modal/coer-modal.component.mjs +108 -0
  29. package/esm2022/components/lib/coer-numberbox/coer-numberbox.component.mjs +260 -0
  30. package/esm2022/components/lib/coer-page-title/coer-page-title.component.mjs +44 -0
  31. package/esm2022/components/lib/coer-selectbox/coer-selectbox.component.mjs +339 -0
  32. package/esm2022/components/lib/coer-switch/coer-switch.component.mjs +94 -0
  33. package/esm2022/components/lib/coer-tab/coer-tab.component.mjs +116 -0
  34. package/esm2022/components/lib/coer-textarea/coer-textarea.component.mjs +157 -0
  35. package/esm2022/components/lib/coer-textbox/coer-textbox.component.mjs +196 -0
  36. package/esm2022/components/lib/components.module.mjs +101 -59
  37. package/esm2022/directives/index.mjs +4 -0
  38. package/esm2022/directives/lib/coer-ref.directive.mjs +23 -0
  39. package/esm2022/directives/lib/directives.module.mjs +25 -0
  40. package/esm2022/directives/lib/life-cycle.directive.mjs +29 -0
  41. package/esm2022/interfaces/coer-filebox/index.mjs +3 -0
  42. package/esm2022/interfaces/coer-grid/index.mjs +21 -0
  43. package/esm2022/interfaces/index.mjs +1 -3
  44. package/esm2022/interfaces/lib/coer-filebox/file-image.interface.mjs +2 -0
  45. package/esm2022/interfaces/lib/coer-filebox/file.interface.mjs +2 -0
  46. package/esm2022/interfaces/lib/coer-grid/grid-button-by-row.interface.mjs +2 -0
  47. package/esm2022/interfaces/lib/coer-grid/grid-checkbox.interface.mjs +2 -0
  48. package/esm2022/interfaces/lib/coer-grid/grid-coer-numberbox.interface.mjs +2 -0
  49. package/esm2022/interfaces/lib/coer-grid/grid-coer-selectbox.interface.mjs +2 -0
  50. package/esm2022/interfaces/lib/coer-grid/grid-coer-switch.interface.mjs +2 -0
  51. package/esm2022/interfaces/lib/coer-grid/grid-coer-textbox.interface.mjs +2 -0
  52. package/esm2022/interfaces/lib/coer-grid/grid-column.interface.mjs +2 -0
  53. package/esm2022/interfaces/lib/coer-grid/grid-data-source.interface.mjs +2 -0
  54. package/esm2022/interfaces/lib/coer-grid/grid-header-button.interface.mjs +2 -0
  55. package/esm2022/interfaces/lib/coer-grid/grid-header-export-button.interface.mjs +2 -0
  56. package/esm2022/interfaces/lib/coer-grid/grid-header.interface.mjs +2 -0
  57. package/esm2022/interfaces/lib/coer-grid/grid-import.interface.mjs +2 -0
  58. package/esm2022/interfaces/lib/coer-grid/grid-input-checkbox.interface.mjs +2 -0
  59. package/esm2022/interfaces/lib/coer-grid/grid-input-switch-change.interface.mjs +2 -0
  60. package/esm2022/interfaces/lib/coer-grid/grid-input-textbox.interface.mjs +2 -0
  61. package/esm2022/interfaces/lib/coer-grid/grid-item.interface.mjs +2 -0
  62. package/esm2022/interfaces/lib/coer-grid/grid-keyup-enter.interface.mjs +2 -0
  63. package/esm2022/interfaces/lib/coer-grid/grid-length.interface.mjs +2 -0
  64. package/esm2022/interfaces/lib/coer-grid/grid-search.interface.mjs +2 -0
  65. package/esm2022/interfaces/lib/coer-grid/grid-sort.interface.mjs +2 -0
  66. package/esm2022/interfaces/lib/menu/menu-option-selected.interface.mjs +2 -0
  67. package/esm2022/interfaces/lib/menu/menu.interface.mjs +2 -0
  68. package/esm2022/interfaces/lib/page-title/breadcrumb.interface.mjs +2 -0
  69. package/esm2022/interfaces/lib/page-title/go-back.interface.mjs +2 -0
  70. package/esm2022/interfaces/page-title/index.mjs +3 -0
  71. package/esm2022/pipes/index.mjs +5 -0
  72. package/esm2022/pipes/lib/html.pipe.mjs +18 -0
  73. package/esm2022/pipes/lib/no-image.pipe.mjs +23 -0
  74. package/esm2022/pipes/lib/numeric-format.pipe.mjs +15 -0
  75. package/esm2022/pipes/lib/pipes.module.mjs +31 -0
  76. package/esm2022/public_api.mjs +3 -1
  77. package/esm2022/signals/lib/breakpoint.signal.mjs +2 -2
  78. package/esm2022/signals/lib/is-loading.signal.mjs +2 -2
  79. package/esm2022/signals/lib/is-modal-open.signal.mjs +2 -2
  80. package/esm2022/tools/index.mjs +3 -2
  81. package/esm2022/tools/lib/breadcrumbs.class.mjs +2 -2
  82. package/esm2022/tools/lib/date-time.class.mjs +14 -7
  83. package/esm2022/tools/lib/files.class.mjs +2 -2
  84. package/esm2022/tools/lib/menu.class.mjs +23 -0
  85. package/esm2022/tools/lib/page.class.mjs +6 -6
  86. package/esm2022/tools/lib/screen.class.mjs +9 -1
  87. package/esm2022/tools/lib/source.class.mjs +3 -3
  88. package/esm2022/tools/lib/tools.mjs +220 -0
  89. package/fesm2022/coer-elements.mjs +3254 -455
  90. package/fesm2022/coer-elements.mjs.map +1 -1
  91. package/interfaces/coer-filebox/index.d.ts +2 -0
  92. package/interfaces/coer-grid/index.d.ts +20 -0
  93. package/interfaces/index.d.ts +0 -2
  94. package/interfaces/lib/coer-filebox/file-image.interface.d.ts +14 -0
  95. package/interfaces/lib/coer-filebox/file.interface.d.ts +5 -0
  96. package/interfaces/lib/coer-grid/grid-button-by-row.interface.d.ts +6 -0
  97. package/interfaces/lib/coer-grid/grid-checkbox.interface.d.ts +5 -0
  98. package/interfaces/lib/coer-grid/grid-coer-numberbox.interface.d.ts +12 -0
  99. package/interfaces/lib/coer-grid/grid-coer-selectbox.interface.d.ts +9 -0
  100. package/interfaces/lib/coer-grid/grid-coer-switch.interface.d.ts +6 -0
  101. package/interfaces/lib/coer-grid/grid-coer-textbox.interface.d.ts +11 -0
  102. package/interfaces/lib/coer-grid/grid-column.interface.d.ts +22 -0
  103. package/interfaces/lib/coer-grid/grid-data-source.interface.d.ts +6 -0
  104. package/interfaces/lib/coer-grid/grid-header-button.interface.d.ts +8 -0
  105. package/interfaces/lib/coer-grid/grid-header-export-button.interface.d.ts +10 -0
  106. package/interfaces/lib/coer-grid/grid-header.interface.d.ts +5 -0
  107. package/interfaces/lib/coer-grid/grid-import.interface.d.ts +4 -0
  108. package/interfaces/lib/coer-grid/grid-input-checkbox.interface.d.ts +5 -0
  109. package/interfaces/lib/coer-grid/grid-input-switch-change.interface.d.ts +5 -0
  110. package/interfaces/lib/coer-grid/grid-input-textbox.interface.d.ts +5 -0
  111. package/interfaces/lib/coer-grid/grid-item.interface.d.ts +5 -0
  112. package/interfaces/lib/coer-grid/grid-keyup-enter.interface.d.ts +6 -0
  113. package/interfaces/lib/coer-grid/grid-length.interface.d.ts +5 -0
  114. package/interfaces/lib/coer-grid/grid-search.interface.d.ts +4 -0
  115. package/interfaces/lib/coer-grid/grid-sort.interface.d.ts +5 -0
  116. package/interfaces/lib/menu/menu-option-selected.interface.d.ts +9 -0
  117. package/interfaces/lib/menu/menu.interface.d.ts +6 -0
  118. package/interfaces/page-title/index.d.ts +2 -0
  119. package/package.json +1 -1
  120. package/pipes/index.d.ts +4 -0
  121. package/pipes/lib/html.pipe.d.ts +10 -0
  122. package/pipes/lib/no-image.pipe.d.ts +7 -0
  123. package/pipes/lib/numeric-format.pipe.d.ts +7 -0
  124. package/pipes/lib/pipes.module.d.ts +9 -0
  125. package/public_api.d.ts +2 -0
  126. package/signals/lib/is-loading.signal.d.ts +1 -1
  127. package/signals/lib/is-modal-open.signal.d.ts +1 -1
  128. package/src/interfaces/coer-filebox/index.ts +2 -0
  129. package/src/interfaces/coer-grid/index.ts +20 -0
  130. package/src/interfaces/index.ts +1 -3
  131. package/src/interfaces/lib/coer-filebox/file-image.interface.ts +14 -0
  132. package/src/interfaces/lib/coer-filebox/file.interface.ts +5 -0
  133. package/src/interfaces/lib/coer-grid/grid-button-by-row.interface.ts +7 -0
  134. package/src/interfaces/lib/coer-grid/grid-checkbox.interface.ts +5 -0
  135. package/src/interfaces/lib/coer-grid/grid-coer-numberbox.interface.ts +12 -0
  136. package/src/interfaces/lib/coer-grid/grid-coer-selectbox.interface.ts +9 -0
  137. package/src/interfaces/lib/coer-grid/grid-coer-switch.interface.ts +6 -0
  138. package/src/interfaces/lib/coer-grid/grid-coer-textbox.interface.ts +11 -0
  139. package/src/interfaces/lib/coer-grid/grid-column.interface.ts +23 -0
  140. package/src/interfaces/lib/coer-grid/grid-data-source.interface.ts +6 -0
  141. package/src/interfaces/lib/coer-grid/grid-header-button.interface.ts +8 -0
  142. package/src/interfaces/lib/coer-grid/grid-header-export-button.interface.ts +10 -0
  143. package/src/interfaces/lib/coer-grid/grid-header.interface.ts +5 -0
  144. package/src/interfaces/lib/coer-grid/grid-import.interface.ts +4 -0
  145. package/src/interfaces/lib/coer-grid/grid-input-checkbox.interface.ts +5 -0
  146. package/src/interfaces/lib/coer-grid/grid-input-switch-change.interface.ts +5 -0
  147. package/src/interfaces/lib/coer-grid/grid-input-textbox.interface.ts +5 -0
  148. package/src/interfaces/lib/coer-grid/grid-item.interface.ts +5 -0
  149. package/src/interfaces/lib/coer-grid/grid-keyup-enter.interface.ts +6 -0
  150. package/src/interfaces/lib/coer-grid/grid-length.interface.ts +5 -0
  151. package/src/interfaces/lib/coer-grid/grid-search.interface.ts +4 -0
  152. package/src/interfaces/lib/coer-grid/grid-sort.interface.ts +5 -0
  153. package/src/interfaces/lib/menu/menu-option-selected.interface.ts +10 -0
  154. package/src/interfaces/lib/menu/menu-selected.interface.ts +11 -0
  155. package/src/interfaces/lib/menu/menu.interface.ts +6 -0
  156. package/src/interfaces/menu/index.ts +3 -0
  157. package/src/interfaces/page-title/index.ts +2 -0
  158. package/tools/index.d.ts +2 -1
  159. package/tools/lib/breadcrumbs.class.d.ts +1 -1
  160. package/tools/lib/date-time.class.d.ts +4 -2
  161. package/tools/lib/menu.class.d.ts +8 -0
  162. package/tools/lib/page.class.d.ts +4 -3
  163. package/tools/lib/screen.class.d.ts +3 -1
  164. package/tools/lib/source.class.d.ts +1 -1
  165. package/tools/lib/{generi-tools.d.ts → tools.d.ts} +7 -5
  166. package/esm2022/interfaces/lib/breadcrumb.interface.mjs +0 -2
  167. package/esm2022/interfaces/lib/go-back.interface.mjs +0 -2
  168. package/esm2022/tools/lib/generi-tools.mjs +0 -199
  169. /package/interfaces/lib/{breadcrumb.interface.d.ts → page-title/breadcrumb.interface.d.ts} +0 -0
  170. /package/interfaces/lib/{go-back.interface.d.ts → page-title/go-back.interface.d.ts} +0 -0
  171. /package/src/interfaces/lib/{breadcrumb.interface.ts → page-title/breadcrumb.interface.ts} +0 -0
  172. /package/src/interfaces/lib/{go-back.interface.ts → page-title/go-back.interface.ts} +0 -0
  173. /package/src/styles/{coer-elements.scss → index.scss} +0 -0
@@ -0,0 +1,412 @@
1
+ import { Component, Input, computed, inject, input, output, signal, viewChild, viewChildren } from "@angular/core";
2
+ import { CoerAlert } from "../../lib/coer-alert/coer-alert.component";
3
+ import { CoerCheckbox } from "../../lib/coer-checkbox/coer-checkbox.component";
4
+ import { CoerNumberBox } from "../../lib/coer-numberbox/coer-numberbox.component";
5
+ import { CoerSelectbox } from "../../lib/coer-selectbox/coer-selectbox.component";
6
+ import { CoerTextBox } from "../../lib/coer-textbox/coer-textbox.component";
7
+ import { ControlValue } from '../../../tools/lib/control-value.class';
8
+ import { DateTime } from '../../../tools/lib/date-time.class';
9
+ import { Screen } from '../../../tools/lib/screen.class';
10
+ import { Tools } from '../../../tools/lib/tools';
11
+ import * as i0 from "@angular/core";
12
+ export class CoerGridExtension extends ControlValue {
13
+ constructor() {
14
+ super(...arguments);
15
+ //Injections
16
+ this.alert = inject(CoerAlert);
17
+ //Elements
18
+ this.inputFile = viewChild.required('inputFileRef');
19
+ this.inputSearch = viewChild.required('inputSearch');
20
+ this.coerTextboxList = viewChildren(CoerTextBox);
21
+ this.coerNumberboxList = viewChildren(CoerNumberBox);
22
+ this.coerSelectboxList = viewChildren(CoerSelectbox);
23
+ this.coerCheckboxList = viewChildren(CoerCheckbox);
24
+ //Variables
25
+ this._value = [];
26
+ this.value_signal = signal([]);
27
+ this._gridSearch = signal('');
28
+ this._isLoading = true;
29
+ this._isLoadingMessage = true;
30
+ this._id = Tools.GetGuid('coer-grid');
31
+ this._expandedGroups = [];
32
+ this._enableAnimations = false;
33
+ this._indexFocus = signal(0);
34
+ this._sort = signal({ columnName: '', direction: 'none', icon: '' });
35
+ //Generic Tools
36
+ this.GetNumericFormat = Tools.GetNumericFormat;
37
+ this.GetDateFormat = DateTime.GetDateFormat;
38
+ //Inputs
39
+ this.columns = input([]);
40
+ this.cleanColumnName = input(true);
41
+ this.addButton = { show: false };
42
+ this.exportButton = { show: false };
43
+ this.importButton = { show: false };
44
+ this.search = { show: false, ignore: false };
45
+ this.buttonByRow = {};
46
+ this.checkbox = { show: false };
47
+ this.tooltipByRow = input('');
48
+ this.isLoading = input(false);
49
+ this.isDisabled = input(false);
50
+ this.rowsByPage = input(50);
51
+ this.groupBy = input('');
52
+ this.showColumnGrouped = input(false);
53
+ this.rowsByGroup = input(50);
54
+ this.isInvisible = input(false);
55
+ this.showFooter = input(true);
56
+ this.width = input('100%');
57
+ this.MinWidth = input('250px');
58
+ this.MaxWidth = input('100%');
59
+ this.height = input('350px');
60
+ this.minHeight = input('140px');
61
+ this.maxHeight = input('100vh');
62
+ this.margin = input('auto');
63
+ this.enableSort = input(true);
64
+ this.enableRowFocus = input(true);
65
+ //Outputs
66
+ this.onClickAdd = output();
67
+ this.onClickImport = output();
68
+ this.onClickExport = output();
69
+ this.onClickRow = output();
70
+ this.onDoubleClickRow = output();
71
+ this.onClickDeleteRow = output();
72
+ this.onClickEditRow = output();
73
+ this.onClickGoRow = output();
74
+ this.onKeyupEnter = output();
75
+ this.onKeyupEnterLast = output();
76
+ this.onSwitchChange = output();
77
+ this.onTextboxChange = output();
78
+ this.onSelectboxChange = output();
79
+ this.onCheckboxChange = output();
80
+ //computed
81
+ this._isDisabled = computed(() => {
82
+ return this.isDisabled() || this.isLoading() || this.isInvisible();
83
+ });
84
+ //computed
85
+ this._isGrouped = computed(() => {
86
+ return this.groupBy().length > 0;
87
+ });
88
+ //computed
89
+ this.gridColumns = computed(() => {
90
+ const SET_COLUMNS = new Set();
91
+ //Has filter columns?
92
+ if (this.columns().length > 0) {
93
+ for (const { property } of this.columns()) {
94
+ SET_COLUMNS.add(property);
95
+ }
96
+ }
97
+ //Get all columns
98
+ else
99
+ for (const row of this.value_signal()) {
100
+ for (const property in row) {
101
+ SET_COLUMNS.add(property);
102
+ }
103
+ }
104
+ //Remove indexRow column
105
+ if (SET_COLUMNS.has('indexRow')) {
106
+ SET_COLUMNS.delete('indexRow');
107
+ }
108
+ //Remove groupBy column
109
+ if (this._isGrouped() && !this.showColumnGrouped() && SET_COLUMNS.has(this.groupBy())) {
110
+ SET_COLUMNS.delete(this.groupBy());
111
+ }
112
+ //Set index column
113
+ let indexColumn = 0;
114
+ return Array.from(SET_COLUMNS).map(property => Tools.BreakReference({
115
+ columnName: property,
116
+ indexColumn: indexColumn++,
117
+ width: this._GetColumnConfig(property)?.width || 'auto'
118
+ }));
119
+ });
120
+ //computed
121
+ this.gridDataSource = computed(() => {
122
+ let list = this.gridDataSourceFiltered();
123
+ //It's Grouped?
124
+ if (this._isGrouped()) {
125
+ //let indexRow = 0;
126
+ let indexGroup = 0;
127
+ const SET_COLUMN = new Set();
128
+ for (const row of list) {
129
+ SET_COLUMN.add(row[this.groupBy()]);
130
+ }
131
+ const DATA_SOURCE_GROPUED = [];
132
+ for (const column of SET_COLUMN) {
133
+ DATA_SOURCE_GROPUED.push({
134
+ groupBy: column,
135
+ indexGroup: indexGroup++,
136
+ length: list.filter((item) => item[this.groupBy()] == column).length,
137
+ rows: [...list]
138
+ .filter((item) => item[this.groupBy()] == column)
139
+ .splice(0, this.rowsByGroup())
140
+ //.map((item: any) => Object.assign({ indexRow: indexRow++ }, item))
141
+ });
142
+ }
143
+ //Response by group
144
+ return [...DATA_SOURCE_GROPUED].splice(0, this.rowsByPage());
145
+ }
146
+ //Response
147
+ return [{
148
+ groupBy: 'Not Grouped',
149
+ indexGroup: -1,
150
+ length: -1,
151
+ rows: [...list].splice(0, this.rowsByPage())
152
+ }];
153
+ });
154
+ //computed
155
+ this.gridDataSourceFiltered = computed(() => {
156
+ let list = [];
157
+ const dataSource = Tools.BreakReference(this.value_signal());
158
+ //Ignore Filter
159
+ if (this._gridSearch() == '' || this.search?.ignore) {
160
+ list = dataSource;
161
+ }
162
+ //Filter by search
163
+ else {
164
+ const SET_ROW = new Set();
165
+ let listFiltered = [];
166
+ for (const { columnName } of this.gridColumns()) {
167
+ listFiltered = dataSource.filter((item) => !SET_ROW.has(item['indexRow'])
168
+ && String(item[Tools.FirstCharToLower(columnName)]).trim().toUpperCase().includes(String(this._gridSearch()).trim().toUpperCase()));
169
+ for (const { indexRow } of listFiltered) {
170
+ SET_ROW.add(indexRow);
171
+ }
172
+ list = Tools.BreakReference(list.concat(listFiltered));
173
+ }
174
+ }
175
+ return Tools.BreakReference(list);
176
+ });
177
+ /** Get Column Configuration */
178
+ this._GetColumnConfig = (columnName) => {
179
+ return this.columns().find(x => x.property.replaceAll(' ', '').toUpperCase() == columnName.replaceAll(' ', '').toUpperCase());
180
+ };
181
+ /** Clean Name or get alias */
182
+ this._GetColumnName = (columnName) => {
183
+ const columnConfig = this._GetColumnConfig(columnName);
184
+ //Get Alias
185
+ if (columnConfig && columnConfig.alias && columnConfig.alias.length > 0) {
186
+ return columnConfig.alias;
187
+ }
188
+ //Clean headerName
189
+ if (this.cleanColumnName() && columnName.length > 0) {
190
+ columnName = Tools.FirstCharToLower(columnName);
191
+ const charArray = [];
192
+ for (const char of columnName) {
193
+ if (char === char.toUpperCase())
194
+ charArray.push(' ');
195
+ charArray.push(char);
196
+ }
197
+ charArray[0] = charArray[0].toUpperCase();
198
+ columnName = charArray.join('');
199
+ }
200
+ return columnName.trim();
201
+ };
202
+ /** */
203
+ this._GetShortIcon = (columnName) => {
204
+ return this._sort().columnName == columnName ? this._sort().icon : '';
205
+ };
206
+ /** */
207
+ this._GetId = (indexRow, indexColumn, suffix = '') => {
208
+ if (suffix.length > 0)
209
+ suffix = `-${suffix}`;
210
+ return `${this._id}-row${indexRow}column${indexColumn}${suffix}`;
211
+ };
212
+ /** */
213
+ this._GetCellValue = (row, columnName) => {
214
+ return row[Tools.FirstCharToLower(columnName).replaceAll(' ', '')];
215
+ };
216
+ /** */
217
+ this._GetTooltip = (prefix, row, suffix = '') => {
218
+ let column = Tools.FirstCharToLower(this.tooltipByRow()).replaceAll(' ', '');
219
+ if (suffix.length > 0) {
220
+ suffix = ` ${suffix}`;
221
+ }
222
+ return this.tooltipByRow().length > 0
223
+ ? `${prefix} ${row[column]}${suffix}`
224
+ : `${prefix}${suffix}`;
225
+ };
226
+ /** */
227
+ this._HideRow = (group) => {
228
+ return (this._isGrouped() ? !(this._expandedGroups.some(x => x == group.groupBy)) : false);
229
+ };
230
+ }
231
+ //getter
232
+ get _height() {
233
+ let height = this.height();
234
+ if (height == 'full') {
235
+ const TOOLBAR = 45;
236
+ const PAGE_HEADER = 70;
237
+ const GRID_HEADER = document.getElementById(`${this._id}-header`);
238
+ const HEADER = (GRID_HEADER && GRID_HEADER.children.length > 0) ? 50 : 0;
239
+ const MARGIN = 30;
240
+ const PADDING = 20;
241
+ const FOOTER = this.showFooter() ? 24.5 : 0;
242
+ height = (Screen.WINDOW_HEIGHT - TOOLBAR - PAGE_HEADER - MARGIN - HEADER - PADDING - FOOTER) + 'px';
243
+ }
244
+ return height;
245
+ }
246
+ //getter
247
+ get _onlyOneCheck() {
248
+ return Tools.IsNotNull(this.checkbox.onlyOneCheck) && this.checkbox.onlyOneCheck;
249
+ }
250
+ ngAfterViewInit() {
251
+ Tools.Sleep().then(() => {
252
+ this._enableAnimations = true;
253
+ this._isLoading = false;
254
+ this._isLoadingMessage = false;
255
+ });
256
+ }
257
+ //ControlValueAccessor
258
+ SetValue(value) {
259
+ let indexRow = 0;
260
+ if (!Tools.IsNotNull(value))
261
+ value = [];
262
+ const dataSource = Tools.BreakReference(value).map((item) => Object.assign({ checked: false }, { ...item }, { indexRow: indexRow++ }));
263
+ this._UpdateValue(dataSource);
264
+ this._value = dataSource;
265
+ this.value_signal.set(dataSource);
266
+ }
267
+ //ControlValueAccessor
268
+ writeValue(value) {
269
+ let indexRow = 0;
270
+ if (!Tools.IsNotNull(value))
271
+ value = [];
272
+ const dataSource = Tools.BreakReference(value).map((item) => Object.assign({ checked: false }, { ...item }, { indexRow: indexRow++ }));
273
+ this._value = dataSource;
274
+ this.value_signal.set(dataSource);
275
+ }
276
+ /** */
277
+ _IsCellType(property, data, type) {
278
+ let response = false;
279
+ const columnConfig = this._GetColumnConfig(property);
280
+ const value = data[property];
281
+ const row = Tools.BreakReference(data);
282
+ if (columnConfig) {
283
+ if (['coerTextbox', 'coerNumberbox', 'coerSelectbox', 'coerSwitch'].includes(type)) {
284
+ const inputConfig = columnConfig;
285
+ response = inputConfig.hasOwnProperty(type)
286
+ && typeof inputConfig[type] === 'function'
287
+ && inputConfig[type]({ property, row, value }).isInput;
288
+ }
289
+ else
290
+ switch (type) {
291
+ case 'number': {
292
+ if (typeof columnConfig.typeNumber === 'boolean') {
293
+ response = columnConfig.typeNumber;
294
+ }
295
+ else if (typeof columnConfig.typeNumber === 'function') {
296
+ response = (data === null) ? false : columnConfig.typeNumber({ property, row, value });
297
+ }
298
+ break;
299
+ }
300
+ case 'date': {
301
+ if (data === null)
302
+ return false;
303
+ if (typeof columnConfig.typeDate === 'boolean') {
304
+ response = columnConfig.typeDate;
305
+ }
306
+ else if (typeof columnConfig.typeDate === 'function') {
307
+ response = (data === null) ? false : columnConfig.typeDate({ property, row, value });
308
+ }
309
+ break;
310
+ }
311
+ case 'template': {
312
+ if (data === null)
313
+ return false;
314
+ response = (typeof columnConfig.template === 'string') || (typeof columnConfig.template === 'function');
315
+ break;
316
+ }
317
+ }
318
+ }
319
+ return response;
320
+ }
321
+ /** */
322
+ _IsCellColor(property, data, color) {
323
+ let response = false;
324
+ const columnConfig = this._GetColumnConfig(property);
325
+ if (columnConfig) {
326
+ if (typeof columnConfig[color] === 'boolean') {
327
+ response = columnConfig[color];
328
+ }
329
+ else if (typeof columnConfig[color] === 'function') {
330
+ response = columnConfig[color]({
331
+ property,
332
+ row: Tools.BreakReference(data),
333
+ value: data[property]
334
+ });
335
+ }
336
+ }
337
+ return response;
338
+ }
339
+ /** */
340
+ GetAttribute(property, data, attribute, type) {
341
+ const columnConfig = this._GetColumnConfig(property);
342
+ const value = Tools.IsNotNull(data) ? data[property] : null;
343
+ const row = Tools.BreakReference(data);
344
+ if (columnConfig) {
345
+ if (type === 'defaul-cell') {
346
+ switch (attribute) {
347
+ case 'textAlign': {
348
+ return columnConfig?.textAlign || 'left';
349
+ }
350
+ case 'template': {
351
+ const inputConfig = columnConfig;
352
+ if (inputConfig.hasOwnProperty(attribute)) {
353
+ if (typeof inputConfig[attribute] === 'string') {
354
+ return inputConfig[attribute];
355
+ }
356
+ else if (typeof inputConfig[attribute] === 'function') {
357
+ return inputConfig[attribute]({ property, row, value }) || '';
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ else if (['coerTextbox', 'coerNumberbox', 'coerSelectbox', 'coerSwitch'].includes(type)) {
364
+ const inputConfig = columnConfig;
365
+ if (inputConfig.hasOwnProperty(type) && typeof inputConfig[type] === 'function') {
366
+ return inputConfig[type]({ property, row, value })[attribute] || null;
367
+ }
368
+ }
369
+ }
370
+ return null;
371
+ }
372
+ /** */
373
+ ButtonByRow(property, data = null) {
374
+ let response = false;
375
+ const buttonByRow = this.buttonByRow;
376
+ const row = Tools.IsNotNull(data) ? Tools.BreakReference(data) : null;
377
+ if (buttonByRow.hasOwnProperty(property)) {
378
+ if (row === null) {
379
+ response = (typeof buttonByRow[property] === 'boolean') ? buttonByRow[property] : true;
380
+ }
381
+ else if (typeof buttonByRow[property] === 'boolean') {
382
+ response = buttonByRow[property];
383
+ }
384
+ else if (typeof buttonByRow[property] === 'function') {
385
+ response = buttonByRow[property]({ property, row, value: null });
386
+ }
387
+ }
388
+ return response ? (this._value && this._value.length > 0) : false;
389
+ }
390
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CoerGridExtension, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
391
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: CoerGridExtension, selector: "coer-grid-extension", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, cleanColumnName: { classPropertyName: "cleanColumnName", publicName: "cleanColumnName", isSignal: true, isRequired: false, transformFunction: null }, addButton: { classPropertyName: "addButton", publicName: "addButton", isSignal: false, isRequired: false, transformFunction: null }, exportButton: { classPropertyName: "exportButton", publicName: "exportButton", isSignal: false, isRequired: false, transformFunction: null }, importButton: { classPropertyName: "importButton", publicName: "importButton", isSignal: false, isRequired: false, transformFunction: null }, search: { classPropertyName: "search", publicName: "search", isSignal: false, isRequired: false, transformFunction: null }, buttonByRow: { classPropertyName: "buttonByRow", publicName: "buttonByRow", isSignal: false, isRequired: false, transformFunction: null }, checkbox: { classPropertyName: "checkbox", publicName: "checkbox", isSignal: false, isRequired: false, transformFunction: null }, tooltipByRow: { classPropertyName: "tooltipByRow", publicName: "tooltipByRow", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, isDisabled: { classPropertyName: "isDisabled", publicName: "isDisabled", isSignal: true, isRequired: false, transformFunction: null }, rowsByPage: { classPropertyName: "rowsByPage", publicName: "rowsByPage", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, showColumnGrouped: { classPropertyName: "showColumnGrouped", publicName: "showColumnGrouped", isSignal: true, isRequired: false, transformFunction: null }, rowsByGroup: { classPropertyName: "rowsByGroup", publicName: "rowsByGroup", isSignal: true, isRequired: false, transformFunction: null }, isInvisible: { classPropertyName: "isInvisible", publicName: "isInvisible", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, MinWidth: { classPropertyName: "MinWidth", publicName: "MinWidth", isSignal: true, isRequired: false, transformFunction: null }, MaxWidth: { classPropertyName: "MaxWidth", publicName: "MaxWidth", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, margin: { classPropertyName: "margin", publicName: "margin", isSignal: true, isRequired: false, transformFunction: null }, enableSort: { classPropertyName: "enableSort", publicName: "enableSort", isSignal: true, isRequired: false, transformFunction: null }, enableRowFocus: { classPropertyName: "enableRowFocus", publicName: "enableRowFocus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onClickAdd: "onClickAdd", onClickImport: "onClickImport", onClickExport: "onClickExport", onClickRow: "onClickRow", onDoubleClickRow: "onDoubleClickRow", onClickDeleteRow: "onClickDeleteRow", onClickEditRow: "onClickEditRow", onClickGoRow: "onClickGoRow", onKeyupEnter: "onKeyupEnter", onKeyupEnterLast: "onKeyupEnterLast", onSwitchChange: "onSwitchChange", onTextboxChange: "onTextboxChange", onSelectboxChange: "onSelectboxChange", onCheckboxChange: "onCheckboxChange" }, viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFileRef"], descendants: true, isSignal: true }, { propertyName: "inputSearch", first: true, predicate: ["inputSearch"], descendants: true, isSignal: true }, { propertyName: "coerTextboxList", predicate: CoerTextBox, descendants: true, isSignal: true }, { propertyName: "coerNumberboxList", predicate: CoerNumberBox, descendants: true, isSignal: true }, { propertyName: "coerSelectboxList", predicate: CoerSelectbox, descendants: true, isSignal: true }, { propertyName: "coerCheckboxList", predicate: CoerCheckbox, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
392
+ }
393
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CoerGridExtension, decorators: [{
394
+ type: Component,
395
+ args: [{
396
+ selector: 'coer-grid-extension',
397
+ template: ''
398
+ }]
399
+ }], propDecorators: { addButton: [{
400
+ type: Input
401
+ }], exportButton: [{
402
+ type: Input
403
+ }], importButton: [{
404
+ type: Input
405
+ }], search: [{
406
+ type: Input
407
+ }], buttonByRow: [{
408
+ type: Input
409
+ }], checkbox: [{
410
+ type: Input
411
+ }] } });
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29lci1ncmlkLmV4dGVuc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvZXItZWxlbWVudHMvc3JjL2NvbXBvbmVudHMvbGliL2NvZXItZ3JpZC9jb2VyLWdyaWQuZXh0ZW5zaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUksT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBTWpELE1BQU0sT0FBTyxpQkFBcUIsU0FBUSxZQUFZO0lBSnREOztRQU1JLFlBQVk7UUFDTyxVQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTdDLFVBQVU7UUFDQSxjQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBYSxjQUFjLENBQUMsQ0FBQztRQUMzRCxnQkFBVyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQWMsYUFBYSxDQUFDLENB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QUFDLEtBQUssQ0FBQztJQUN0RSxDQUFDOytHQXJkUSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2c0lBUWUsV0FBVyx1RkFDVCxhQUFhLHVGQUNiLGFBQWEsc0ZBQ2QsWUFBWSx1RkFiNUMsRUFBRTs7NEZBRUgsaUJBQWlCO2tCQUo3QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFFBQVEsRUFBRSxFQUFFO2lCQUNmOzhCQWlDWSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUdyaWRCdXR0b25CeVJvdywgSUdyaWRDb2x1bW4sIElHcmlkRGF0YVNvdXJjZSwgSUdyaWRJbXBvcnQsIElHcmlkSGVhZGVyQnV0dG9uLCBJR3JpZEhlYWRlckV4cG9ydEJ1dHRvbiwgSUdyaWRLZXl1cEVudGVyLCBJR3JpZFNlYXJjaCwgSUdyaWRJbnB1dFN3aXRjaENoYW5nZSwgSUdyaWRJbnB1dFRleHRib3gsIElHcmlkU29ydCwgSUdyaWRDaGVja2JveCwgSUdyaWRJbnB1dENoZWNrYm94LCBJR3JpZEhlYWRlciB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL2NvZXItZ3JpZFwiO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZCwgdmlld0NoaWxkcmVuIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29lckFsZXJ0IH0gZnJvbSBcIi4uLy4uL2xpYi9jb2VyLWFsZXJ0L2NvZXItYWxlcnQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvZXJDaGVja2JveCB9IGZyb20gXCIuLi8uLi9saWIvY29lci1jaGVja2JveC9jb2VyLWNoZWNrYm94LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb2VyTnVtYmVyQm94IH0gZnJvbSBcIi4uLy4uL2xpYi9jb2VyLW51bWJlcmJveC9jb2VyLW51bWJlcmJveC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ29lclNlbGVjdGJveCB9IGZyb20gXCIuLi8uLi9saWIvY29lci1zZWxlY3Rib3gvY29lci1zZWxlY3Rib3guY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvZXJUZXh0Qm94IH0gZnJvbSBcIi4uLy4uL2xpYi9jb2VyLXRleHRib3gvY29lci10ZXh0Ym94LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWUgfSBmcm9tICcuLi8uLi8uLi90b29scy9saWIvY29udHJvbC12YWx1ZS5jbGFzcyc7XHJcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvbGliL2RhdGUtdGltZS5jbGFzcyc7XHJcbmltcG9ydCB7IFNjcmVlbiB9IGZyb20gJy4uLy4uLy4uL3Rvb2xzL2xpYi9zY3JlZW4uY2xhc3MnO1xyXG5pbXBvcnQgeyBUb29scyB9IGZyb20gJy4uLy4uLy4uL3Rvb2xzL2xpYi90b29scyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY29lci1ncmlkLWV4dGVuc2lvbicsXHJcbiAgICB0ZW1wbGF0ZTogJydcclxufSlcclxuZXhwb3J0IGNsYXNzIENvZXJHcmlkRXh0ZW5zaW9uPFQ+IGV4dGVuZHMgQ29udHJvbFZhbHVlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gICAgLy9JbmplY3Rpb25zXHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxlcnQgPSBpbmplY3QoQ29lckFsZXJ0KTtcclxuXHJcbiAgICAvL0VsZW1lbnRzXHJcbiAgICBwcm90ZWN0ZWQgaW5wdXRGaWxlID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCdpbnB1dEZpbGVSZWYnKTtcclxuICAgIHByb3RlY3RlZCBpbnB1dFNlYXJjaCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxDb2VyVGV4dEJveD4oJ2lucHV0U2VhcmNoJyk7XHJcbiAgICBwcm90ZWN0ZWQgY29lclRleHRib3hMaXN0ID0gdmlld0NoaWxkcmVuKENvZXJUZXh0Qm94KTtcclxuICAgIHByb3RlY3RlZCBjb2VyTnVtYmVyYm94TGlzdCA9IHZpZXdDaGlsZHJlbihDb2VyTnVtYmVyQm94KTtcclxuICAgIHByb3RlY3RlZCBjb2VyU2VsZWN0Ym94TGlzdCA9IHZpZXdDaGlsZHJlbihDb2VyU2VsZWN0Ym94KTtcclxuICAgIHByb3RlY3RlZCBjb2VyQ2hlY2tib3hMaXN0ID0gdmlld0NoaWxkcmVuKENvZXJDaGVja2JveCk7XHJcblxyXG4gICAgLy9WYXJpYWJsZXNcclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfdmFsdWU6IFRbXSA9IFtdO1xyXG4gICAgcHJvdGVjdGVkIHZhbHVlX3NpZ25hbCA9IHNpZ25hbDxUW10+KFtdKTtcclxuICAgIHByb3RlY3RlZCBfZ3JpZFNlYXJjaCA9IHNpZ25hbDxzdHJpbmcgfCBudW1iZXI+KCcnKTtcclxuICAgIHByb3RlY3RlZCBfaXNMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByb3RlY3RlZCBfaXNMb2FkaW5nTWVzc2FnZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcm90ZWN0ZWQgX2lkOiBzdHJpbmcgPSBUb29scy5HZXRHdWlkKCdjb2VyLWdyaWQnKTtcclxuICAgIHByb3RlY3RlZCBfZXhwYW5kZWRHcm91cHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBwcm90ZWN0ZWQgX2VuYWJsZUFuaW1hdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBfaW5kZXhGb2N1cyA9IHNpZ25hbDxudW1iZXI+KDApO1xyXG4gICAgcHJvdGVjdGVkIF9zb3J0ID0gc2lnbmFsPElHcmlkU29ydD4oeyBjb2x1bW5OYW1lOiAnJywgZGlyZWN0aW9uOiAnbm9uZScsIGljb246ICcnIH0pO1xyXG5cclxuICAgIC8vR2VuZXJpYyBUb29sc1xyXG4gICAgcHJvdGVjdGVkIEdldE51bWVyaWNGb3JtYXQgPSBUb29scy5HZXROdW1lcmljRm9ybWF0O1xyXG4gICAgcHJvdGVjdGVkIEdldERhdGVGb3JtYXQgPSBEYXRlVGltZS5HZXREYXRlRm9ybWF0O1xyXG5cclxuICAgIC8vSW5wdXRzXHJcbiAgICBwdWJsaWMgY29sdW1ucyA9IGlucHV0PElHcmlkQ29sdW1uPFQ+W10+KFtdKTtcclxuICAgIHB1YmxpYyBjbGVhbkNvbHVtbk5hbWUgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcclxuICAgIEBJbnB1dCgpIGFkZEJ1dHRvbjogSUdyaWRIZWFkZXJCdXR0b24gPSB7IHNob3c6IGZhbHNlIH07XHJcbiAgICBASW5wdXQoKSBleHBvcnRCdXR0b246IElHcmlkSGVhZGVyRXhwb3J0QnV0dG9uID0geyBzaG93OiBmYWxzZSB9O1xyXG4gICAgQElucHV0KCkgaW1wb3J0QnV0dG9uOiBJR3JpZEhlYWRlckJ1dHRvbiA9IHsgc2hvdzogZmFsc2UgfTtcclxuICAgIEBJbnB1dCgpIHNlYXJjaDogSUdyaWRTZWFyY2ggPSB7IHNob3c6IGZhbHNlLCBpZ25vcmU6IGZhbHNlIH07XHJcbiAgICBASW5wdXQoKSBidXR0b25CeVJvdzogSUdyaWRCdXR0b25CeVJvdzxUPiA9IHt9O1xyXG4gICAgQElucHV0KCkgY2hlY2tib3g6IElHcmlkQ2hlY2tib3ggPSB7IHNob3c6IGZhbHNlIH07XHJcbiAgICBwdWJsaWMgdG9vbHRpcEJ5Um93ID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHVibGljIGlzRGlzYWJsZWQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwdWJsaWMgcm93c0J5UGFnZSA9IGlucHV0PG51bWJlcj4oNTApO1xyXG4gICAgcHVibGljIGdyb3VwQnkgPSBpbnB1dDxzdHJpbmc+KCcnKTtcclxuICAgIHB1YmxpYyBzaG93Q29sdW1uR3JvdXBlZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHB1YmxpYyByb3dzQnlHcm91cCA9IGlucHV0PG51bWJlcj4oNTApO1xyXG4gICAgcHVibGljIGlzSW52aXNpYmxlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHVibGljIHNob3dGb290ZXIgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcclxuICAgIHB1YmxpYyB3aWR0aCA9IGlucHV0PHN0cmluZz4oJzEwMCUnKTtcclxuICAgIHB1YmxpYyBNaW5XaWR0aCA9IGlucHV0PHN0cmluZz4oJzI1MHB4Jyk7XHJcbiAgICBwdWJsaWMgTWF4V2lkdGggPSBpbnB1dDxzdHJpbmc+KCcxMDAlJyk7XHJcbiAgICBwdWJsaWMgaGVpZ2h0ID0gaW5wdXQ8c3RyaW5nPignMzUwcHgnKTtcclxuICAgIHB1YmxpYyBtaW5IZWlnaHQgPSBpbnB1dDxzdHJpbmc+KCcxNDBweCcpO1xyXG4gICAgcHVibGljIG1heEhlaWdodCA9IGlucHV0PHN0cmluZz4oJzEwMHZoJyk7XHJcbiAgICBwdWJsaWMgbWFyZ2luID0gaW5wdXQ8c3RyaW5nPignYXV0bycpO1xyXG4gICAgcHVibGljIGVuYWJsZVNvcnQgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcclxuICAgIHB1YmxpYyBlbmFibGVSb3dGb2N1cyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xyXG5cclxuICAgIC8vT3V0cHV0c1xyXG4gICAgcHVibGljIG9uQ2xpY2tBZGQgPSBvdXRwdXQ8dm9pZD4oKTtcclxuICAgIHB1YmxpYyBvbkNsaWNrSW1wb3J0ID0gb3V0cHV0PElHcmlkSW1wb3J0PFQ+PigpO1xyXG4gICAgcHVibGljIG9uQ2xpY2tFeHBvcnQgPSBvdXRwdXQ8VFtdPigpO1xyXG4gICAgcHVibGljIG9uQ2xpY2tSb3cgPSBvdXRwdXQ8VD4oKTtcclxuICAgIHB1YmxpYyBvbkRvdWJsZUNsaWNrUm93ID0gb3V0cHV0PFQ+KCk7XHJcbiAgICBwdWJsaWMgb25DbGlja0RlbGV0ZVJvdyA9IG91dHB1dDxUPigpO1xyXG4gICAgcHVibGljIG9uQ2xpY2tFZGl0Um93ID0gb3V0cHV0PFQ+KCk7XHJcbiAgICBwdWJsaWMgb25DbGlja0dvUm93ID0gb3V0cHV0PFQ+KCk7XHJcbiAgICBwdWJsaWMgb25LZXl1cEVudGVyID0gb3V0cHV0PElHcmlkS2V5dXBFbnRlcj4oKTtcclxuICAgIHB1YmxpYyBvbktleXVwRW50ZXJMYXN0ID0gb3V0cHV0PHZvaWQ+KCk7XHJcbiAgICBwdWJsaWMgb25Td2l0Y2hDaGFuZ2UgPSBvdXRwdXQ8SUdyaWRJbnB1dFN3aXRjaENoYW5nZTxUPj4oKTtcclxuICAgIHB1YmxpYyBvblRleHRib3hDaGFuZ2UgPSBvdXRwdXQ8SUdyaWRJbnB1dFRleHRib3g8VD4+KCk7XHJcbiAgICBwdWJsaWMgb25TZWxlY3Rib3hDaGFuZ2UgPSBvdXRwdXQ8SUdyaWRJbnB1dFRleHRib3g8VD4+KCk7XHJcbiAgICBwdWJsaWMgb25DaGVja2JveENoYW5nZSA9IG91dHB1dDxJR3JpZElucHV0Q2hlY2tib3g8VD4+KCk7XHJcblxyXG4gICAgLy9jb21wdXRlZFxyXG4gICAgcHJvdGVjdGVkIF9pc0Rpc2FibGVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlzRGlzYWJsZWQoKSB8fCB0aGlzLmlzTG9hZGluZygpIHx8IHRoaXMuaXNJbnZpc2libGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vY29tcHV0ZWRcclxuICAgIHByb3RlY3RlZCBfaXNHcm91cGVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwQnkoKS5sZW5ndGggPiAwO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9nZXR0ZXJcclxuICAgIHByb3RlY3RlZCBnZXQgX2hlaWdodCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xyXG5cclxuICAgICAgICBpZiAoaGVpZ2h0ID09ICdmdWxsJykge1xyXG4gICAgICAgICAgICBjb25zdCBUT09MQkFSID0gNDU7XHJcbiAgICAgICAgICAgIGNvbnN0IFBBR0VfSEVBREVSID0gNzA7XHJcbiAgICAgICAgICAgIGNvbnN0IEdSSURfSEVBREVSID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5faWR9LWhlYWRlcmApITtcclxuICAgICAgICAgICAgY29uc3QgSEVBREVSID0gKEdSSURfSEVBREVSICYmIEdSSURfSEVBREVSLmNoaWxkcmVuLmxlbmd0aCA+IDApID8gNTAgOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBNQVJHSU4gPSAzMDtcclxuICAgICAgICAgICAgY29uc3QgUEFERElORyA9IDIwO1xyXG4gICAgICAgICAgICBjb25zdCBGT09URVIgPSB0aGlzLnNob3dGb290ZXIoKSA/IDI0LjUgOiAwO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSAoU2NyZWVuLldJTkRPV19IRUlHSFQgLSBUT09MQkFSIC0gUEFHRV9IRUFERVIgLSBNQVJHSU4gLSBIRUFERVIgLSBQQURESU5HIC0gRk9PVEVSKSArICdweCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL2dldHRlclxyXG4gICAgcHJvdGVjdGVkIGdldCBfb25seU9uZUNoZWNrKCkge1xyXG4gICAgICAgIHJldHVybiBUb29scy5Jc05vdE51bGwodGhpcy5jaGVja2JveC5vbmx5T25lQ2hlY2spICYmIHRoaXMuY2hlY2tib3gub25seU9uZUNoZWNrO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgVG9vbHMuU2xlZXAoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZW5hYmxlQW5pbWF0aW9ucyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9pc0xvYWRpbmdNZXNzYWdlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Db250cm9sVmFsdWVBY2Nlc3NvclxyXG4gICAgcHVibGljIG92ZXJyaWRlIFNldFZhbHVlKHZhbHVlOiBUW10pOiB2b2lkIHtcclxuICAgICAgICBsZXQgaW5kZXhSb3cgPSAwO1xyXG4gICAgICAgIGlmKCFUb29scy5Jc05vdE51bGwodmFsdWUpKSB2YWx1ZSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gVG9vbHMuQnJlYWtSZWZlcmVuY2UodmFsdWUpLm1hcCgoaXRlbTogYW55KSA9PlxyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHsgY2hlY2tlZDogZmFsc2UgfSwgeyAuLi5pdGVtIH0sIHsgaW5kZXhSb3c6IGluZGV4Um93KysgfSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl9VcGRhdGVWYWx1ZShkYXRhU291cmNlKTtcclxuICAgICAgICB0aGlzLl92YWx1ZSA9IGRhdGFTb3VyY2U7XHJcbiAgICAgICAgdGhpcy52YWx1ZV9zaWduYWwuc2V0KGRhdGFTb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NvbnRyb2xWYWx1ZUFjY2Vzc29yXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogVFtdKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4Um93ID0gMDtcclxuICAgICAgICBpZighVG9vbHMuSXNOb3ROdWxsKHZhbHVlKSkgdmFsdWUgPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IFRvb2xzLkJyZWFrUmVmZXJlbmNlKHZhbHVlKS5tYXAoKGl0ZW06IGFueSkgPT5cclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih7IGNoZWNrZWQ6IGZhbHNlIH0sIHsgLi4uaXRlbSB9LCB7IGluZGV4Um93OiBpbmRleFJvdysrIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBkYXRhU291cmNlO1xyXG4gICAgICAgIHRoaXMudmFsdWVfc2lnbmFsLnNldChkYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgIC8vY29tcHV0ZWRcclxuICAgICBwcm90ZWN0ZWQgZ3JpZENvbHVtbnMgPSBjb21wdXRlZDxJR3JpZEhlYWRlcltdPigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgU0VUX0NPTFVNTlMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgICAgICAgLy9IYXMgZmlsdGVyIGNvbHVtbnM/XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB7IHByb3BlcnR5IH0gb2YgdGhpcy5jb2x1bW5zKCkpIHtcclxuICAgICAgICAgICAgICAgIFNFVF9DT0xVTU5TLmFkZChwcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vR2V0IGFsbCBjb2x1bW5zXHJcbiAgICAgICAgZWxzZSBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnZhbHVlX3NpZ25hbCgpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcm93KSB7XHJcbiAgICAgICAgICAgICAgICBTRVRfQ09MVU1OUy5hZGQocHJvcGVydHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1JlbW92ZSBpbmRleFJvdyBjb2x1bW5cclxuICAgICAgICBpZiAoU0VUX0NPTFVNTlMuaGFzKCdpbmRleFJvdycpKSB7XHJcbiAgICAgICAgICAgIFNFVF9DT0xVTU5TLmRlbGV0ZSgnaW5kZXhSb3cnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIGdyb3VwQnkgY29sdW1uXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzR3JvdXBlZCgpICYmICF0aGlzLnNob3dDb2x1bW5Hcm91cGVkKCkgJiYgU0VUX0NPTFVNTlMuaGFzKHRoaXMuZ3JvdXBCeSgpKSkge1xyXG4gICAgICAgICAgICBTRVRfQ09MVU1OUy5kZWxldGUodGhpcy5ncm91cEJ5KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9TZXQgaW5kZXggY29sdW1uXHJcbiAgICAgICAgbGV0IGluZGV4Q29sdW1uID0gMDtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShTRVRfQ09MVU1OUykubWFwKHByb3BlcnR5ID0+IFRvb2xzLkJyZWFrUmVmZXJlbmNlPElHcmlkSGVhZGVyPih7XHJcbiAgICAgICAgICAgIGNvbHVtbk5hbWU6IHByb3BlcnR5LFxyXG4gICAgICAgICAgICBpbmRleENvbHVtbjogaW5kZXhDb2x1bW4rKyxcclxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuX0dldENvbHVtbkNvbmZpZyhwcm9wZXJ0eSk/LndpZHRoIHx8ICdhdXRvJ1xyXG4gICAgICAgIH0pKTtcclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvL2NvbXB1dGVkXHJcbiAgICBwcm90ZWN0ZWQgZ3JpZERhdGFTb3VyY2UgPSBjb21wdXRlZDxJR3JpZERhdGFTb3VyY2VbXT4oKCkgPT4ge1xyXG4gICAgICAgIGxldCBsaXN0ID0gdGhpcy5ncmlkRGF0YVNvdXJjZUZpbHRlcmVkKCk7XHJcblxyXG4gICAgICAgIC8vSXQncyBHcm91cGVkP1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0dyb3VwZWQoKSkge1xyXG4gICAgICAgICAgICAvL2xldCBpbmRleFJvdyA9IDA7XHJcbiAgICAgICAgICAgIGxldCBpbmRleEdyb3VwID0gMDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IFNFVF9DT0xVTU4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2YgbGlzdCBhcyBhbnkpIHtcclxuICAgICAgICAgICAgICAgIFNFVF9DT0xVTU4uYWRkKHJvd1t0aGlzLmdyb3VwQnkoKV0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBEQVRBX1NPVVJDRV9HUk9QVUVEID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIFNFVF9DT0xVTU4pIHtcclxuICAgICAgICAgICAgICAgIERBVEFfU09VUkNFX0dST1BVRUQucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBCeTogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4R3JvdXA6IGluZGV4R3JvdXArKyxcclxuICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGxpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW1bdGhpcy5ncm91cEJ5KCldID09IGNvbHVtbikubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIHJvd3M6IFsuLi5saXN0XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW1bdGhpcy5ncm91cEJ5KCldID09IGNvbHVtbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGljZSgwLCB0aGlzLnJvd3NCeUdyb3VwKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vLm1hcCgoaXRlbTogYW55KSA9PiBPYmplY3QuYXNzaWduKHsgaW5kZXhSb3c6IGluZGV4Um93KysgfSwgaXRlbSkpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9SZXNwb25zZSBieSBncm91cFxyXG4gICAgICAgICAgICByZXR1cm4gWy4uLkRBVEFfU09VUkNFX0dST1BVRURdLnNwbGljZSgwLCB0aGlzLnJvd3NCeVBhZ2UoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1Jlc3BvbnNlXHJcbiAgICAgICAgcmV0dXJuIFt7XHJcbiAgICAgICAgICAgIGdyb3VwQnk6ICdOb3QgR3JvdXBlZCcsXHJcbiAgICAgICAgICAgIGluZGV4R3JvdXA6IC0xLFxyXG4gICAgICAgICAgICBsZW5ndGg6IC0xLFxyXG4gICAgICAgICAgICByb3dzOiBbLi4ubGlzdF0uc3BsaWNlKDAsIHRoaXMucm93c0J5UGFnZSgpKVxyXG4gICAgICAgIH1dO1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8vY29tcHV0ZWRcclxuICAgIHByb3RlY3RlZCBncmlkRGF0YVNvdXJjZUZpbHRlcmVkID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XHJcbiAgICAgICAgbGV0IGxpc3Q6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gVG9vbHMuQnJlYWtSZWZlcmVuY2UodGhpcy52YWx1ZV9zaWduYWwoKSk7XHJcblxyXG4gICAgICAgIC8vSWdub3JlIEZpbHRlclxyXG4gICAgICAgIGlmICh0aGlzLl9ncmlkU2VhcmNoKCkgPT0gJycgfHwgdGhpcy5zZWFyY2g/Lmlnbm9yZSkge1xyXG4gICAgICAgICAgICBsaXN0ID0gZGF0YVNvdXJjZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vRmlsdGVyIGJ5IHNlYXJjaFxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBTRVRfUk9XID0gbmV3IFNldDxudW1iZXI+KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGlzdEZpbHRlcmVkOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IoY29uc3QgeyBjb2x1bW5OYW1lIH0gb2YgdGhpcy5ncmlkQ29sdW1ucygpKSB7XHJcbiAgICAgICAgICAgICAgICBsaXN0RmlsdGVyZWQgPSBkYXRhU291cmNlLmZpbHRlcigoaXRlbTogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICFTRVRfUk9XLmhhcyhpdGVtWydpbmRleFJvdyddKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIFN0cmluZyhpdGVtW1Rvb2xzLkZpcnN0Q2hhclRvTG93ZXIoY29sdW1uTmFtZSldKS50cmltKCkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhTdHJpbmcodGhpcy5fZ3JpZFNlYXJjaCgpKS50cmltKCkudG9VcHBlckNhc2UoKSlcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IHsgaW5kZXhSb3cgfSBvZiBsaXN0RmlsdGVyZWQgYXMgYW55KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgU0VUX1JPVy5hZGQoaW5kZXhSb3cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxpc3QgPSBUb29scy5CcmVha1JlZmVyZW5jZShsaXN0LmNvbmNhdChsaXN0RmlsdGVyZWQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFRvb2xzLkJyZWFrUmVmZXJlbmNlKGxpc3QpO1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIC8qKiBHZXQgQ29sdW1uIENvbmZpZ3VyYXRpb24gKi9cclxuICAgIHByb3RlY3RlZCBfR2V0Q29sdW1uQ29uZmlnID0gKGNvbHVtbk5hbWU6IHN0cmluZyk6IElHcmlkQ29sdW1uPFQ+IHwgdW5kZWZpbmVkID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zKCkuZmluZCh4ID0+IHgucHJvcGVydHkucmVwbGFjZUFsbCgnICcsICcnKS50b1VwcGVyQ2FzZSgpID09IGNvbHVtbk5hbWUucmVwbGFjZUFsbCgnICcsICcnKS50b1VwcGVyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIENsZWFuIE5hbWUgb3IgZ2V0IGFsaWFzICovXHJcbiAgICBwcm90ZWN0ZWQgX0dldENvbHVtbk5hbWUgPSAoY29sdW1uTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgICAgICBjb25zdCBjb2x1bW5Db25maWcgPSB0aGlzLl9HZXRDb2x1bW5Db25maWcoY29sdW1uTmFtZSk7XHJcblxyXG4gICAgICAgIC8vR2V0IEFsaWFzXHJcbiAgICAgICAgaWYgKGNvbHVtbkNvbmZpZyAmJiBjb2x1bW5Db25maWcuYWxpYXMgJiYgY29sdW1uQ29uZmlnLmFsaWFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbkNvbmZpZy5hbGlhcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vQ2xlYW4gaGVhZGVyTmFtZVxyXG4gICAgICAgIGlmICh0aGlzLmNsZWFuQ29sdW1uTmFtZSgpICYmIGNvbHVtbk5hbWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb2x1bW5OYW1lID0gVG9vbHMuRmlyc3RDaGFyVG9Mb3dlcihjb2x1bW5OYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IoY29uc3QgY2hhciBvZiBjb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpZihjaGFyID09PSBjaGFyLnRvVXBwZXJDYXNlKCkpIGNoYXJBcnJheS5wdXNoKCcgJyk7XHJcbiAgICAgICAgICAgICAgICBjaGFyQXJyYXkucHVzaChjaGFyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hhckFycmF5WzBdID0gY2hhckFycmF5WzBdLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGNvbHVtbk5hbWUgPSBjaGFyQXJyYXkuam9pbignJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29sdW1uTmFtZS50cmltKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJvdGVjdGVkIF9HZXRTaG9ydEljb24gPSAoY29sdW1uTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnQoKS5jb2x1bW5OYW1lID09IGNvbHVtbk5hbWUgPyB0aGlzLl9zb3J0KCkuaWNvbiA6ICcnO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogKi9cclxuICAgIHByb3RlY3RlZCBfR2V0SWQgPSAoaW5kZXhSb3c6IG51bWJlciwgaW5kZXhDb2x1bW46IG51bWJlciwgc3VmZml4OiBzdHJpbmcgPSAnJyk6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKHN1ZmZpeC5sZW5ndGggPiAwKSBzdWZmaXggPSBgLSR7c3VmZml4fWA7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX2lkfS1yb3cke2luZGV4Um93fWNvbHVtbiR7aW5kZXhDb2x1bW59JHtzdWZmaXh9YDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwcm90ZWN0ZWQgX0dldENlbGxWYWx1ZSA9IChyb3c6IGFueSwgY29sdW1uTmFtZTogc3RyaW5nKTogYW55ID0+IHtcclxuICAgICAgICByZXR1cm4gcm93W1Rvb2xzLkZpcnN0Q2hhclRvTG93ZXIoY29sdW1uTmFtZSkucmVwbGFjZUFsbCgnICcsICcnKV07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJvdGVjdGVkIF9HZXRUb29sdGlwID0gKHByZWZpeDogc3RyaW5nLCByb3c6IGFueSwgc3VmZml4OiBzdHJpbmcgPSAnJyk6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgbGV0IGNvbHVtbiA9IFRvb2xzLkZpcnN0Q2hhclRvTG93ZXIodGhpcy50b29sdGlwQnlSb3coKSkucmVwbGFjZUFsbCgnICcsICcnKTtcclxuXHJcbiAgICAgICAgaWYgKHN1ZmZpeC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHN1ZmZpeCA9IGAgJHtzdWZmaXh9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnRvb2x0aXBCeVJvdygpLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgPyBgJHtwcmVmaXh9ICR7cm93W2NvbHVtbl19JHtzdWZmaXh9YFxyXG4gICAgICAgICAgICA6IGAke3ByZWZpeH0ke3N1ZmZpeH1gO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogKi9cclxuICAgIHByb3RlY3RlZCBfSGlkZVJvdyA9IChncm91cDogSUdyaWREYXRhU291cmNlKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl9pc0dyb3VwZWQoKSA/ICEodGhpcy5fZXhwYW5kZWRHcm91cHMuc29tZSh4ID0+IHggPT0gZ3JvdXAuZ3JvdXBCeSkpIDogZmFsc2UpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJvdGVjdGVkIF9Jc0NlbGxUeXBlKHByb3BlcnR5OiBzdHJpbmcsIGRhdGE6IGFueSwgdHlwZTogJ251bWJlcicgfCAnZGF0ZScgfCAndGVtcGxhdGUnIHwgJ2NvZXJUZXh0Ym94JyB8ICdjb2VyTnVtYmVyYm94JyB8ICdjb2VyU2VsZWN0Ym94JyAgfCAnY29lclN3aXRjaCcpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBjb2x1bW5Db25maWcgPSB0aGlzLl9HZXRDb2x1bW5Db25maWcocHJvcGVydHkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtwcm9wZXJ0eV07XHJcbiAgICAgICAgY29uc3Qgcm93ID0gVG9vbHMuQnJlYWtSZWZlcmVuY2UoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5Db25maWcpIHtcclxuICAgICAgICAgICAgaWYgKFsnY29lclRleHRib3gnLCAnY29lck51bWJlcmJveCcsICdjb2VyU2VsZWN0Ym94JywgJ2NvZXJTd2l0Y2gnXS5pbmNsdWRlcyh0eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRDb25maWc6IGFueSA9IGNvbHVtbkNvbmZpZztcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaW5wdXRDb25maWcuaGFzT3duUHJvcGVydHkodHlwZSlcclxuICAgICAgICAgICAgICAgICAgICAmJiB0eXBlb2YgaW5wdXRDb25maWdbdHlwZV0gPT09ICdmdW5jdGlvbidcclxuICAgICAgICAgICAgICAgICAgICAmJiBpbnB1dENvbmZpZ1t0eXBlXSh7IHByb3BlcnR5LCByb3csIHZhbHVlIH0pLmlzSW5wdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsc2Ugc3dpdGNoKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbHVtbkNvbmZpZy50eXBlTnVtYmVyID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjb2x1bW5Db25maWcudHlwZU51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjb2x1bW5Db25maWcudHlwZU51bWJlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IChkYXRhID09PSBudWxsKSA/IGZhbHNlIDogY29sdW1uQ29uZmlnLnR5cGVOdW1iZXIoeyBwcm9wZXJ0eSwgcm93LCB2YWx1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW5Db25maWcudHlwZURhdGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNvbHVtbkNvbmZpZy50eXBlRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjb2x1bW5Db25maWcudHlwZURhdGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSAoZGF0YSA9PT0gbnVsbCkgPyBmYWxzZSA6IGNvbHVtbkNvbmZpZy50eXBlRGF0ZSh7IHByb3BlcnR5LCByb3csIHZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAndGVtcGxhdGUnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9ICh0eXBlb2YgY29sdW1uQ29uZmlnLnRlbXBsYXRlID09PSAnc3RyaW5nJykgfHwgKHR5cGVvZiBjb2x1bW5Db25maWcudGVtcGxhdGUgPT09ICdmdW5jdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJvdGVjdGVkIF9Jc0NlbGxDb2xvcihwcm9wZXJ0eTogc3RyaW5nLCBkYXRhOiBhbnksIGNvbG9yOiAnY29sb3JCbHVlJyB8ICdjb2xvckdyZWVuJyB8ICdjb2xvclllbGxvdycgfCAnY29sb3JSZWQnKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgY29sdW1uQ29uZmlnOiBhbnkgPSB0aGlzLl9HZXRDb2x1bW5Db25maWcocHJvcGVydHkpO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uQ29uZmlnKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29sdW1uQ29uZmlnW2NvbG9yXSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNvbHVtbkNvbmZpZ1tjb2xvcl07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjb2x1bW5Db25maWdbY29sb3JdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNvbHVtbkNvbmZpZ1tjb2xvcl0oe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgICAgIHJvdzogVG9vbHMuQnJlYWtSZWZlcmVuY2UoZGF0YSksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGFbcHJvcGVydHldXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogKi9cclxuICAgIHByb3RlY3RlZCBHZXRBdHRyaWJ1dGUocHJvcGVydHk6IHN0cmluZywgZGF0YTogYW55LCBhdHRyaWJ1dGU6IHN0cmluZywgdHlwZTogJ2NvZXJTd2l0Y2gnIHwgJ2NvZXJUZXh0Ym94JyB8ICdjb2VyTnVtYmVyYm94J3wgJ2NvZXJTZWxlY3Rib3gnIHwgJ2RlZmF1bC1jZWxsJyApOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbkNvbmZpZyA9IHRoaXMuX0dldENvbHVtbkNvbmZpZyhwcm9wZXJ0eSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBUb29scy5Jc05vdE51bGwoZGF0YSkgPyBkYXRhW3Byb3BlcnR5XSA6IG51bGw7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gVG9vbHMuQnJlYWtSZWZlcmVuY2UoZGF0YSk7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5Db25maWcpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdkZWZhdWwtY2VsbCcpIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaChhdHRyaWJ1dGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICd0ZXh0QWxpZ24nOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5Db25maWc/LnRleHRBbGlnbiB8fCAnbGVmdCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlICd0ZW1wbGF0ZSc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRDb25maWc6IGFueSA9IGNvbHVtbkNvbmZpZztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dENvbmZpZy5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgaW5wdXRDb25maWdbYXR0cmlidXRlXSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRDb25maWdbYXR0cmlidXRlXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHR5cGVvZiBpbnB1dENvbmZpZ1thdHRyaWJ1dGVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q29uZmlnW2F0dHJpYnV0ZV0oeyBwcm9wZXJ0eSwgcm93LCB2YWx1ZSB9KSB8fCAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSBpZihbJ2NvZXJUZXh0Ym94JywgJ2NvZXJOdW1iZXJib3gnLCAnY29lclNlbGVjdGJveCcsICdjb2VyU3dpdGNoJ10uaW5jbHVkZXModHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0Q29uZmlnOiBhbnkgPSBjb2x1bW5Db25maWc7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRDb25maWcuaGFzT3duUHJvcGVydHkodHlwZSkgJiYgdHlwZW9mIGlucHV0Q29uZmlnW3R5cGVdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q29uZmlnW3R5cGVdKHsgcHJvcGVydHksIHJvdywgdmFsdWUgfSlbYXR0cmlidXRlXSB8fCBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwcm90ZWN0ZWQgQnV0dG9uQnlSb3cocHJvcGVydHk6ICdzaG93RGVsZXRlQnV0dG9uJyB8ICdzaG93RWRpdEJ1dHRvbicgfCAnc2hvd0dvQnV0dG9uJywgZGF0YTogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCByZXNwb25zZSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkJ5Um93OiBhbnkgPSB0aGlzLmJ1dHRvbkJ5Um93O1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IFRvb2xzLklzTm90TnVsbChkYXRhKSA/IFRvb2xzLkJyZWFrUmVmZXJlbmNlKGRhdGEpIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGJ1dHRvbkJ5Um93Lmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICBpZiAocm93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9ICh0eXBlb2YgYnV0dG9uQnlSb3dbcHJvcGVydHldID09PSAnYm9vbGVhbicpID8gYnV0dG9uQnlSb3dbcHJvcGVydHldIDogdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGJ1dHRvbkJ5Um93W3Byb3BlcnR5XSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGJ1dHRvbkJ5Um93W3Byb3BlcnR5XTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGJ1dHRvbkJ5Um93W3Byb3BlcnR5XSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBidXR0b25CeVJvd1twcm9wZXJ0eV0oeyBwcm9wZXJ0eSwgcm93LCB2YWx1ZTogbnVsbCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlID8gKHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDApIDogZmFsc2U7XHJcbiAgICB9XHJcbn0iXX0=