@seniorsistemas/data-seniorx-core 3.0.0 → 3.1.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 (180) hide show
  1. package/core/constants/editable-overlay.const.d.ts +4 -0
  2. package/core/constants/help-popover.const.d.ts +7 -0
  3. package/core/constants/input-mask.const.d.ts +5 -0
  4. package/core/constants/navigation-button.const.d.ts +3 -0
  5. package/core/constants/object-card.const.d.ts +21 -0
  6. package/core/constants/thumbnail.const.d.ts +6 -0
  7. package/core/constants/thumbnails.const.d.ts +4 -0
  8. package/core/constants/token-list.const.d.ts +3 -0
  9. package/core/types/button.type.d.ts +1 -1
  10. package/core/types/datepicker.type.d.ts +28 -0
  11. package/core/types/dynamic-form.type.d.ts +29 -0
  12. package/core/types/editable-overlay.type.d.ts +15 -0
  13. package/core/types/help-popover.type.d.ts +2 -0
  14. package/core/types/input-mask.type.d.ts +6 -0
  15. package/core/types/lookup.type.d.ts +45 -0
  16. package/core/types/navigation-button.type.d.ts +9 -0
  17. package/core/types/row-card.type.d.ts +5 -0
  18. package/core/types/semantics.type.d.ts +1 -1
  19. package/core/types/table-options.type.d.ts +1 -0
  20. package/core/types/thumbnail.type.d.ts +1 -0
  21. package/core/types/thumbnails.type.d.ts +20 -0
  22. package/core/types/token-list.type.d.ts +6 -0
  23. package/core/utils/emoji-support.util.d.ts +12 -0
  24. package/core/utils/overlay-dismiss.util.d.ts +25 -0
  25. package/esm2022/core/config/row-card.type.config.mjs +3 -1
  26. package/esm2022/core/constants/country-phone-picker.const.mjs +6 -6
  27. package/esm2022/core/constants/editable-overlay.const.mjs +5 -0
  28. package/esm2022/core/constants/help-popover.const.mjs +7 -0
  29. package/esm2022/core/constants/input-mask.const.mjs +6 -0
  30. package/esm2022/core/constants/navigation-button.const.mjs +4 -0
  31. package/esm2022/core/constants/object-card.const.mjs +23 -0
  32. package/esm2022/core/constants/thumbnail.const.mjs +14 -0
  33. package/esm2022/core/constants/thumbnails.const.mjs +5 -0
  34. package/esm2022/core/constants/token-list.const.mjs +4 -0
  35. package/esm2022/core/types/button.type.mjs +1 -1
  36. package/esm2022/core/types/datepicker.type.mjs +2 -0
  37. package/esm2022/core/types/dynamic-form.type.mjs +2 -0
  38. package/esm2022/core/types/editable-overlay.type.mjs +2 -0
  39. package/esm2022/core/types/help-popover.type.mjs +2 -0
  40. package/esm2022/core/types/input-mask.type.mjs +2 -0
  41. package/esm2022/core/types/lookup.type.mjs +2 -0
  42. package/esm2022/core/types/navigation-button.type.mjs +2 -0
  43. package/esm2022/core/types/row-card.type.mjs +1 -1
  44. package/esm2022/core/types/semantics.type.mjs +1 -1
  45. package/esm2022/core/types/table-options.type.mjs +1 -1
  46. package/esm2022/core/types/thumbnail.type.mjs +2 -0
  47. package/esm2022/core/types/thumbnails.type.mjs +2 -0
  48. package/esm2022/core/types/token-list.type.mjs +2 -0
  49. package/esm2022/core/utils/emoji-support.util.mjs +48 -0
  50. package/esm2022/core/utils/mask.util.mjs +2 -2
  51. package/esm2022/core/utils/overlay-dismiss.util.mjs +38 -0
  52. package/esm2022/features/alert/alert.component.mjs +5 -2
  53. package/esm2022/features/autocomplete/autocomplete.component.mjs +30 -8
  54. package/esm2022/features/bignumber-input/bignumber-input.component.mjs +1 -1
  55. package/esm2022/features/button/button.component.mjs +13 -5
  56. package/esm2022/features/card-list/card/card.component.mjs +2 -2
  57. package/esm2022/features/card-list/card-list.component.mjs +2 -2
  58. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +25 -5
  59. package/esm2022/features/chips/chips.component.mjs +3 -3
  60. package/esm2022/features/code-editor/code-editor.component.mjs +12 -3
  61. package/esm2022/features/combobox/combobox.component.mjs +3 -3
  62. package/esm2022/features/confirm/confirm.component.mjs +2 -2
  63. package/esm2022/features/context-selector/context-selector.component.mjs +1 -1
  64. package/esm2022/features/country-phone-picker/country-phone-picker.component.mjs +22 -18
  65. package/esm2022/features/currency/currency.component.mjs +3 -3
  66. package/esm2022/features/datepicker/datepicker.component.mjs +814 -0
  67. package/esm2022/features/dynamic-form/dynamic-form-field.directive.mjs +178 -0
  68. package/esm2022/features/dynamic-form/dynamic-form.component.mjs +60 -0
  69. package/esm2022/features/dynamic-form/dynamic-form.registry.mjs +13 -0
  70. package/esm2022/features/editable-overlay/editable-overlay-editor.directive.mjs +31 -0
  71. package/esm2022/features/editable-overlay/editable-overlay.component.mjs +217 -0
  72. package/esm2022/features/editor/editor.component.mjs +173 -0
  73. package/esm2022/features/empty-state/empty-state.component.mjs +3 -3
  74. package/esm2022/features/fileupload/fileupload.component.mjs +3 -3
  75. package/esm2022/features/help-popover/help-popover.component.mjs +204 -0
  76. package/esm2022/features/hyperlink/hyperlink.component.mjs +3 -3
  77. package/esm2022/features/icon-picker/icon-picker.component.mjs +4 -4
  78. package/esm2022/features/image-cropper/image-cropper.component.mjs +2 -2
  79. package/esm2022/features/info-sign/info-sign.component.mjs +6 -3
  80. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
  81. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +2 -2
  82. package/esm2022/features/input-mask/input-mask.directive.mjs +510 -0
  83. package/esm2022/features/list/list.component.mjs +2 -2
  84. package/esm2022/features/localized-number-input/localized-number-input.component.mjs +3 -3
  85. package/esm2022/features/lookup/lookup.component.mjs +351 -0
  86. package/esm2022/features/modal/modal.component.mjs +6 -3
  87. package/esm2022/features/modalc/modalc.component.mjs +6 -3
  88. package/esm2022/features/navigation-button/navigation-button.component.mjs +172 -0
  89. package/esm2022/features/number-input/number-input.component.mjs +10 -4
  90. package/esm2022/features/object-card/components/object-card-field/object-card-field.component.mjs +89 -0
  91. package/esm2022/features/object-card/components/object-card-main/object-card-main.component.mjs +114 -0
  92. package/esm2022/features/object-card/object-card.component.mjs +199 -0
  93. package/esm2022/features/password-strength/password-strength.component.mjs +3 -3
  94. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +14 -4
  95. package/esm2022/features/popover/popover.component.mjs +29 -3
  96. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +13 -4
  97. package/esm2022/features/rating-scale/rating-scale.component.mjs +24 -4
  98. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +19 -4
  99. package/esm2022/features/row-card-list/row-card-list.component.mjs +12 -3
  100. package/esm2022/features/scaffold/scaffold.component.mjs +3 -3
  101. package/esm2022/features/searchbox/searchbox.component.mjs +2 -2
  102. package/esm2022/features/select-button/select-button.component.mjs +26 -4
  103. package/esm2022/features/slider/slider.component.mjs +3 -3
  104. package/esm2022/features/split-button/split-button.component.mjs +1 -1
  105. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +15 -18
  106. package/esm2022/features/spotlight/spotlight.component.mjs +2 -2
  107. package/esm2022/features/star-rating/star-rating.component.mjs +25 -4
  108. package/esm2022/features/table/components/table-cell-content.component.mjs +2 -2
  109. package/esm2022/features/table/table.component.mjs +30 -9
  110. package/esm2022/features/textarea/textarea.component.mjs +3 -3
  111. package/esm2022/features/thumbnail/thumbnail.component.mjs +86 -0
  112. package/esm2022/features/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +59 -0
  113. package/esm2022/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.mjs +25 -0
  114. package/esm2022/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.mjs +50 -0
  115. package/esm2022/features/thumbnails/thumbnails.component.mjs +76 -0
  116. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +13 -1
  117. package/esm2022/features/token-list/token-list.component.mjs +64 -0
  118. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2 -2
  119. package/esm2022/locales/en.json +409 -1
  120. package/esm2022/locales/es-CO.json +423 -2
  121. package/esm2022/locales/pt.json +1037 -630
  122. package/esm2022/providers/features.provider.mjs +20 -2
  123. package/esm2022/providers/primeng-config.provider.mjs +14 -128
  124. package/esm2022/providers/translate.provider.mjs +2 -2
  125. package/esm2022/public-api.mjs +31 -1
  126. package/features/alert/alert.component.d.ts +1 -0
  127. package/features/autocomplete/autocomplete.component.d.ts +9 -3
  128. package/features/button/button.component.d.ts +3 -1
  129. package/features/checkbox-list/checkbox-list.component.d.ts +8 -1
  130. package/features/code-editor/code-editor.component.d.ts +5 -1
  131. package/features/country-phone-picker/country-phone-picker.component.d.ts +3 -0
  132. package/features/datepicker/datepicker.component.d.ts +118 -0
  133. package/features/dynamic-form/dynamic-form-field.directive.d.ts +26 -0
  134. package/features/dynamic-form/dynamic-form.component.d.ts +15 -0
  135. package/features/dynamic-form/dynamic-form.registry.d.ts +11 -0
  136. package/features/editable-overlay/editable-overlay-editor.directive.d.ts +22 -0
  137. package/features/editable-overlay/editable-overlay.component.d.ts +60 -0
  138. package/features/editor/editor.component.d.ts +47 -0
  139. package/features/help-popover/help-popover.component.d.ts +81 -0
  140. package/features/info-sign/info-sign.component.d.ts +2 -1
  141. package/features/input-mask/input-mask.directive.d.ts +117 -0
  142. package/features/lookup/lookup.component.d.ts +104 -0
  143. package/features/modal/modal.component.d.ts +2 -1
  144. package/features/modalc/modalc.component.d.ts +2 -1
  145. package/features/navigation-button/navigation-button.component.d.ts +58 -0
  146. package/features/number-input/number-input.component.d.ts +3 -1
  147. package/features/object-card/components/object-card-field/object-card-field.component.d.ts +48 -0
  148. package/features/object-card/components/object-card-main/object-card-main.component.d.ts +57 -0
  149. package/features/object-card/object-card.component.d.ts +70 -0
  150. package/features/pin-code-field/pin-code-field.component.d.ts +6 -1
  151. package/features/popover/popover.component.d.ts +4 -1
  152. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +5 -1
  153. package/features/rating-scale/rating-scale.component.d.ts +9 -1
  154. package/features/row-card-list/row-card/row-card.component.d.ts +6 -1
  155. package/features/row-card-list/row-card-list.component.d.ts +4 -1
  156. package/features/select-button/select-button.component.d.ts +9 -1
  157. package/features/star-rating/star-rating.component.d.ts +9 -1
  158. package/features/table/table.component.d.ts +2 -1
  159. package/features/thumbnail/thumbnail.component.d.ts +48 -0
  160. package/features/thumbnails/components/thumbnail-item/thumbnail-item.component.d.ts +29 -0
  161. package/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.d.ts +13 -0
  162. package/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.d.ts +19 -0
  163. package/features/thumbnails/thumbnails.component.d.ts +46 -0
  164. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +2 -0
  165. package/features/token-list/token-list.component.d.ts +31 -0
  166. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +11288 -6613
  167. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  168. package/package.json +12 -3
  169. package/providers/primeng-config.provider.d.ts +12 -0
  170. package/public-api.d.ts +38 -0
  171. package/src/locales/en.json +409 -1
  172. package/src/locales/es-CO.json +423 -2
  173. package/src/locales/pt.json +1037 -630
  174. package/styles/sdc-global-variables.scss +38 -0
  175. package/styles.css +132 -0
  176. package/styles.scss +2 -0
  177. package/esm2022/providers/custom/button.mjs +0 -93
  178. package/esm2022/providers/custom/toast.mjs +0 -75
  179. package/providers/custom/button.d.ts +0 -16
  180. package/providers/custom/toast.d.ts +0 -14
@@ -0,0 +1,510 @@
1
+ import { Directive, ElementRef, EventEmitter, Input, Output, Renderer2, forwardRef, inject } from '@angular/core';
2
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { INPUT_MASK_DEFAULT_AUTO_CLEAR, INPUT_MASK_DEFAULT_CHARACTER_PATTERN, INPUT_MASK_DEFAULT_SLOT_CHAR, INPUT_MASK_DEFAULT_UNMASK, INPUT_MASK_NAVIGATION_KEYS } from '../../core/constants/input-mask.const';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * @description Diretiva de máscara de entrada interativa para campos de texto.
7
+ *
8
+ * Aplique `sdcInputMask` em qualquer `<input>` para aplicar uma máscara de formatação,
9
+ * guiando a entrada do usuário com um padrão definido. Implementa `ControlValueAccessor`
10
+ * e `Validator` para integração nativa com Angular Forms (`ngModel`/`formControl`).
11
+ *
12
+ * **Tokens de máscara:**
13
+ * - `9` — dígito (0-9)
14
+ * - `a` — letra (conforme `characterPattern`, padrão `[A-Za-z]`)
15
+ * - `*` — alfanumérico (letra ou dígito)
16
+ * - Qualquer outro caractere é tratado como literal (ex: `.`, `-`, `/`, `(`, `)`)
17
+ * - `?` — tudo após esse ponto na máscara passa a ser opcional
18
+ *
19
+ * @example
20
+ * ```html
21
+ * <!-- CPF -->
22
+ * <input type="text" sdcInputMask="999.999.999-99" [(ngModel)]="cpf" />
23
+ *
24
+ * <!-- CNPJ -->
25
+ * <input type="text" sdcInputMask="99.999.999/9999-99" [(ngModel)]="cnpj" />
26
+ *
27
+ * <!-- Telefone, retornando só os dígitos digitados -->
28
+ * <input type="text" sdcInputMask="(99) 99999-9999" [unmask]="true" [(ngModel)]="telefone" />
29
+ * ```
30
+ * @category Input
31
+ */
32
+ export class InputMaskDirective {
33
+ /**
34
+ * Padrão da máscara. Tokens: `9` (dígito), `a` (letra), `*` (alfanumérico).
35
+ * Demais caracteres são literais. `?` torna o restante da máscara opcional.
36
+ */
37
+ mask;
38
+ /**
39
+ * Caractere exibido nas posições ainda não preenchidas.
40
+ * @default '_'
41
+ */
42
+ slotChar = INPUT_MASK_DEFAULT_SLOT_CHAR;
43
+ /**
44
+ * Quando `true`, o modelo recebe apenas os caracteres digitados pelo usuário,
45
+ * sem os literais da máscara. Quando `false`, o modelo recebe o valor completo
46
+ * incluindo literais.
47
+ * @default false
48
+ */
49
+ unmask = INPUT_MASK_DEFAULT_UNMASK;
50
+ /**
51
+ * Expressão regular usada para validar o token `a` (letra).
52
+ * @default '[A-Za-z]'
53
+ */
54
+ characterPattern = INPUT_MASK_DEFAULT_CHARACTER_PATTERN;
55
+ /**
56
+ * Quando `true`, limpa o campo ao perder o foco se a máscara estiver incompleta.
57
+ * @default true
58
+ */
59
+ autoClear = INPUT_MASK_DEFAULT_AUTO_CLEAR;
60
+ /**
61
+ * Emitido quando todos os tokens obrigatórios da máscara estão preenchidos.
62
+ * Disparado apenas na transição de incompleto para completo (edge-triggered).
63
+ * Emite o valor atual (mascarado ou não, conforme `unmask`).
64
+ */
65
+ maskComplete = new EventEmitter();
66
+ el = inject((ElementRef));
67
+ renderer = inject(Renderer2);
68
+ tokens = [];
69
+ buffer = [];
70
+ wasComplete = false;
71
+ lastValue = null;
72
+ onChange = () => { };
73
+ onTouched = () => { };
74
+ onValidatorChange = null;
75
+ ngOnInit() {
76
+ this.buildMask();
77
+ }
78
+ ngOnChanges(changes) {
79
+ if (changes['mask'] || changes['slotChar'] || changes['characterPattern']) {
80
+ this.buildMask();
81
+ if (this.mask) {
82
+ this.writeValue(this.lastValue);
83
+ }
84
+ // Só re-notifica o Reactive Forms em mudanças de mask POSTERIORES à primeira (ex.: o
85
+ // consumidor troca a máscara em runtime). Na primeira ligação, chamar isso de forma
86
+ // síncrona dispara um `updateValueAndValidity()` no meio do mesmo ciclo de criação em que
87
+ // o template já leu `control.invalid` — é exatamente esse `.invalid` mudando dentro do
88
+ // mesmo pass que o Angular sinaliza como NG0100 em modo dev. `NG_VALIDATORS`/
89
+ // `FormControlName` já roda a validação inicial sozinho quando o controle é configurado;
90
+ // não precisamos forçar uma segunda rodada nesse momento.
91
+ if (!changes['mask']?.firstChange) {
92
+ this.onValidatorChange?.();
93
+ }
94
+ }
95
+ }
96
+ registerOnValidatorChange(fn) {
97
+ this.onValidatorChange = fn;
98
+ }
99
+ buildMask() {
100
+ if (!this.mask) {
101
+ this.tokens = [];
102
+ this.buffer = [];
103
+ return;
104
+ }
105
+ this.tokens = this.parseMask(this.mask);
106
+ this.resetBuffer();
107
+ }
108
+ parseMask(mask) {
109
+ const tokens = [];
110
+ let optional = false;
111
+ for (const ch of mask) {
112
+ if (ch === '?') {
113
+ optional = true;
114
+ }
115
+ else {
116
+ tokens.push(this.buildToken(ch, optional));
117
+ }
118
+ }
119
+ return tokens;
120
+ }
121
+ buildToken(ch, optional) {
122
+ switch (ch) {
123
+ case '9':
124
+ return { type: 'digit', optional };
125
+ case 'a':
126
+ return { type: 'alpha', optional };
127
+ case '*':
128
+ return { type: 'alphanumeric', optional };
129
+ default:
130
+ return { type: 'literal', char: ch, optional: false };
131
+ }
132
+ }
133
+ resetBuffer() {
134
+ this.buffer = this.tokens.map((t) => (t.type === 'literal' ? (t.char ?? '') : this.slotChar));
135
+ }
136
+ isValidChar(char, token) {
137
+ switch (token.type) {
138
+ case 'digit':
139
+ return /\d/.test(char);
140
+ case 'alpha':
141
+ return new RegExp(this.characterPattern).test(char);
142
+ case 'alphanumeric':
143
+ return /[A-Za-z0-9]/.test(char);
144
+ default:
145
+ return false;
146
+ }
147
+ }
148
+ isEditable(token) {
149
+ return token.type !== 'literal';
150
+ }
151
+ nextEditablePos(from) {
152
+ for (let i = from; i < this.tokens.length; i++) {
153
+ if (this.isEditable(this.tokens[i])) {
154
+ return i;
155
+ }
156
+ }
157
+ return this.tokens.length;
158
+ }
159
+ prevEditablePos(from) {
160
+ for (let i = from; i >= 0; i--) {
161
+ if (this.tokens[i] && this.isEditable(this.tokens[i])) {
162
+ return i;
163
+ }
164
+ }
165
+ return -1;
166
+ }
167
+ setCursor(pos) {
168
+ const safePos = Math.min(pos, this.tokens.length);
169
+ this.el.nativeElement.setSelectionRange(safePos, safePos);
170
+ }
171
+ setInputValue(value) {
172
+ this.renderer.setProperty(this.el.nativeElement, 'value', value);
173
+ }
174
+ getDisplayValue() {
175
+ return this.buffer.join('');
176
+ }
177
+ getBlurDisplayValue() {
178
+ let lastFilledIndex = -1;
179
+ for (let i = 0; i < this.buffer.length; i++) {
180
+ if (this.tokens[i] && this.tokens[i].type !== 'literal' && this.buffer[i] !== this.slotChar) {
181
+ lastFilledIndex = i;
182
+ }
183
+ }
184
+ if (lastFilledIndex === -1) {
185
+ return '';
186
+ }
187
+ return this.buffer.slice(0, lastFilledIndex + 1).join('');
188
+ }
189
+ /**
190
+ * Retorna o valor que deve ser propagado ao modelo.
191
+ * Retorna `null` quando o usuário não digitou nada.
192
+ */
193
+ getModelValue() {
194
+ const hasInput = this.buffer.some((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar);
195
+ if (!hasInput) {
196
+ return null;
197
+ }
198
+ if (this.unmask) {
199
+ return (this.buffer
200
+ .filter((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar)
201
+ .join('') || null);
202
+ }
203
+ return this.buffer.join('');
204
+ }
205
+ clearRange(startPos, endPos) {
206
+ for (let i = startPos; i < endPos; i++) {
207
+ if (this.tokens[i] && this.tokens[i].type !== 'literal') {
208
+ this.buffer[i] = this.slotChar;
209
+ }
210
+ }
211
+ this.setInputValue(this.getDisplayValue());
212
+ }
213
+ isMaskComplete() {
214
+ return this.tokens.every((token, i) => {
215
+ if (token.type === 'literal' || token.optional) {
216
+ return true;
217
+ }
218
+ return this.buffer[i] !== this.slotChar;
219
+ });
220
+ }
221
+ checkAndEmitComplete() {
222
+ const complete = this.isMaskComplete();
223
+ if (complete && !this.wasComplete) {
224
+ this.wasComplete = true;
225
+ this.maskComplete.emit(this.getModelValue() ?? '');
226
+ return;
227
+ }
228
+ if (!complete) {
229
+ this.wasComplete = false;
230
+ }
231
+ }
232
+ dispatchInputEvent() {
233
+ this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true }));
234
+ }
235
+ onKeyDown(event) {
236
+ if (!this.mask || this.shouldIgnoreKeydown(event)) {
237
+ return;
238
+ }
239
+ const key = event.key;
240
+ const input = this.el.nativeElement;
241
+ const startPos = input.selectionStart ?? 0;
242
+ const endPos = input.selectionEnd ?? 0;
243
+ if (key === 'Backspace') {
244
+ event.preventDefault();
245
+ this.handleBackspace(startPos, endPos);
246
+ return;
247
+ }
248
+ if (key === 'Delete') {
249
+ event.preventDefault();
250
+ this.handleDelete(startPos, endPos);
251
+ return;
252
+ }
253
+ // Caractere único imprimível
254
+ if (key.length === 1) {
255
+ event.preventDefault();
256
+ this.handleCharacterInput(key, startPos, endPos);
257
+ }
258
+ }
259
+ shouldIgnoreKeydown(event) {
260
+ if (this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
261
+ return true;
262
+ }
263
+ const key = event.key;
264
+ // Deixa o navegador tratar atalhos (Ctrl/Cmd), Tab e teclas de função
265
+ if (event.ctrlKey || event.metaKey || key === 'Tab' || key.startsWith('F')) {
266
+ return true;
267
+ }
268
+ // Deixa o navegador tratar navegação por setas e Home/End nativamente
269
+ return INPUT_MASK_NAVIGATION_KEYS.includes(key);
270
+ }
271
+ handleBackspace(startPos, endPos) {
272
+ if (startPos !== endPos) {
273
+ this.clearRange(startPos, endPos);
274
+ const nextPos = this.nextEditablePos(startPos);
275
+ this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
276
+ this.finishEdit();
277
+ return;
278
+ }
279
+ if (startPos > 0) {
280
+ const pos = this.prevEditablePos(startPos - 1);
281
+ if (pos >= 0) {
282
+ this.buffer[pos] = this.slotChar;
283
+ this.setInputValue(this.getDisplayValue());
284
+ this.setCursor(pos);
285
+ }
286
+ }
287
+ this.finishEdit();
288
+ }
289
+ handleDelete(startPos, endPos) {
290
+ if (startPos !== endPos) {
291
+ this.clearRange(startPos, endPos);
292
+ const nextPos = this.nextEditablePos(startPos);
293
+ this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
294
+ this.finishEdit();
295
+ return;
296
+ }
297
+ const pos = this.nextEditablePos(startPos);
298
+ if (pos < this.tokens.length) {
299
+ this.buffer[pos] = this.slotChar;
300
+ this.setInputValue(this.getDisplayValue());
301
+ this.setCursor(pos);
302
+ }
303
+ this.finishEdit();
304
+ }
305
+ handleCharacterInput(key, startPos, endPos) {
306
+ let insertPos = startPos;
307
+ // Limpa a seleção, se houver
308
+ if (startPos !== endPos) {
309
+ this.clearRange(startPos, endPos);
310
+ insertPos = startPos;
311
+ }
312
+ const pos = this.nextEditablePos(insertPos);
313
+ if (pos >= this.tokens.length) {
314
+ return;
315
+ }
316
+ const token = this.tokens[pos];
317
+ if (!this.isValidChar(key, token)) {
318
+ return;
319
+ }
320
+ this.buffer[pos] = key;
321
+ this.setInputValue(this.getDisplayValue());
322
+ const next = this.nextEditablePos(pos + 1);
323
+ this.setCursor(next <= this.tokens.length ? next : this.tokens.length);
324
+ this.finishEdit();
325
+ }
326
+ finishEdit() {
327
+ this.onChange(this.getModelValue());
328
+ this.checkAndEmitComplete();
329
+ this.dispatchInputEvent();
330
+ }
331
+ onFocus(_event) {
332
+ if (!this.mask) {
333
+ return;
334
+ }
335
+ // Sempre restaura a exibição completa da máscara no foco (slots ficam visíveis)
336
+ this.setInputValue(this.getDisplayValue());
337
+ // Move o cursor para o primeiro slot editável vazio
338
+ const firstEmpty = this.buffer.findIndex((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch === this.slotChar);
339
+ this.setCursor(firstEmpty >= 0 ? firstEmpty : this.nextEditablePos(0));
340
+ }
341
+ onBlur(_event) {
342
+ if (!this.mask) {
343
+ return;
344
+ }
345
+ this.onTouched();
346
+ if (!this.isMaskComplete()) {
347
+ if (this.autoClear) {
348
+ this.resetBuffer();
349
+ this.onChange(null);
350
+ }
351
+ this.setInputValue(this.getBlurDisplayValue());
352
+ }
353
+ }
354
+ onPaste(event) {
355
+ if (!this.mask || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
356
+ return;
357
+ }
358
+ event.preventDefault();
359
+ const pastedText = event.clipboardData?.getData('text') ?? '';
360
+ const input = this.el.nativeElement;
361
+ const startPos = input.selectionStart ?? 0;
362
+ const endPos = input.selectionEnd ?? 0;
363
+ if (startPos !== endPos) {
364
+ this.clearRange(startPos, endPos);
365
+ }
366
+ const pos = this.consumePastedText(pastedText, startPos);
367
+ this.setInputValue(this.getDisplayValue());
368
+ this.setCursor(pos <= this.tokens.length ? pos : this.tokens.length);
369
+ this.finishEdit();
370
+ }
371
+ consumePastedText(pastedText, startPos) {
372
+ let pos = this.nextEditablePos(startPos);
373
+ for (const ch of pastedText) {
374
+ if (pos >= this.tokens.length) {
375
+ break;
376
+ }
377
+ pos = this.consumePastedChar(ch, pos);
378
+ }
379
+ return pos;
380
+ }
381
+ consumePastedChar(ch, pos) {
382
+ const token = this.tokens[pos];
383
+ if (token.type === 'literal') {
384
+ // Pula o literal correspondente no texto colado; avança o slot literal de qualquer forma
385
+ const advanced = ch === token.char ? pos + 1 : pos;
386
+ return this.nextEditablePos(advanced);
387
+ }
388
+ if (this.isValidChar(ch, token)) {
389
+ this.buffer[pos] = ch;
390
+ return this.nextEditablePos(pos + 1);
391
+ }
392
+ return pos;
393
+ }
394
+ onClick() {
395
+ if (!this.mask || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
396
+ return;
397
+ }
398
+ const input = this.el.nativeElement;
399
+ const pos = input.selectionStart ?? 0;
400
+ // Se o cursor caiu em um literal, empurra para o slot editável mais próximo
401
+ if (this.tokens[pos] && this.tokens[pos].type === 'literal') {
402
+ this.setCursor(this.nextEditablePos(pos));
403
+ }
404
+ }
405
+ writeValue(value) {
406
+ this.lastValue = value;
407
+ if (!this.mask) {
408
+ return;
409
+ }
410
+ this.resetBuffer();
411
+ if (!value) {
412
+ this.setInputValue('');
413
+ return;
414
+ }
415
+ let bufferIdx = 0;
416
+ let valueIdx = 0;
417
+ while (valueIdx < value.length && bufferIdx < this.tokens.length) {
418
+ const token = this.tokens[bufferIdx];
419
+ const char = value[valueIdx];
420
+ if (token.type === 'literal') {
421
+ // Consome o literal do valor se corresponder; sempre avança o buffer
422
+ if (char === token.char) {
423
+ valueIdx++;
424
+ }
425
+ bufferIdx++;
426
+ }
427
+ else if (this.isValidChar(char, token)) {
428
+ this.buffer[bufferIdx] = char;
429
+ bufferIdx++;
430
+ valueIdx++;
431
+ }
432
+ else {
433
+ // Pula caracteres do valor que não correspondem ao slot atual
434
+ valueIdx++;
435
+ }
436
+ }
437
+ this.setInputValue(this.getDisplayValue());
438
+ }
439
+ registerOnChange(onChange) {
440
+ this.onChange = onChange;
441
+ }
442
+ registerOnTouched(onTouched) {
443
+ this.onTouched = onTouched;
444
+ }
445
+ setDisabledState(isDisabled) {
446
+ this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);
447
+ }
448
+ validate(control) {
449
+ if (!this.mask || !control.value) {
450
+ return null;
451
+ }
452
+ if (!this.isMaskComplete()) {
453
+ return { incompleteMask: { mask: this.mask } };
454
+ }
455
+ return null;
456
+ }
457
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
458
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: InputMaskDirective, isStandalone: true, selector: "input[sdcInputMask]", inputs: { mask: ["sdcInputMask", "mask"], slotChar: "slotChar", unmask: "unmask", characterPattern: "characterPattern", autoClear: "autoClear" }, outputs: { maskComplete: "maskComplete" }, host: { listeners: { "keydown": "onKeyDown($event)", "focus": "onFocus($event)", "blur": "onBlur($event)", "paste": "onPaste($event)", "click": "onClick()" } }, providers: [
459
+ {
460
+ provide: NG_VALUE_ACCESSOR,
461
+ useExisting: forwardRef(() => InputMaskDirective),
462
+ multi: true
463
+ },
464
+ {
465
+ provide: NG_VALIDATORS,
466
+ useExisting: forwardRef(() => InputMaskDirective),
467
+ multi: true
468
+ }
469
+ ], usesOnChanges: true, ngImport: i0 });
470
+ }
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, decorators: [{
472
+ type: Directive,
473
+ args: [{
474
+ selector: 'input[sdcInputMask]',
475
+ standalone: true,
476
+ host: {
477
+ '(keydown)': 'onKeyDown($event)',
478
+ '(focus)': 'onFocus($event)',
479
+ '(blur)': 'onBlur($event)',
480
+ '(paste)': 'onPaste($event)',
481
+ '(click)': 'onClick()'
482
+ },
483
+ providers: [
484
+ {
485
+ provide: NG_VALUE_ACCESSOR,
486
+ useExisting: forwardRef(() => InputMaskDirective),
487
+ multi: true
488
+ },
489
+ {
490
+ provide: NG_VALIDATORS,
491
+ useExisting: forwardRef(() => InputMaskDirective),
492
+ multi: true
493
+ }
494
+ ]
495
+ }]
496
+ }], propDecorators: { mask: [{
497
+ type: Input,
498
+ args: ['sdcInputMask']
499
+ }], slotChar: [{
500
+ type: Input
501
+ }], unmask: [{
502
+ type: Input
503
+ }], characterPattern: [{
504
+ type: Input
505
+ }], autoClear: [{
506
+ type: Input
507
+ }], maskComplete: [{
508
+ type: Output
509
+ }] } });
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2lucHV0LW1hc2svaW5wdXQtbWFzay5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBaUIsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQXlDLGFBQWEsRUFBRSxpQkFBaUIsRUFBK0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0SSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLG9DQUFvQyxFQUNwQyw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMzQixNQUFNLHVDQUF1QyxDQUFDOztBQUcvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUF3QkgsTUFBTSxPQUFPLGtCQUFrQjtJQUM3Qjs7O09BR0c7SUFDb0IsSUFBSSxDQUFxQjtJQUVoRDs7O09BR0c7SUFDTSxRQUFRLEdBQVcsNEJBQTRCLENBQUM7SUFFekQ7Ozs7O09BS0c7SUFDTSxNQUFNLEdBQVkseUJBQXlCLENBQUM7SUFFckQ7OztPQUdHO0lBQ00sZ0JBQWdCLEdBQVcsb0NBQW9DLENBQUM7SUFFekU7OztPQUdHO0lBQ00sU0FBUyxHQUFZLDZCQUE2QixDQUFDO0lBRTVEOzs7O09BSUc7SUFDTyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUVuQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBNEIsQ0FBQSxDQUFDLENBQUM7SUFDMUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV0QyxNQUFNLEdBQXFCLEVBQUUsQ0FBQztJQUM5QixNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQ3RCLFdBQVcsR0FBRyxL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ZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gIElOUFVUX01BU0tfREVGQVVMVF9BVVRPX0NMRUFSLFxuICBJTlBVVF9NQVNLX0RFRkFVTFRfQ0hBUkFDVEVSX1BBVFRFUk4sXG4gIElOUFVUX01BU0tfREVGQVVMVF9TTE9UX0NIQVIsXG4gIElOUFVUX01BU0tfREVGQVVMVF9VTk1BU0ssXG4gIElOUFVUX01BU0tfTkFWSUdBVElPTl9LRVlTXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2lucHV0LW1hc2suY29uc3QnO1xuaW1wb3J0IHR5cGUgeyBJbnB1dE1hc2tUb2tlbiB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvaW5wdXQtbWFzay50eXBlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlyZXRpdmEgZGUgbcOhc2NhcmEgZGUgZW50cmFkYSBpbnRlcmF0aXZhIHBhcmEgY2FtcG9zIGRlIHRleHRvLlxuICpcbiAqIEFwbGlxdWUgYHNkY0lucHV0TWFza2AgZW0gcXVhbHF1ZXIgYDxpbnB1dD5gIHBhcmEgYXBsaWNhciB1bWEgbcOhc2NhcmEgZGUgZm9ybWF0YcOnw6NvLFxuICogZ3VpYW5kbyBhIGVudHJhZGEgZG8gdXN1w6FyaW8gY29tIHVtIHBhZHLDo28gZGVmaW5pZG8uIEltcGxlbWVudGEgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYFxuICogZSBgVmFsaWRhdG9yYCBwYXJhIGludGVncmHDp8OjbyBuYXRpdmEgY29tIEFuZ3VsYXIgRm9ybXMgKGBuZ01vZGVsYC9gZm9ybUNvbnRyb2xgKS5cbiAqXG4gKiAqKlRva2VucyBkZSBtw6FzY2FyYToqKlxuICogLSBgOWAg4oCUIGTDrWdpdG8gKDAtOSlcbiAqIC0gYGFgIOKAlCBsZXRyYSAoY29uZm9ybWUgYGNoYXJhY3RlclBhdHRlcm5gLCBwYWRyw6NvIGBbQS1aYS16XWApXG4gKiAtIGAqYCDigJQgYWxmYW51bcOpcmljbyAobGV0cmEgb3UgZMOtZ2l0bylcbiAqIC0gUXVhbHF1ZXIgb3V0cm8gY2FyYWN0ZXJlIMOpIHRyYXRhZG8gY29tbyBsaXRlcmFsIChleDogYC5gLCBgLWAsIGAvYCwgYChgLCBgKWApXG4gKiAtIGA/YCDigJQgdHVkbyBhcMOzcyBlc3NlIHBvbnRvIG5hIG3DoXNjYXJhIHBhc3NhIGEgc2VyIG9wY2lvbmFsXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDwhLS0gQ1BGIC0tPlxuICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2RjSW5wdXRNYXNrPVwiOTk5Ljk5OS45OTktOTlcIiBbKG5nTW9kZWwpXT1cImNwZlwiIC8+XG4gKlxuICogPCEtLSBDTlBKIC0tPlxuICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc2RjSW5wdXRNYXNrPVwiOTkuOTk5Ljk5OS85OTk5LTk5XCIgWyhuZ01vZGVsKV09XCJjbnBqXCIgLz5cbiAqXG4gKiA8IS0tIFRlbGVmb25lLCByZXRvcm5hbmRvIHPDsyBvcyBkw61naXRvcyBkaWdpdGFkb3MgLS0+XG4gKiA8aW5wdXQgdHlwZT1cInRleHRcIiBzZGNJbnB1dE1hc2s9XCIoOTkpIDk5OTk5LTk5OTlcIiBbdW5tYXNrXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInRlbGVmb25lXCIgLz5cbiAqIGBgYFxuICogQGNhdGVnb3J5IElucHV0XG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2lucHV0W3NkY0lucHV0TWFza10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgJyhrZXlkb3duKSc6ICdvbktleURvd24oJGV2ZW50KScsXG4gICAgJyhmb2N1cyknOiAnb25Gb2N1cygkZXZlbnQpJyxcbiAgICAnKGJsdXIpJzogJ29uQmx1cigkZXZlbnQpJyxcbiAgICAnKHBhc3RlKSc6ICdvblBhc3RlKCRldmVudCknLFxuICAgICcoY2xpY2spJzogJ29uQ2xpY2soKSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE1hc2tEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE1hc2tEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICAvKipcbiAgICogUGFkcsOjbyBkYSBtw6FzY2FyYS4gVG9rZW5zOiBgOWAgKGTDrWdpdG8pLCBgYWAgKGxldHJhKSwgYCpgIChhbGZhbnVtw6lyaWNvKS5cbiAgICogRGVtYWlzIGNhcmFjdGVyZXMgc8OjbyBsaXRlcmFpcy4gYD9gIHRvcm5hIG8gcmVzdGFudGUgZGEgbcOhc2NhcmEgb3BjaW9uYWwuXG4gICAqL1xuICBASW5wdXQoJ3NkY0lucHV0TWFzaycpIG1hc2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ2FyYWN0ZXJlIGV4aWJpZG8gbmFzIHBvc2nDp8O1ZXMgYWluZGEgbsOjbyBwcmVlbmNoaWRhcy5cbiAgICogQGRlZmF1bHQgJ18nXG4gICAqL1xuICBASW5wdXQoKSBzbG90Q2hhcjogc3RyaW5nID0gSU5QVVRfTUFTS19ERUZBVUxUX1NMT1RfQ0hBUjtcblxuICAvKipcbiAgICogUXVhbmRvIGB0cnVlYCwgbyBtb2RlbG8gcmVjZWJlIGFwZW5hcyBvcyBjYXJhY3RlcmVzIGRpZ2l0YWRvcyBwZWxvIHVzdcOhcmlvLFxuICAgKiBzZW0gb3MgbGl0ZXJhaXMgZGEgbcOhc2NhcmEuIFF1YW5kbyBgZmFsc2VgLCBvIG1vZGVsbyByZWNlYmUgbyB2YWxvciBjb21wbGV0b1xuICAgKiBpbmNsdWluZG8gbGl0ZXJhaXMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSB1bm1hc2s6IGJvb2xlYW4gPSBJTlBVVF9NQVNLX0RFRkFVTFRfVU5NQVNLO1xuXG4gIC8qKlxuICAgKiBFeHByZXNzw6NvIHJlZ3VsYXIgdXNhZGEgcGFyYSB2YWxpZGFyIG8gdG9rZW4gYGFgIChsZXRyYSkuXG4gICAqIEBkZWZhdWx0ICdbQS1aYS16XSdcbiAgICovXG4gIEBJbnB1dCgpIGNoYXJhY3RlclBhdHRlcm46IHN0cmluZyA9IElOUFVUX01BU0tfREVGQVVMVF9DSEFSQUNURVJfUEFUVEVSTjtcblxuICAvKipcbiAgICogUXVhbmRvIGB0cnVlYCwgbGltcGEgbyBjYW1wbyBhbyBwZXJkZXIgbyBmb2NvIHNlIGEgbcOhc2NhcmEgZXN0aXZlciBpbmNvbXBsZXRhLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBhdXRvQ2xlYXI6IGJvb2xlYW4gPSBJTlBVVF9NQVNLX0RFRkFVTFRfQVVUT19DTEVBUjtcblxuICAvKipcbiAgICogRW1pdGlkbyBxdWFuZG8gdG9kb3Mgb3MgdG9rZW5zIG9icmlnYXTDs3Jpb3MgZGEgbcOhc2NhcmEgZXN0w6NvIHByZWVuY2hpZG9zLlxuICAgKiBEaXNwYXJhZG8gYXBlbmFzIG5hIHRyYW5zacOnw6NvIGRlIGluY29tcGxldG8gcGFyYSBjb21wbGV0byAoZWRnZS10cmlnZ2VyZWQpLlxuICAgKiBFbWl0ZSBvIHZhbG9yIGF0dWFsIChtYXNjYXJhZG8gb3UgbsOjbywgY29uZm9ybWUgYHVubWFza2ApLlxuICAgKi9cbiAgQE91dHB1dCgpIG1hc2tDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICBwcml2YXRlIHRva2VuczogSW5wdXRNYXNrVG9rZW5bXSA9IFtdO1xuICBwcml2YXRlIGJ1ZmZlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSB3YXNDb21wbGV0ZSA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2U6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkTWFzaygpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbWFzayddIHx8IGNoYW5nZXNbJ3Nsb3RDaGFyJ10gfHwgY2hhbmdlc1snY2hhcmFjdGVyUGF0dGVybiddKSB7XG4gICAgICB0aGlzLmJ1aWxkTWFzaygpO1xuICAgICAgaWYgKHRoaXMubWFzaykge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5sYXN0VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTw7MgcmUtbm90aWZpY2EgbyBSZWFjdGl2ZSBGb3JtcyBlbSBtdWRhbsOnYXMgZGUgbWFzayBQT1NURVJJT1JFUyDDoCBwcmltZWlyYSAoZXguOiBvXG4gICAgICAvLyBjb25zdW1pZG9yIHRyb2NhIGEgbcOhc2NhcmEgZW0gcnVudGltZSkuIE5hIHByaW1laXJhIGxpZ2HDp8OjbywgY2hhbWFyIGlzc28gZGUgZm9ybWFcbiAgICAgIC8vIHPDrW5jcm9uYSBkaXNwYXJhIHVtIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgIG5vIG1laW8gZG8gbWVzbW8gY2ljbG8gZGUgY3JpYcOnw6NvIGVtIHF1ZVxuICAgICAgLy8gbyB0ZW1wbGF0ZSBqw6EgbGV1IGBjb250cm9sLmludmFsaWRgIOKAlCDDqSBleGF0YW1lbnRlIGVzc2UgYC5pbnZhbGlkYCBtdWRhbmRvIGRlbnRybyBkb1xuICAgICAgLy8gbWVzbW8gcGFzcyBxdWUgbyBBbmd1bGFyIHNpbmFsaXphIGNvbW8gTkcwMTAwIGVtIG1vZG8gZGV2LiBgTkdfVkFMSURBVE9SU2AvXG4gICAgICAvLyBgRm9ybUNvbnRyb2xOYW1lYCBqw6Egcm9kYSBhIHZhbGlkYcOnw6NvIGluaWNpYWwgc296aW5obyBxdWFuZG8gbyBjb250cm9sZSDDqSBjb25maWd1cmFkbztcbiAgICAgIC8vIG7Do28gcHJlY2lzYW1vcyBmb3LDp2FyIHVtYSBzZWd1bmRhIHJvZGFkYSBuZXNzZSBtb21lbnRvLlxuICAgICAgaWYgKCFjaGFuZ2VzWydtYXNrJ10/LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2U/LigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE1hc2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2spIHtcbiAgICAgIHRoaXMudG9rZW5zID0gW107XG4gICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRva2VucyA9IHRoaXMucGFyc2VNYXNrKHRoaXMubWFzayk7XG4gICAgdGhpcy5yZXNldEJ1ZmZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZU1hc2sobWFzazogc3RyaW5nKTogSW5wdXRNYXNrVG9rZW5bXSB7XG4gICAgY29uc3QgdG9rZW5zOiBJbnB1dE1hc2tUb2tlbltdID0gW107XG4gICAgbGV0IG9wdGlvbmFsID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGNoIG9mIG1hc2spIHtcbiAgICAgIGlmIChjaCA9PT0gJz8nKSB7XG4gICAgICAgIG9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHRoaXMuYnVpbGRUb2tlbihjaCwgb3B0aW9uYWwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRva2VuKGNoOiBzdHJpbmcsIG9wdGlvbmFsOiBib29sZWFuKTogSW5wdXRNYXNrVG9rZW4ge1xuICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgIGNhc2UgJzknOlxuICAgICAgICByZXR1cm4geyB0eXBlOiAnZGlnaXQnLCBvcHRpb25hbCB9O1xuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdhbHBoYScsIG9wdGlvbmFsIH07XG4gICAgICBjYXNlICcqJzpcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2FscGhhbnVtZXJpYycsIG9wdGlvbmFsIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geyB0eXBlOiAnbGl0ZXJhbCcsIGNoYXI6IGNoLCBvcHRpb25hbDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QnVmZmVyKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdGhpcy50b2tlbnMubWFwKCh0KSA9PiAodC50eXBlID09PSAnbGl0ZXJhbCcgPyAodC5jaGFyID8/ICcnKSA6IHRoaXMuc2xvdENoYXIpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZENoYXIoY2hhcjogc3RyaW5nLCB0b2tlbjogSW5wdXRNYXNrVG9rZW4pOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RpZ2l0JzpcbiAgICAgICAgcmV0dXJuIC9cXGQvLnRlc3QoY2hhcik7XG4gICAgICBjYXNlICdhbHBoYSc6XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMuY2hhcmFjdGVyUGF0dGVybikudGVzdChjaGFyKTtcbiAgICAgIGNhc2UgJ2FscGhhbnVtZXJpYyc6XG4gICAgICAgIHJldHVybiAvW0EtWmEtejAtOV0vLnRlc3QoY2hhcik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0VkaXRhYmxlKHRva2VuOiBJbnB1dE1hc2tUb2tlbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0b2tlbi50eXBlICE9PSAnbGl0ZXJhbCc7XG4gIH1cblxuICBwcml2YXRlIG5leHRFZGl0YWJsZVBvcyhmcm9tOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdGhpcy50b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmlzRWRpdGFibGUodGhpcy50b2tlbnNbaV0pKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmV2RWRpdGFibGVQb3MoZnJvbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0aGlzLnRva2Vuc1tpXSAmJiB0aGlzLmlzRWRpdGFibGUodGhpcy50b2tlbnNbaV0pKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwcml2YXRlIHNldEN1cnNvcihwb3M6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNhZmVQb3MgPSBNYXRoLm1pbihwb3MsIHRoaXMudG9rZW5zLmxlbmd0aCk7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNhZmVQb3MsIHNhZmVQb3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEJsdXJEaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICBsZXQgbGFzdEZpbGxlZEluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJyAmJiB0aGlzLmJ1ZmZlcltpXSAhPT0gdGhpcy5zbG90Q2hhcikge1xuICAgICAgICBsYXN0RmlsbGVkSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFzdEZpbGxlZEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UoMCwgbGFzdEZpbGxlZEluZGV4ICsgMSkuam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSBvIHZhbG9yIHF1ZSBkZXZlIHNlciBwcm9wYWdhZG8gYW8gbW9kZWxvLlxuICAgKiBSZXRvcm5hIGBudWxsYCBxdWFuZG8gbyB1c3XDoXJpbyBuw6NvIGRpZ2l0b3UgbmFkYS5cbiAgICovXG4gIHByaXZhdGUgZ2V0TW9kZWxWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBoYXNJbnB1dCA9IHRoaXMuYnVmZmVyLnNvbWUoXG4gICAgICAoY2gsIGkpID0+IHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJyAmJiBjaCAhPT0gdGhpcy5zbG90Q2hhclxuICAgICk7XG5cbiAgICBpZiAoIWhhc0lucHV0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy51bm1hc2spIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuYnVmZmVyXG4gICAgICAgICAgLmZpbHRlcigoY2gsIGkpID0+IHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJyAmJiBjaCAhPT0gdGhpcy5zbG90Q2hhcilcbiAgICAgICAgICAuam9pbignJykgfHwgbnVsbFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5idWZmZXIuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmFuZ2Uoc3RhcnRQb3M6IG51bWJlciwgZW5kUG9zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRQb3M7IGkgPCBlbmRQb3M7IGkrKykge1xuICAgICAgaWYgKHRoaXMudG9rZW5zW2ldICYmIHRoaXMudG9rZW5zW2ldLnR5cGUgIT09ICdsaXRlcmFsJykge1xuICAgICAgICB0aGlzLmJ1ZmZlcltpXSA9IHRoaXMuc2xvdENoYXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNNYXNrQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmV2ZXJ5KCh0b2tlbiwgaSkgPT4ge1xuICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaXRlcmFsJyB8fCB0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2ldICE9PSB0aGlzLnNsb3RDaGFyO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FuZEVtaXRDb21wbGV0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wbGV0ZSA9IHRoaXMuaXNNYXNrQ29tcGxldGUoKTtcblxuICAgIGlmIChjb21wbGV0ZSAmJiAhdGhpcy53YXNDb21wbGV0ZSkge1xuICAgICAgdGhpcy53YXNDb21wbGV0ZSA9IHRydWU7XG4gICAgICB0aGlzLm1hc2tDb21wbGV0ZS5lbWl0KHRoaXMuZ2V0TW9kZWxWYWx1ZSgpID8/ICcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbXBsZXRlKSB7XG4gICAgICB0aGlzLndhc0NvbXBsZXRlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaElucHV0RXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gIH1cblxuICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgdGhpcy5zaG91bGRJZ25vcmVLZXlkb3duKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBzdGFydFBvcyA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG4gICAgY29uc3QgZW5kUG9zID0gaW5wdXQuc2VsZWN0aW9uRW5kID8/IDA7XG5cbiAgICBpZiAoa2V5ID09PSAnQmFja3NwYWNlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuaGFuZGxlQmFja3NwYWNlKHN0YXJ0UG9zLCBlbmRQb3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5oYW5kbGVEZWxldGUoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FyYWN0ZXJlIMO6bmljbyBpbXByaW3DrXZlbFxuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5oYW5kbGVDaGFyYWN0ZXJJbnB1dChrZXksIHN0YXJ0UG9zLCBlbmRQb3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkSWdub3JlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucmVhZE9ubHkgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICAvLyBEZWl4YSBvIG5hdmVnYWRvciB0cmF0YXIgYXRhbGhvcyAoQ3RybC9DbWQpLCBUYWIgZSB0ZWNsYXMgZGUgZnVuw6fDo29cbiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGtleSA9PT0gJ1RhYicgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRGVpeGEgbyBuYXZlZ2Fkb3IgdHJhdGFyIG5hdmVnYcOnw6NvIHBvciBzZXRhcyBlIEhvbWUvRW5kIG5hdGl2YW1lbnRlXG4gICAgcmV0dXJuIElOUFVUX01BU0tfTkFWSUdBVElPTl9LRVlTLmluY2x1ZGVzKGtleSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUJhY2tzcGFjZShzdGFydFBvczogbnVtYmVyLCBlbmRQb3M6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChzdGFydFBvcyAhPT0gZW5kUG9zKSB7XG4gICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICBjb25zdCBuZXh0UG9zID0gdGhpcy5uZXh0RWRpdGFibGVQb3Moc3RhcnRQb3MpO1xuICAgICAgdGhpcy5zZXRDdXJzb3IobmV4dFBvcyA8IHRoaXMudG9rZW5zLmxlbmd0aCA/IG5leHRQb3MgOiBzdGFydFBvcyk7XG4gICAgICB0aGlzLmZpbmlzaEVkaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRQb3MgPiAwKSB7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLnByZXZFZGl0YWJsZVBvcyhzdGFydFBvcyAtIDEpO1xuXG4gICAgICBpZiAocG9zID49IDApIHtcbiAgICAgICAgdGhpcy5idWZmZXJbcG9zXSA9IHRoaXMuc2xvdENoYXI7XG4gICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcbiAgICAgICAgdGhpcy5zZXRDdXJzb3IocG9zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaEVkaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHN0YXJ0UG9zICE9PSBlbmRQb3MpIHtcbiAgICAgIHRoaXMuY2xlYXJSYW5nZShzdGFydFBvcywgZW5kUG9zKTtcbiAgICAgIGNvbnN0IG5leHRQb3MgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhzdGFydFBvcyk7XG4gICAgICB0aGlzLnNldEN1cnNvcihuZXh0UG9zIDwgdGhpcy50b2tlbnMubGVuZ3RoID8gbmV4dFBvcyA6IHN0YXJ0UG9zKTtcbiAgICAgIHRoaXMuZmluaXNoRWRpdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcyA9IHRoaXMubmV4dEVkaXRhYmxlUG9zKHN0YXJ0UG9zKTtcblxuICAgIGlmIChwb3MgPCB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYnVmZmVyW3Bvc10gPSB0aGlzLnNsb3RDaGFyO1xuICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0RGlzcGxheVZhbHVlKCkpO1xuICAgICAgdGhpcy5zZXRDdXJzb3IocG9zKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaEVkaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhcmFjdGVySW5wdXQoa2V5OiBzdHJpbmcsIHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGluc2VydFBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgLy8gTGltcGEgYSBzZWxlw6fDo28sIHNlIGhvdXZlclxuICAgIGlmIChzdGFydFBvcyAhPT0gZW5kUG9zKSB7XG4gICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgICBpbnNlcnRQb3MgPSBzdGFydFBvcztcbiAgICB9XG5cbiAgICBjb25zdCBwb3MgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhpbnNlcnRQb3MpO1xuXG4gICAgaWYgKHBvcyA+PSB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5zW3Bvc107XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZENoYXIoa2V5LCB0b2tlbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlcltwb3NdID0ga2V5O1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcblxuICAgIGNvbnN0IG5leHQgPSB0aGlzLm5leHRFZGl0YWJsZVBvcyhwb3MgKyAxKTtcbiAgICB0aGlzLnNldEN1cnNvcihuZXh0IDw9IHRoaXMudG9rZW5zLmxlbmd0aCA/IG5leHQgOiB0aGlzLnRva2Vucy5sZW5ndGgpO1xuXG4gICAgdGhpcy5maW5pc2hFZGl0KCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaEVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldE1vZGVsVmFsdWUoKSk7XG4gICAgdGhpcy5jaGVja0FuZEVtaXRDb21wbGV0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hJbnB1dEV2ZW50KCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cyhfZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNlbXByZSByZXN0YXVyYSBhIGV4aWJpw6fDo28gY29tcGxldGEgZGEgbcOhc2NhcmEgbm8gZm9jbyAoc2xvdHMgZmljYW0gdmlzw612ZWlzKVxuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldERpc3BsYXlWYWx1ZSgpKTtcblxuICAgIC8vIE1vdmUgbyBjdXJzb3IgcGFyYSBvIHByaW1laXJvIHNsb3QgZWRpdMOhdmVsIHZhemlvXG4gICAgY29uc3QgZmlyc3RFbXB0eSA9IHRoaXMuYnVmZmVyLmZpbmRJbmRleChcbiAgICAgIChjaCwgaSkgPT4gdGhpcy50b2tlbnNbaV0gJiYgdGhpcy50b2tlbnNbaV0udHlwZSAhPT0gJ2xpdGVyYWwnICYmIGNoID09PSB0aGlzLnNsb3RDaGFyXG4gICAgKTtcblxuICAgIHRoaXMuc2V0Q3Vyc29yKGZpcnN0RW1wdHkgPj0gMCA/IGZpcnN0RW1wdHkgOiB0aGlzLm5leHRFZGl0YWJsZVBvcygwKSk7XG4gIH1cblxuICBwdWJsaWMgb25CbHVyKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgICBpZiAoIXRoaXMuaXNNYXNrQ29tcGxldGUoKSkge1xuICAgICAgaWYgKHRoaXMuYXV0b0NsZWFyKSB7XG4gICAgICAgIHRoaXMucmVzZXRCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLmdldEJsdXJEaXNwbGF5VmFsdWUoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnJlYWRPbmx5IHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpID8/ICcnO1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmRQb3MgPSBpbnB1dC5zZWxlY3Rpb25FbmQgPz8gMDtcblxuICAgIGlmIChzdGFydFBvcyAhPT0gZW5kUG9zKSB7XG4gICAgICB0aGlzLmNsZWFyUmFuZ2Uoc3RhcnRQb3MsIGVuZFBvcyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zID0gdGhpcy5jb25zdW1lUGFzdGVkVGV4dChwYXN0ZWRUZXh0LCBzdGFydFBvcyk7XG5cbiAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXREaXNwbGF5VmFsdWUoKSk7XG4gICAgdGhpcy5zZXRDdXJzb3IocG9zIDw9IHRoaXMudG9rZW5zLmxlbmd0aCA/IHBvcyA6IHRoaXMudG9rZW5zLmxlbmd0aCk7XG4gICAgdGhpcy5maW5pc2hFZGl0KCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVQYXN0ZWRUZXh0KHBhc3RlZFRleHQ6IHN0cmluZywgc3RhcnRQb3M6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHBvcyA9IHRoaXMubmV4dEVkaXRhYmxlUG9zKHN0YXJ0UG9zKTtcblxuICAgIGZvciAoY29uc3QgY2ggb2YgcGFzdGVkVGV4dCkge1xuICAgICAgaWYgKHBvcyA+PSB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHBvcyA9IHRoaXMuY29uc3VtZVBhc3RlZENoYXIoY2gsIHBvcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvcztcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVBhc3RlZENoYXIoY2g6IHN0cmluZywgcG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbnNbcG9zXTtcblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIC8vIFB1bGEgbyBsaXRlcmFsIGNvcnJlc3BvbmRlbnRlIG5vIHRleHRvIGNvbGFkbzsgYXZhbsOnYSBvIHNsb3QgbGl0ZXJhbCBkZSBxdWFscXVlciBmb3JtYVxuICAgICAgY29uc3QgYWR2YW5jZWQgPSBjaCA9PT0gdG9rZW4uY2hhciA/IHBvcyArIDEgOiBwb3M7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0RWRpdGFibGVQb3MoYWR2YW5jZWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzVmFsaWRDaGFyKGNoLCB0b2tlbikpIHtcbiAgICAgIHRoaXMuYnVmZmVyW3Bvc10gPSBjaDtcbiAgICAgIHJldHVybiB0aGlzLm5leHRFZGl0YWJsZVBvcyhwb3MgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnJlYWRPbmx5IHx8IHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBvcyA9IGlucHV0LnNlbGVjdGlvblN0YXJ0ID8/IDA7XG5cbiAgICAvLyBTZSBvIGN1cnNvciBjYWl1IGVtIHVtIGxpdGVyYWwsIGVtcHVycmEgcGFyYSBvIHNsb3QgZWRpdMOhdmVsIG1haXMgcHLDs3hpbW9cbiAgICBpZiAodGhpcy50b2tlbnNbcG9zXSAmJiB0aGlzLnRva2Vuc1twb3NdLnR5cGUgPT09ICdsaXRlcmFsJykge1xuICAgICAgdGhpcy5zZXRDdXJzb3IodGhpcy5uZXh0RWRpdGFibGVQb3MocG9zKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKCF0aGlzLm1hc2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0QnVmZmVyKCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLnNldElucHV0VmFsdWUoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBidWZmZXJJZHggPSAwO1xuICAgIGxldCB2YWx1ZUlkeCA9IDA7XG5cbiAgICB3aGlsZSAodmFsdWVJZHggPCB2YWx1ZS5sZW5ndGggJiYgYnVmZmVySWR4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5zW2J1ZmZlcklkeF07XG4gICAgICBjb25zdCBjaGFyID0gdmFsdWVbdmFsdWVJZHhdO1xuXG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIC8vIENvbnNvbWUgbyBsaXRlcmFsIGRvIHZhbG9yIHNlIGNvcnJlc3BvbmRlcjsgc2VtcHJlIGF2YW7Dp2EgbyBidWZmZXJcbiAgICAgICAgaWYgKGNoYXIgPT09IHRva2VuLmNoYXIpIHtcbiAgICAgICAgICB2YWx1ZUlkeCsrO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcklkeCsrO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmFsaWRDaGFyKGNoYXIsIHRva2VuKSkge1xuICAgICAgICB0aGlzLmJ1ZmZlcltidWZmZXJJZHhdID0gY2hhcjtcbiAgICAgICAgYnVmZmVySWR4Kys7XG4gICAgICAgIHZhbHVlSWR4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQdWxhIGNhcmFjdGVyZXMgZG8gdmFsb3IgcXVlIG7Do28gY29ycmVzcG9uZGVtIGFvIHNsb3QgYXR1YWxcbiAgICAgICAgdmFsdWVJZHgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXREaXNwbGF5VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1hc2sgfHwgIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc01hc2tDb21wbGV0ZSgpKSB7XG4gICAgICByZXR1cm4geyBpbmNvbXBsZXRlTWFzazogeyBtYXNrOiB0aGlzLm1hc2sgfSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=