@c80/ui 1.0.44 → 1.0.45

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 (78) hide show
  1. package/c80-ui.d.ts +5 -0
  2. package/esm2022/c80-ui.js +5 -0
  3. package/esm2022/c80-ui.js.map +1 -0
  4. package/esm2022/index.js +6 -0
  5. package/esm2022/index.js.map +1 -0
  6. package/esm2022/lib/card-level/card-level.component.js +56 -0
  7. package/esm2022/lib/card-level/card-level.component.js.map +1 -0
  8. package/esm2022/lib/card-level/card-level.interface.js +2 -0
  9. package/esm2022/lib/card-level/card-level.interface.js.map +1 -0
  10. package/esm2022/lib/card-level/index.js +3 -0
  11. package/esm2022/lib/card-level/index.js.map +1 -0
  12. package/esm2022/lib/icon/icon.component.js +48 -0
  13. package/esm2022/lib/icon/icon.component.js.map +1 -0
  14. package/esm2022/lib/icon/icon.constants.js +237 -0
  15. package/esm2022/lib/icon/icon.constants.js.map +1 -0
  16. package/esm2022/lib/icon/icon.types.js +2 -0
  17. package/esm2022/lib/icon/icon.types.js.map +1 -0
  18. package/esm2022/lib/icon/icon.utils.js +4 -0
  19. package/esm2022/lib/icon/icon.utils.js.map +1 -0
  20. package/esm2022/lib/icon/index.js +4 -0
  21. package/esm2022/lib/icon/index.js.map +1 -0
  22. package/esm2022/lib/modal/index.js +3 -0
  23. package/esm2022/lib/modal/index.js.map +1 -0
  24. package/esm2022/lib/modal/modal.component.js +86 -0
  25. package/esm2022/lib/modal/modal.component.js.map +1 -0
  26. package/esm2022/lib/modal/modal.service.js +83 -0
  27. package/esm2022/lib/modal/modal.service.js.map +1 -0
  28. package/esm2022/lib/stat-card/index.js +2 -0
  29. package/esm2022/lib/stat-card/index.js.map +1 -0
  30. package/esm2022/lib/stat-card/stat-card.component.js +13 -0
  31. package/esm2022/lib/stat-card/stat-card.component.js.map +1 -0
  32. package/esm2022/lib/table/index.js +9 -0
  33. package/esm2022/lib/table/index.js.map +1 -0
  34. package/esm2022/lib/table/table-column-visibility.service.js +105 -0
  35. package/esm2022/lib/table/table-column-visibility.service.js.map +1 -0
  36. package/esm2022/lib/table/table-crud-state.service.js +115 -0
  37. package/esm2022/lib/table/table-crud-state.service.js.map +1 -0
  38. package/esm2022/lib/table/table-data-converter.service.js +145 -0
  39. package/esm2022/lib/table/table-data-converter.service.js.map +1 -0
  40. package/esm2022/lib/table/table-data-utils.service.js +193 -0
  41. package/esm2022/lib/table/table-data-utils.service.js.map +1 -0
  42. package/esm2022/lib/table/table-selection.service.js +121 -0
  43. package/esm2022/lib/table/table-selection.service.js.map +1 -0
  44. package/esm2022/lib/table/table.component.js +413 -0
  45. package/esm2022/lib/table/table.component.js.map +1 -0
  46. package/esm2022/lib/table/table.types.js +5 -0
  47. package/esm2022/lib/table/table.types.js.map +1 -0
  48. package/esm2022/lib/table/table.utils.js +107 -0
  49. package/esm2022/lib/table/table.utils.js.map +1 -0
  50. package/lib/icon/icon.component.d.ts +2 -2
  51. package/lib/modal/index.d.ts +2 -3
  52. package/lib/stat-card/stat-card.component.d.ts +2 -2
  53. package/lib/table/table.component.d.ts +10 -13
  54. package/package.json +7 -9
  55. package/esm2022/c80-ui.mjs +0 -5
  56. package/esm2022/index.mjs +0 -6
  57. package/esm2022/lib/card-level/card-level.component.mjs +0 -57
  58. package/esm2022/lib/card-level/card-level.interface.mjs +0 -2
  59. package/esm2022/lib/card-level/index.mjs +0 -3
  60. package/esm2022/lib/icon/icon.component.mjs +0 -49
  61. package/esm2022/lib/icon/icon.constants.mjs +0 -237
  62. package/esm2022/lib/icon/icon.types.mjs +0 -2
  63. package/esm2022/lib/icon/icon.utils.mjs +0 -4
  64. package/esm2022/lib/icon/index.mjs +0 -4
  65. package/esm2022/lib/modal/index.mjs +0 -3
  66. package/esm2022/lib/modal/modal.component.mjs +0 -86
  67. package/esm2022/lib/modal/modal.service.mjs +0 -83
  68. package/esm2022/lib/stat-card/index.mjs +0 -2
  69. package/esm2022/lib/stat-card/stat-card.component.mjs +0 -16
  70. package/esm2022/lib/table/index.mjs +0 -9
  71. package/esm2022/lib/table/table-column-visibility.service.mjs +0 -105
  72. package/esm2022/lib/table/table-crud-state.service.mjs +0 -115
  73. package/esm2022/lib/table/table-data-converter.service.mjs +0 -145
  74. package/esm2022/lib/table/table-data-utils.service.mjs +0 -193
  75. package/esm2022/lib/table/table-selection.service.mjs +0 -121
  76. package/esm2022/lib/table/table.component.mjs +0 -432
  77. package/esm2022/lib/table/table.types.mjs +0 -5
  78. package/esm2022/lib/table/table.utils.mjs +0 -107
@@ -1,107 +0,0 @@
1
- /**
2
- * Transform function para convertir valores string/boolean a boolean
3
- * Usado en @Input() con transform para habilitar sintaxis de atributos booleanos
4
- * @example [searchable]="true" o simplemente searchable
5
- */
6
- export function booleanAttribute(value) {
7
- return value === '' || value === true || value === 'true';
8
- }
9
- /**
10
- * Extrae mensaje de error de forma segura desde un objeto unknown
11
- * @param err - Error desconocido (puede ser Error, string, object, etc.)
12
- * @returns Mensaje de error legible
13
- */
14
- export function getErrorMessage(err) {
15
- const error = err;
16
- return error?.message || 'Error al cargar datos';
17
- }
18
- /**
19
- * Obtiene el valor de un input HTML según el tipo de columna
20
- * IMPORTANTE: Convierte el valor al tipo correcto antes de retornarlo
21
- * @param event - Evento del input
22
- * @param col - Definición de columna (opcional)
23
- * @returns Valor extraído y convertido según el tipo de columna
24
- */
25
- export function getInputValue(event, col) {
26
- if (col?.type === 'boolean') {
27
- return event.target.checked;
28
- }
29
- const target = event.target;
30
- const rawValue = target?.value;
31
- if (!col) {
32
- return rawValue;
33
- }
34
- return convertInputValueByType(rawValue, col.type);
35
- }
36
- /**
37
- * Convierte un valor de input según el tipo de columna especificado
38
- * @param rawValue - Valor crudo del input (string)
39
- * @param type - Tipo de columna
40
- * @returns Valor convertido al tipo apropiado
41
- */
42
- function convertInputValueByType(rawValue, type) {
43
- if (!type || type === 'string' || type === 'password' || type === 'date') {
44
- return rawValue;
45
- }
46
- if (type === 'integer' || type === 'number') {
47
- return convertToNumber(rawValue, type === 'integer');
48
- }
49
- if (type === 'enum') {
50
- return convertEnumValue(rawValue);
51
- }
52
- return rawValue;
53
- }
54
- /**
55
- * Convierte string a number o integer
56
- */
57
- function convertToNumber(value, isInteger) {
58
- if (value === '' || value === null || value === undefined) {
59
- return undefined;
60
- }
61
- const num = Number(value);
62
- if (Number.isNaN(num)) {
63
- return undefined;
64
- }
65
- return isInteger ? Math.floor(num) : num;
66
- }
67
- /**
68
- * Convierte valor de enum (intenta convertir a número si es posible)
69
- */
70
- function convertEnumValue(value) {
71
- const num = Number(value);
72
- return Number.isNaN(num) ? value : num;
73
- }
74
- /**
75
- * Extrae el ID de una fila para usar como trackBy en ngFor
76
- * @param index - Índice de la fila
77
- * @param row - Fila de datos
78
- * @returns ID como string o índice como fallback
79
- */
80
- export function trackById(index, row) {
81
- const id = row && typeof row === 'object' && 'id' in row
82
- ? row['id']
83
- : undefined;
84
- return typeof id === 'string' ? id : index;
85
- }
86
- /**
87
- * Verifica si una acción debe mostrarse para una fila específica
88
- * CREATE se excluye porque se maneja con el botón "+" en el header
89
- * @param action - Acción a verificar
90
- * @param row - Fila de datos
91
- * @returns true si la acción debe mostrarse
92
- */
93
- export function shouldShowAction(action, row) {
94
- if (action.name === 'create') {
95
- return false;
96
- }
97
- return !action.condition || action.condition(row);
98
- }
99
- /**
100
- * Obtiene el tooltip de una acción (usa tooltip personalizado o name por defecto)
101
- * @param action - Acción
102
- * @returns Texto del tooltip
103
- */
104
- export function getActionTooltip(action) {
105
- return action.tooltip || action.name;
106
- }
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3VpL3NyYy9saWIvdGFibGUvdGFibGUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUF1QjtJQUN0RCxPQUFPLEtBQUssS0FBSyxFQUFFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDO0FBQzVELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUFZO0lBQzFDLE1BQU0sS0FBSyxHQUFHLEdBQTJCLENBQUM7SUFDMUMsT0FBTyxLQUFLLEVBQUUsT0FBTyxJQUFJLHVCQUF1QixDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQVksRUFBRSxHQUFvQjtJQUM5RCxJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUIsT0FBUSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxPQUFPLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUE4QyxDQUFDO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUM7SUFFL0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELE9BQU8sdUJBQXVCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHVCQUF1QixDQUM5QixRQUFnQixFQUNoQixJQUFpRjtJQUVqRixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDekUsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsT0FBTyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDcEIsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYSxFQUFFLFNBQWtCO0lBQ3hELElBQUksS0FBSyxLQUFLLEVBQUUsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBYTtJQUNyQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFvQyxLQUFhLEVBQUUsR0FBTTtJQUNoRixNQUFNLEVBQUUsR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksSUFBSSxHQUFHO1FBQ3RELENBQUMsQ0FBRSxHQUErQixDQUFDLElBQUksQ0FBQztRQUN4QyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2QsT0FBTyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE1BQXlCLEVBQ3pCLEdBQU07SUFFTixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUF5QjtJQUN4RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDODBUYWJsZUNvbERlZiwgQ3VzdG9tVGFibGVBY3Rpb24gfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gZnVuY3Rpb24gcGFyYSBjb252ZXJ0aXIgdmFsb3JlcyBzdHJpbmcvYm9vbGVhbiBhIGJvb2xlYW5cbiAqIFVzYWRvIGVuIEBJbnB1dCgpIGNvbiB0cmFuc2Zvcm0gcGFyYSBoYWJpbGl0YXIgc2ludGF4aXMgZGUgYXRyaWJ1dG9zIGJvb2xlYW5vc1xuICogQGV4YW1wbGUgW3NlYXJjaGFibGVdPVwidHJ1ZVwiIG8gc2ltcGxlbWVudGUgc2VhcmNoYWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbkF0dHJpYnV0ZSh2YWx1ZTogYm9vbGVhbiB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZSc7XG59XG5cbi8qKlxuICogRXh0cmFlIG1lbnNhamUgZGUgZXJyb3IgZGUgZm9ybWEgc2VndXJhIGRlc2RlIHVuIG9iamV0byB1bmtub3duXG4gKiBAcGFyYW0gZXJyIC0gRXJyb3IgZGVzY29ub2NpZG8gKHB1ZWRlIHNlciBFcnJvciwgc3RyaW5nLCBvYmplY3QsIGV0Yy4pXG4gKiBAcmV0dXJucyBNZW5zYWplIGRlIGVycm9yIGxlZ2libGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBlcnJvciA9IGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgcmV0dXJuIGVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciBhbCBjYXJnYXIgZGF0b3MnO1xufVxuXG4vKipcbiAqIE9idGllbmUgZWwgdmFsb3IgZGUgdW4gaW5wdXQgSFRNTCBzZWfDum4gZWwgdGlwbyBkZSBjb2x1bW5hXG4gKiBJTVBPUlRBTlRFOiBDb252aWVydGUgZWwgdmFsb3IgYWwgdGlwbyBjb3JyZWN0byBhbnRlcyBkZSByZXRvcm5hcmxvXG4gKiBAcGFyYW0gZXZlbnQgLSBFdmVudG8gZGVsIGlucHV0XG4gKiBAcGFyYW0gY29sIC0gRGVmaW5pY2nDs24gZGUgY29sdW1uYSAob3BjaW9uYWwpXG4gKiBAcmV0dXJucyBWYWxvciBleHRyYcOtZG8geSBjb252ZXJ0aWRvIHNlZ8O6biBlbCB0aXBvIGRlIGNvbHVtbmFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElucHV0VmFsdWUoZXZlbnQ6IEV2ZW50LCBjb2w/OiBDODBUYWJsZUNvbERlZik6IHVua25vd24ge1xuICBpZiAoY29sPy50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudDtcbiAgY29uc3QgcmF3VmFsdWUgPSB0YXJnZXQ/LnZhbHVlO1xuXG4gIGlmICghY29sKSB7XG4gICAgcmV0dXJuIHJhd1ZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGNvbnZlcnRJbnB1dFZhbHVlQnlUeXBlKHJhd1ZhbHVlLCBjb2wudHlwZSk7XG59XG5cbi8qKlxuICogQ29udmllcnRlIHVuIHZhbG9yIGRlIGlucHV0IHNlZ8O6biBlbCB0aXBvIGRlIGNvbHVtbmEgZXNwZWNpZmljYWRvXG4gKiBAcGFyYW0gcmF3VmFsdWUgLSBWYWxvciBjcnVkbyBkZWwgaW5wdXQgKHN0cmluZylcbiAqIEBwYXJhbSB0eXBlIC0gVGlwbyBkZSBjb2x1bW5hXG4gKiBAcmV0dXJucyBWYWxvciBjb252ZXJ0aWRvIGFsIHRpcG8gYXByb3BpYWRvXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRJbnB1dFZhbHVlQnlUeXBlKFxuICByYXdWYWx1ZTogc3RyaW5nLFxuICB0eXBlPzogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdpbnRlZ2VyJyB8ICdib29sZWFuJyB8ICdwYXNzd29yZCcgfCAnZW51bScgfCAnZGF0ZSdcbik6IHVua25vd24ge1xuICBpZiAoIXR5cGUgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ3Bhc3N3b3JkJyB8fCB0eXBlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gcmF3VmFsdWU7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2ludGVnZXInIHx8IHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGNvbnZlcnRUb051bWJlcihyYXdWYWx1ZSwgdHlwZSA9PT0gJ2ludGVnZXInKTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnZW51bScpIHtcbiAgICByZXR1cm4gY29udmVydEVudW1WYWx1ZShyYXdWYWx1ZSk7XG4gIH1cblxuICByZXR1cm4gcmF3VmFsdWU7XG59XG5cbi8qKlxuICogQ29udmllcnRlIHN0cmluZyBhIG51bWJlciBvIGludGVnZXJcbiAqL1xuZnVuY3Rpb24gY29udmVydFRvTnVtYmVyKHZhbHVlOiBzdHJpbmcsIGlzSW50ZWdlcjogYm9vbGVhbik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKE51bWJlci5pc05hTihudW0pKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gaXNJbnRlZ2VyID8gTWF0aC5mbG9vcihudW0pIDogbnVtO1xufVxuXG4vKipcbiAqIENvbnZpZXJ0ZSB2YWxvciBkZSBlbnVtIChpbnRlbnRhIGNvbnZlcnRpciBhIG7Dum1lcm8gc2kgZXMgcG9zaWJsZSlcbiAqL1xuZnVuY3Rpb24gY29udmVydEVudW1WYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gdmFsdWUgOiBudW07XG59XG5cbi8qKlxuICogRXh0cmFlIGVsIElEIGRlIHVuYSBmaWxhIHBhcmEgdXNhciBjb21vIHRyYWNrQnkgZW4gbmdGb3JcbiAqIEBwYXJhbSBpbmRleCAtIMONbmRpY2UgZGUgbGEgZmlsYVxuICogQHBhcmFtIHJvdyAtIEZpbGEgZGUgZGF0b3NcbiAqIEByZXR1cm5zIElEIGNvbW8gc3RyaW5nIG8gw61uZGljZSBjb21vIGZhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFja0J5SWQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihpbmRleDogbnVtYmVyLCByb3c6IFQpOiBzdHJpbmcgfCBudW1iZXIge1xuICBjb25zdCBpZCA9IHJvdyAmJiB0eXBlb2Ygcm93ID09PSAnb2JqZWN0JyAmJiAnaWQnIGluIHJvd1xuICAgID8gKHJvdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ2lkJ11cbiAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBpZCA6IGluZGV4O1xufVxuXG4vKipcbiAqIFZlcmlmaWNhIHNpIHVuYSBhY2Npw7NuIGRlYmUgbW9zdHJhcnNlIHBhcmEgdW5hIGZpbGEgZXNwZWPDrWZpY2FcbiAqIENSRUFURSBzZSBleGNsdXllIHBvcnF1ZSBzZSBtYW5lamEgY29uIGVsIGJvdMOzbiBcIitcIiBlbiBlbCBoZWFkZXJcbiAqIEBwYXJhbSBhY3Rpb24gLSBBY2Npw7NuIGEgdmVyaWZpY2FyXG4gKiBAcGFyYW0gcm93IC0gRmlsYSBkZSBkYXRvc1xuICogQHJldHVybnMgdHJ1ZSBzaSBsYSBhY2Npw7NuIGRlYmUgbW9zdHJhcnNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTaG93QWN0aW9uPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIGFjdGlvbjogQ3VzdG9tVGFibGVBY3Rpb24sXG4gIHJvdzogVFxuKTogYm9vbGVhbiB7XG4gIGlmIChhY3Rpb24ubmFtZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuICFhY3Rpb24uY29uZGl0aW9uIHx8IGFjdGlvbi5jb25kaXRpb24ocm93KTtcbn1cblxuLyoqXG4gKiBPYnRpZW5lIGVsIHRvb2x0aXAgZGUgdW5hIGFjY2nDs24gKHVzYSB0b29sdGlwIHBlcnNvbmFsaXphZG8gbyBuYW1lIHBvciBkZWZlY3RvKVxuICogQHBhcmFtIGFjdGlvbiAtIEFjY2nDs25cbiAqIEByZXR1cm5zIFRleHRvIGRlbCB0b29sdGlwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25Ub29sdGlwKGFjdGlvbjogQ3VzdG9tVGFibGVBY3Rpb24pOiBzdHJpbmcge1xuICByZXR1cm4gYWN0aW9uLnRvb2x0aXAgfHwgYWN0aW9uLm5hbWU7XG59XG4iXX0=