@seniorsistemas/angular-components 19.7.4 → 19.7.6
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.
- package/alert/lib/alert/alert.component.d.ts +8 -1
- package/chips/README.md +3 -2
- package/chips/lib/chips/chip-item/chip-item.component.d.ts +2 -0
- package/chips/lib/chips/chips/chips.component.d.ts +2 -1
- package/datepicker/README.md +15 -2
- package/datepicker/lib/datepicker/date-segment-input.d.ts +82 -0
- package/datepicker/lib/datepicker/date.utils.d.ts +3 -7
- package/datepicker/lib/datepicker/datepicker.component.d.ts +101 -8
- package/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.d.ts +7 -1
- package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +1 -1
- package/dynamic-form/public-api.d.ts +1 -1
- package/esm2022/alert/lib/alert/alert.component.mjs +12 -6
- package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +15 -4
- package/esm2022/chips/lib/chips/chips/chips.component.mjs +26 -14
- package/esm2022/datepicker/lib/datepicker/date-segment-input.mjs +418 -0
- package/esm2022/datepicker/lib/datepicker/date.utils.mjs +7 -79
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +451 -41
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
- package/esm2022/dynamic-form/public-api.mjs +1 -1
- package/esm2022/panel/lib/panel/panel.component.mjs +3 -3
- package/esm2022/sidebar/lib/sidebar/sidebar.component.mjs +8 -6
- package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-alert.mjs +12 -6
- package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chips.mjs +39 -16
- package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +873 -118
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-panel.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +7 -5
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
- package/package.json +13 -13
- package/schematics/migrations/migrate-steps-to-stepper/index.d.ts +2 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.js +104 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.js.map +1 -0
- package/schematics/migrations.json +5 -0
- package/schematics/utils/ast-utils.d.ts +13 -0
- package/schematics/utils/ast-utils.js +76 -0
- package/schematics/utils/ast-utils.js.map +1 -1
- package/sidebar/lib/sidebar/sidebar.component.d.ts +3 -1
- package/schematics/migrations/migrate-dynamic-form-v19/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-dynamic-form-v19/index.test.js +0 -888
- package/schematics/migrations/migrate-dynamic-form-v19/index.test.js.map +0 -1
- package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-p-datepicker/index.test.js +0 -392
- package/schematics/migrations/migrate-p-datepicker/index.test.js.map +0 -1
- package/schematics/migrations/migrate-p-editor/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-p-editor/index.test.js +0 -393
- package/schematics/migrations/migrate-p-editor/index.test.js.map +0 -1
- package/schematics/migrations/migrate-s-chips-outputs/index.test.d.ts +0 -1
- package/schematics/migrations/migrate-s-chips-outputs/index.test.js +0 -125
- package/schematics/migrations/migrate-s-chips-outputs/index.test.js.map +0 -1
- package/schematics/utils/ast-utils.test.d.ts +0 -1
- package/schematics/utils/ast-utils.test.js +0 -138
- package/schematics/utils/ast-utils.test.js.map +0 -1
- package/schematics/utils/workspace-utils.test.d.ts +0 -1
- package/schematics/utils/workspace-utils.test.js +0 -152
- package/schematics/utils/workspace-utils.test.js.map +0 -1
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
const DATE_FORMAT_TOKEN_RE = /yyyy|yy|MM|mm|dd|d/g;
|
|
2
|
+
const YEAR_SEGMENT_LENGTH = 4;
|
|
3
|
+
const SHORT_SEGMENT_LENGTH = 2;
|
|
4
|
+
const HOURS_PER_MERIDIEM = 12;
|
|
5
|
+
const MAX_HOUR_24 = 23;
|
|
6
|
+
const MAX_MINUTE_SECOND = 59;
|
|
7
|
+
const GENERIC_MAX_DAY = 31;
|
|
8
|
+
const LEAP_REFERENCE_YEAR = 2000;
|
|
9
|
+
function isEditableSegment(segment) {
|
|
10
|
+
return segment.kind !== 'literal';
|
|
11
|
+
}
|
|
12
|
+
/** Tokeniza um `dateFormat` (ex.: `dd/MM/yyyy`, `MM/dd/yy`) em tokens de dia/mês/ano + literais. */
|
|
13
|
+
export function tokenizeDateFormat(format) {
|
|
14
|
+
const tokens = [];
|
|
15
|
+
let lastIndex = 0;
|
|
16
|
+
DATE_FORMAT_TOKEN_RE.lastIndex = 0;
|
|
17
|
+
let match;
|
|
18
|
+
while ((match = DATE_FORMAT_TOKEN_RE.exec(format))) {
|
|
19
|
+
if (match.index > lastIndex) {
|
|
20
|
+
tokens.push({ kind: 'literal', raw: format.slice(lastIndex, match.index) });
|
|
21
|
+
}
|
|
22
|
+
const raw = match[0];
|
|
23
|
+
const kind = raw[0] === 'y' ? 'year' : raw[0] === 'd' ? 'day' : 'month';
|
|
24
|
+
tokens.push({ kind, raw });
|
|
25
|
+
lastIndex = DATE_FORMAT_TOKEN_RE.lastIndex;
|
|
26
|
+
}
|
|
27
|
+
if (lastIndex < format.length) {
|
|
28
|
+
tokens.push({ kind: 'literal', raw: format.slice(lastIndex) });
|
|
29
|
+
}
|
|
30
|
+
return tokens;
|
|
31
|
+
}
|
|
32
|
+
/** Dias no mês (1-12), já resolvendo fevereiro/ano bissexto via rollover nativo do `Date`. */
|
|
33
|
+
export function daysInMonth(month, year) {
|
|
34
|
+
return new Date(year, month, 0).getDate();
|
|
35
|
+
}
|
|
36
|
+
function buildDateSegments(dateFormat) {
|
|
37
|
+
return tokenizeDateFormat(dateFormat).map((token) => {
|
|
38
|
+
if (token.kind === 'literal')
|
|
39
|
+
return { kind: 'literal', text: token.raw };
|
|
40
|
+
if (token.kind === 'year')
|
|
41
|
+
return { kind: 'year', length: YEAR_SEGMENT_LENGTH, text: '' };
|
|
42
|
+
if (token.kind === 'month')
|
|
43
|
+
return { kind: 'month', length: SHORT_SEGMENT_LENGTH, text: '' };
|
|
44
|
+
return { kind: 'day', length: SHORT_SEGMENT_LENGTH, text: '' };
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function buildMonthSegments(dateFormat) {
|
|
48
|
+
const all = buildDateSegments(dateFormat);
|
|
49
|
+
const dayIdx = all.findIndex((s) => s.kind === 'day');
|
|
50
|
+
if (dayIdx === -1)
|
|
51
|
+
return all;
|
|
52
|
+
const dropIndexes = new Set([dayIdx]);
|
|
53
|
+
if (all[dayIdx + 1]?.kind === 'literal') {
|
|
54
|
+
dropIndexes.add(dayIdx + 1);
|
|
55
|
+
}
|
|
56
|
+
else if (all[dayIdx - 1]?.kind === 'literal') {
|
|
57
|
+
dropIndexes.add(dayIdx - 1);
|
|
58
|
+
}
|
|
59
|
+
return all.filter((_, i) => !dropIndexes.has(i));
|
|
60
|
+
}
|
|
61
|
+
function buildTimeSegments(hourFormat, showSeconds) {
|
|
62
|
+
const segments = [
|
|
63
|
+
{ kind: 'hour', length: SHORT_SEGMENT_LENGTH, text: '' },
|
|
64
|
+
{ kind: 'literal', text: ':' },
|
|
65
|
+
{ kind: 'minute', length: SHORT_SEGMENT_LENGTH, text: '' },
|
|
66
|
+
];
|
|
67
|
+
if (showSeconds) {
|
|
68
|
+
segments.push({ kind: 'literal', text: ':' }, { kind: 'second', length: SHORT_SEGMENT_LENGTH, text: '' });
|
|
69
|
+
}
|
|
70
|
+
if (hourFormat === '12') {
|
|
71
|
+
segments.push({ kind: 'literal', text: ' ' }, { kind: 'ampm', length: SHORT_SEGMENT_LENGTH, text: '' });
|
|
72
|
+
}
|
|
73
|
+
return segments;
|
|
74
|
+
}
|
|
75
|
+
function buildSegmentsFor(config) {
|
|
76
|
+
switch (config.mode) {
|
|
77
|
+
case 'date':
|
|
78
|
+
return buildDateSegments(config.dateFormat);
|
|
79
|
+
case 'month':
|
|
80
|
+
return buildMonthSegments(config.dateFormat);
|
|
81
|
+
case 'time':
|
|
82
|
+
return buildTimeSegments(config.hourFormat, config.showSeconds);
|
|
83
|
+
case 'datetime':
|
|
84
|
+
return [
|
|
85
|
+
...buildDateSegments(config.dateFormat),
|
|
86
|
+
{ kind: 'literal', text: ' ' },
|
|
87
|
+
...buildTimeSegments(config.hourFormat, config.showSeconds),
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Engine de segmentos (dia/mês/ano/hora/minuto/segundo/ampm) para o trigger do datepicker.
|
|
93
|
+
* Sem dependências de Angular — DOM/CVA ficam por conta do componente que a consome.
|
|
94
|
+
*/
|
|
95
|
+
export class DateSegmentEngine {
|
|
96
|
+
segments = [];
|
|
97
|
+
config = null;
|
|
98
|
+
activeIndex = null;
|
|
99
|
+
freshEntry = true;
|
|
100
|
+
configure(config) {
|
|
101
|
+
this.config = config;
|
|
102
|
+
this.segments = buildSegmentsFor(config);
|
|
103
|
+
this.activeIndex = null;
|
|
104
|
+
this.freshEntry = true;
|
|
105
|
+
}
|
|
106
|
+
getDisplayString() {
|
|
107
|
+
return this.segments.map((s) => (isEditableSegment(s) ? this.renderSegment(s) : s.text)).join('');
|
|
108
|
+
}
|
|
109
|
+
renderSegment(segment) {
|
|
110
|
+
return segment.text + '_'.repeat(Math.max(0, segment.length - segment.text.length));
|
|
111
|
+
}
|
|
112
|
+
segmentRenderLength(segment) {
|
|
113
|
+
return isEditableSegment(segment) ? segment.length : segment.text.length;
|
|
114
|
+
}
|
|
115
|
+
getSegmentRange(index) {
|
|
116
|
+
let start = 0;
|
|
117
|
+
for (let i = 0; i < index; i++) {
|
|
118
|
+
start += this.segmentRenderLength(this.segments[i]);
|
|
119
|
+
}
|
|
120
|
+
return [start, start + this.segmentRenderLength(this.segments[index])];
|
|
121
|
+
}
|
|
122
|
+
getFirstEditableIndex() {
|
|
123
|
+
return this.segments.findIndex((s) => isEditableSegment(s));
|
|
124
|
+
}
|
|
125
|
+
getLastEditableIndex() {
|
|
126
|
+
for (let i = this.segments.length - 1; i >= 0; i--) {
|
|
127
|
+
if (isEditableSegment(this.segments[i]))
|
|
128
|
+
return i;
|
|
129
|
+
}
|
|
130
|
+
return -1;
|
|
131
|
+
}
|
|
132
|
+
getActiveIndex() {
|
|
133
|
+
return this.activeIndex;
|
|
134
|
+
}
|
|
135
|
+
activeKind() {
|
|
136
|
+
if (this.activeIndex === null)
|
|
137
|
+
return null;
|
|
138
|
+
const segment = this.segments[this.activeIndex];
|
|
139
|
+
return isEditableSegment(segment) ? segment.kind : null;
|
|
140
|
+
}
|
|
141
|
+
selectSegmentAt(charIndex) {
|
|
142
|
+
let acc = 0;
|
|
143
|
+
for (let i = 0; i < this.segments.length; i++) {
|
|
144
|
+
const len = this.segmentRenderLength(this.segments[i]);
|
|
145
|
+
if (charIndex < acc + len) {
|
|
146
|
+
return this.nearestEditableFrom(i);
|
|
147
|
+
}
|
|
148
|
+
acc += len;
|
|
149
|
+
}
|
|
150
|
+
return this.getLastEditableIndex();
|
|
151
|
+
}
|
|
152
|
+
nearestEditableFrom(index) {
|
|
153
|
+
for (let i = index; i < this.segments.length; i++) {
|
|
154
|
+
if (isEditableSegment(this.segments[i]))
|
|
155
|
+
return i;
|
|
156
|
+
}
|
|
157
|
+
return this.getLastEditableIndex();
|
|
158
|
+
}
|
|
159
|
+
selectSegment(index) {
|
|
160
|
+
if (index < 0 || index >= this.segments.length || !isEditableSegment(this.segments[index]))
|
|
161
|
+
return;
|
|
162
|
+
this.activeIndex = index;
|
|
163
|
+
this.freshEntry = true;
|
|
164
|
+
}
|
|
165
|
+
selectFirstSegment() {
|
|
166
|
+
this.selectSegment(this.getFirstEditableIndex());
|
|
167
|
+
}
|
|
168
|
+
/** Commita (pad/clamp) o segmento ativo e move para o próximo/anterior editável. */
|
|
169
|
+
moveToAdjacentSegment(direction) {
|
|
170
|
+
this.commitActiveSegment();
|
|
171
|
+
if (this.activeIndex === null)
|
|
172
|
+
return 'boundary';
|
|
173
|
+
let next = this.activeIndex;
|
|
174
|
+
do {
|
|
175
|
+
next += direction;
|
|
176
|
+
} while (next >= 0 && next < this.segments.length && !isEditableSegment(this.segments[next]));
|
|
177
|
+
if (next < 0 || next >= this.segments.length) {
|
|
178
|
+
this.activeIndex = null;
|
|
179
|
+
return 'boundary';
|
|
180
|
+
}
|
|
181
|
+
this.selectSegment(next);
|
|
182
|
+
return 'moved';
|
|
183
|
+
}
|
|
184
|
+
typeDigit(digit) {
|
|
185
|
+
if (this.activeIndex === null)
|
|
186
|
+
return;
|
|
187
|
+
const segment = this.segments[this.activeIndex];
|
|
188
|
+
if (!isEditableSegment(segment) || segment.kind === 'ampm')
|
|
189
|
+
return;
|
|
190
|
+
if (this.freshEntry) {
|
|
191
|
+
segment.text = '';
|
|
192
|
+
this.freshEntry = false;
|
|
193
|
+
}
|
|
194
|
+
if (segment.text.length >= segment.length)
|
|
195
|
+
return;
|
|
196
|
+
segment.text += digit;
|
|
197
|
+
if (segment.text.length >= segment.length) {
|
|
198
|
+
this.commitActiveSegment();
|
|
199
|
+
this.autoAdvance();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
autoAdvance() {
|
|
203
|
+
if (this.activeIndex === null)
|
|
204
|
+
return;
|
|
205
|
+
let next = this.activeIndex;
|
|
206
|
+
do {
|
|
207
|
+
next += 1;
|
|
208
|
+
} while (next < this.segments.length && !isEditableSegment(this.segments[next]));
|
|
209
|
+
if (next < this.segments.length) {
|
|
210
|
+
this.selectSegment(next);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
setAmPm(value) {
|
|
214
|
+
if (this.activeIndex === null)
|
|
215
|
+
return;
|
|
216
|
+
const segment = this.segments[this.activeIndex];
|
|
217
|
+
if (!isEditableSegment(segment) || segment.kind !== 'ampm')
|
|
218
|
+
return;
|
|
219
|
+
segment.text = value === 1 ? 'PM' : 'AM';
|
|
220
|
+
this.freshEntry = true;
|
|
221
|
+
}
|
|
222
|
+
clearActiveSegment(kind) {
|
|
223
|
+
if (this.activeIndex === null)
|
|
224
|
+
return;
|
|
225
|
+
const segment = this.segments[this.activeIndex];
|
|
226
|
+
if (!isEditableSegment(segment))
|
|
227
|
+
return;
|
|
228
|
+
if (segment.text === '') {
|
|
229
|
+
if (kind === 'backspace') {
|
|
230
|
+
let prev = this.activeIndex;
|
|
231
|
+
do {
|
|
232
|
+
prev -= 1;
|
|
233
|
+
} while (prev >= 0 && !isEditableSegment(this.segments[prev]));
|
|
234
|
+
if (prev >= 0) {
|
|
235
|
+
this.activeIndex = prev;
|
|
236
|
+
this.freshEntry = false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
segment.text = '';
|
|
242
|
+
this.freshEntry = true;
|
|
243
|
+
}
|
|
244
|
+
/** Limpa todos os segmentos editáveis (usado quando o campo inteiro está selecionado, ex.: Ctrl+A). */
|
|
245
|
+
clearAll() {
|
|
246
|
+
for (const segment of this.segments) {
|
|
247
|
+
if (isEditableSegment(segment))
|
|
248
|
+
segment.text = '';
|
|
249
|
+
}
|
|
250
|
+
this.activeIndex = this.getFirstEditableIndex();
|
|
251
|
+
this.freshEntry = true;
|
|
252
|
+
}
|
|
253
|
+
/** Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido. */
|
|
254
|
+
incrementActiveSegment(delta) {
|
|
255
|
+
if (this.activeIndex === null)
|
|
256
|
+
return;
|
|
257
|
+
const segment = this.segments[this.activeIndex];
|
|
258
|
+
if (!isEditableSegment(segment))
|
|
259
|
+
return;
|
|
260
|
+
if (segment.kind === 'ampm') {
|
|
261
|
+
this.setAmPm(segment.text === 'PM' ? 0 : 1);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const { min, max } = this.boundsFor(segment.kind);
|
|
265
|
+
const range = max - min + 1;
|
|
266
|
+
const current = segment.text ? parseInt(segment.text, 10) : delta > 0 ? min - 1 : min;
|
|
267
|
+
const next = (((current + delta - min) % range) + range) % range + min;
|
|
268
|
+
segment.text = String(next).padStart(segment.length, '0');
|
|
269
|
+
this.freshEntry = true;
|
|
270
|
+
this.reconcileDayIfNeeded(segment.kind);
|
|
271
|
+
}
|
|
272
|
+
/** Pad/clamp do segmento ativo (ex.: "2" -> "02", "45" no dia -> clamp para daysInMonth). */
|
|
273
|
+
commitActiveSegment() {
|
|
274
|
+
if (this.activeIndex === null)
|
|
275
|
+
return;
|
|
276
|
+
const segment = this.segments[this.activeIndex];
|
|
277
|
+
if (!isEditableSegment(segment))
|
|
278
|
+
return;
|
|
279
|
+
const kind = segment.kind;
|
|
280
|
+
segment.text = this.clampAndPad(segment);
|
|
281
|
+
this.freshEntry = true;
|
|
282
|
+
this.reconcileDayIfNeeded(kind);
|
|
283
|
+
}
|
|
284
|
+
/** Commita o segmento ativo e sai do modo de edição (usado no blur do campo). */
|
|
285
|
+
deactivate() {
|
|
286
|
+
this.commitActiveSegment();
|
|
287
|
+
this.activeIndex = null;
|
|
288
|
+
}
|
|
289
|
+
clampAndPad(segment) {
|
|
290
|
+
if (segment.kind === 'ampm' || segment.kind === 'year' || !segment.text) {
|
|
291
|
+
return segment.text;
|
|
292
|
+
}
|
|
293
|
+
const num = parseInt(segment.text, 10);
|
|
294
|
+
const { min, max } = this.boundsFor(segment.kind);
|
|
295
|
+
const clamped = Math.min(max, Math.max(min, num));
|
|
296
|
+
return String(clamped).padStart(segment.length, '0');
|
|
297
|
+
}
|
|
298
|
+
boundsFor(kind) {
|
|
299
|
+
switch (kind) {
|
|
300
|
+
case 'day':
|
|
301
|
+
return { min: 1, max: this.daysInMonthNow() };
|
|
302
|
+
case 'month':
|
|
303
|
+
return { min: 1, max: HOURS_PER_MERIDIEM };
|
|
304
|
+
case 'hour':
|
|
305
|
+
return this.config?.hourFormat === '12'
|
|
306
|
+
? { min: 1, max: HOURS_PER_MERIDIEM }
|
|
307
|
+
: { min: 0, max: MAX_HOUR_24 };
|
|
308
|
+
case 'minute':
|
|
309
|
+
case 'second':
|
|
310
|
+
return { min: 0, max: MAX_MINUTE_SECOND };
|
|
311
|
+
default:
|
|
312
|
+
return { min: 0, max: 9999 };
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Bound do dia dependendo do que já é conhecido de mês/ano. Nunca "adivinha" com o mês/ano
|
|
317
|
+
* atuais do sistema — isso estreitaria o range antes da hora (ex.: dia=29 digitado antes do
|
|
318
|
+
* ano, mês=fevereiro conhecido mas ano ainda não -> se assumisse o ano atual do sistema e ele
|
|
319
|
+
* não fosse bissexto, o dia seria clampado para 28 e nunca mais reexpandido para 29 mesmo que
|
|
320
|
+
* o ano realmente digitado depois seja bissexto). Em vez disso, fica sempre no lado permissivo
|
|
321
|
+
* até que a informação realmente exista.
|
|
322
|
+
*/
|
|
323
|
+
daysInMonthNow() {
|
|
324
|
+
const monthSegment = this.findEditable('month');
|
|
325
|
+
const monthKnown = !!monthSegment?.text && monthSegment.text.length === monthSegment.length;
|
|
326
|
+
if (!monthSegment || !monthKnown)
|
|
327
|
+
return GENERIC_MAX_DAY;
|
|
328
|
+
const month = parseInt(monthSegment.text, 10);
|
|
329
|
+
const yearSegment = this.findEditable('year');
|
|
330
|
+
const yearKnown = !!yearSegment?.text && yearSegment.text.length === YEAR_SEGMENT_LENGTH;
|
|
331
|
+
if (!yearSegment || !yearKnown)
|
|
332
|
+
return daysInMonth(month, LEAP_REFERENCE_YEAR);
|
|
333
|
+
return daysInMonth(month, parseInt(yearSegment.text, 10));
|
|
334
|
+
}
|
|
335
|
+
reconcileDayIfNeeded(committedKind) {
|
|
336
|
+
if (committedKind !== 'month' && committedKind !== 'year')
|
|
337
|
+
return;
|
|
338
|
+
const daySegment = this.findEditable('day');
|
|
339
|
+
if (!daySegment || daySegment.text.length !== daySegment.length)
|
|
340
|
+
return;
|
|
341
|
+
const max = this.daysInMonthNow();
|
|
342
|
+
const dayNum = parseInt(daySegment.text, 10);
|
|
343
|
+
if (dayNum > max) {
|
|
344
|
+
daySegment.text = String(max).padStart(daySegment.length, '0');
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
findEditable(kind) {
|
|
348
|
+
return this.segments.find((s) => isEditableSegment(s) && s.kind === kind);
|
|
349
|
+
}
|
|
350
|
+
isEmpty() {
|
|
351
|
+
return this.segments.every((s) => !isEditableSegment(s) || s.text === '');
|
|
352
|
+
}
|
|
353
|
+
isComplete() {
|
|
354
|
+
return this.segments.every((s) => !isEditableSegment(s) || s.text.length === s.length);
|
|
355
|
+
}
|
|
356
|
+
loadFromDate(date) {
|
|
357
|
+
for (const segment of this.segments) {
|
|
358
|
+
if (isEditableSegment(segment))
|
|
359
|
+
segment.text = '';
|
|
360
|
+
}
|
|
361
|
+
this.activeIndex = null;
|
|
362
|
+
this.freshEntry = true;
|
|
363
|
+
if (!date)
|
|
364
|
+
return;
|
|
365
|
+
for (const segment of this.segments) {
|
|
366
|
+
if (!isEditableSegment(segment))
|
|
367
|
+
continue;
|
|
368
|
+
segment.text = this.renderValueFor(segment.kind, date);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
renderValueFor(kind, date) {
|
|
372
|
+
switch (kind) {
|
|
373
|
+
case 'day':
|
|
374
|
+
return String(date.getDate()).padStart(SHORT_SEGMENT_LENGTH, '0');
|
|
375
|
+
case 'month':
|
|
376
|
+
return String(date.getMonth() + 1).padStart(SHORT_SEGMENT_LENGTH, '0');
|
|
377
|
+
case 'year':
|
|
378
|
+
return String(date.getFullYear()).padStart(YEAR_SEGMENT_LENGTH, '0');
|
|
379
|
+
case 'hour': {
|
|
380
|
+
const h = date.getHours();
|
|
381
|
+
const display = this.config?.hourFormat === '12' ? (h % HOURS_PER_MERIDIEM === 0 ? HOURS_PER_MERIDIEM : h % HOURS_PER_MERIDIEM) : h;
|
|
382
|
+
return String(display).padStart(SHORT_SEGMENT_LENGTH, '0');
|
|
383
|
+
}
|
|
384
|
+
case 'minute':
|
|
385
|
+
return String(date.getMinutes()).padStart(SHORT_SEGMENT_LENGTH, '0');
|
|
386
|
+
case 'second':
|
|
387
|
+
return String(date.getSeconds()).padStart(SHORT_SEGMENT_LENGTH, '0');
|
|
388
|
+
case 'ampm':
|
|
389
|
+
return date.getHours() < HOURS_PER_MERIDIEM ? 'AM' : 'PM';
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/** Constrói o `Date` a partir dos segmentos; `null` enquanto incompleto. Usa `referenceDate` para preencher partes ausentes (ex.: hora ao editar só a data). */
|
|
393
|
+
toDate(referenceDate) {
|
|
394
|
+
if (!this.isComplete())
|
|
395
|
+
return null;
|
|
396
|
+
const ref = referenceDate ?? new Date();
|
|
397
|
+
const getNum = (kind) => {
|
|
398
|
+
const segment = this.findEditable(kind);
|
|
399
|
+
return segment ? parseInt(segment.text, 10) : null;
|
|
400
|
+
};
|
|
401
|
+
const year = getNum('year') ?? ref.getFullYear();
|
|
402
|
+
const monthNum = getNum('month');
|
|
403
|
+
const month = monthNum !== null ? monthNum - 1 : ref.getMonth();
|
|
404
|
+
const day = this.config?.mode === 'month' ? 1 : (getNum('day') ?? ref.getDate());
|
|
405
|
+
let hour = getNum('hour');
|
|
406
|
+
const minute = getNum('minute') ?? ref.getMinutes();
|
|
407
|
+
const second = getNum('second') ?? ref.getSeconds();
|
|
408
|
+
if (hour !== null && this.config?.hourFormat === '12') {
|
|
409
|
+
const ampmSegment = this.findEditable('ampm');
|
|
410
|
+
const isPm = ampmSegment?.text === 'PM';
|
|
411
|
+
hour = hour % HOURS_PER_MERIDIEM;
|
|
412
|
+
if (isPm)
|
|
413
|
+
hour += HOURS_PER_MERIDIEM;
|
|
414
|
+
}
|
|
415
|
+
return new Date(year, month, day, hour ?? ref.getHours(), minute, second);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1zZWdtZW50LWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2RhdGVwaWNrZXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGUtc2VnbWVudC1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyQkEsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBRWpDLFNBQVMsaUJBQWlCLENBQUMsT0FBcUI7SUFDNUMsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsb0dBQW9HO0FBQ3BHLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjO0lBQzdDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDakMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLG9CQUFvQixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUE2QixDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENB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QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVwRCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxXQUFXLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQztZQUN4QyxJQUFJLEdBQUcsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1lBQ2pDLElBQUksSUFBSTtnQkFBRSxJQUFJLElBQUksa0JBQWtCLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgU2VnbWVudEtpbmQgPSAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgfCAnaG91cicgfCAnbWludXRlJyB8ICdzZWNvbmQnIHwgJ2FtcG0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRhYmxlU2VnbWVudFN0YXRlIHtcbiAgICBraW5kOiBTZWdtZW50S2luZDtcbiAgICBsZW5ndGg6IG51bWJlcjtcbiAgICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl0ZXJhbFNlZ21lbnRTdGF0ZSB7XG4gICAga2luZDogJ2xpdGVyYWwnO1xuICAgIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFN0YXRlID0gRWRpdGFibGVTZWdtZW50U3RhdGUgfCBMaXRlcmFsU2VnbWVudFN0YXRlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlZ21lbnRFbmdpbmVDb25maWcge1xuICAgIG1vZGU6ICdkYXRlJyB8ICdtb250aCcgfCAndGltZScgfCAnZGF0ZXRpbWUnO1xuICAgIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgICBob3VyRm9ybWF0OiAnMTInIHwgJzI0JztcbiAgICBzaG93U2Vjb25kczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZvcm1hdFRva2VuIHtcbiAgICBraW5kOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgfCAnbGl0ZXJhbCc7XG4gICAgcmF3OiBzdHJpbmc7XG59XG5cbmNvbnN0IERBVEVfRk9STUFUX1RPS0VOX1JFID0gL3l5eXl8eXl8TU18bW18ZGR8ZC9nO1xuY29uc3QgWUVBUl9TRUdNRU5UX0xFTkdUSCA9IDQ7XG5jb25zdCBTSE9SVF9TRUdNRU5UX0xFTkdUSCA9IDI7XG5jb25zdCBIT1VSU19QRVJfTUVSSURJRU0gPSAxMjtcbmNvbnN0IE1BWF9IT1VSXzI0ID0gMjM7XG5jb25zdCBNQVhfTUlOVVRFX1NFQ09ORCA9IDU5O1xuY29uc3QgR0VORVJJQ19NQVhfREFZID0gMzE7XG5jb25zdCBMRUFQX1JFRkVSRU5DRV9ZRUFSID0gMjAwMDtcblxuZnVuY3Rpb24gaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudDogU2VnbWVudFN0YXRlKTogc2VnbWVudCBpcyBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB7XG4gICAgcmV0dXJuIHNlZ21lbnQua2luZCAhPT0gJ2xpdGVyYWwnO1xufVxuXG4vKiogVG9rZW5pemEgdW0gYGRhdGVGb3JtYXRgIChleC46IGBkZC9NTS95eXl5YCwgYE1NL2RkL3l5YCkgZW0gdG9rZW5zIGRlIGRpYS9tw6pzL2FubyArIGxpdGVyYWlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplRGF0ZUZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdFRva2VuW10ge1xuICAgIGNvbnN0IHRva2VuczogRm9ybWF0VG9rZW5bXSA9IFtdO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIERBVEVfRk9STUFUX1RPS0VOX1JFLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIHdoaWxlICgobWF0Y2ggPSBEQVRFX0ZPUk1BVF9UT0tFTl9SRS5leGVjKGZvcm1hdCkpKSB7XG4gICAgICAgIGlmIChtYXRjaC5pbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHJhdzogZm9ybWF0LnNsaWNlKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhdyA9IG1hdGNoWzBdO1xuICAgICAgICBjb25zdCBraW5kID0gcmF3WzBdID09PSAneScgPyAneWVhcicgOiByYXdbMF0gPT09ICdkJyA/ICdkYXknIDogJ21vbnRoJztcbiAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kLCByYXcgfSk7XG4gICAgICAgIGxhc3RJbmRleCA9IERBVEVfRk9STUFUX1RPS0VOX1JFLmxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCA8IGZvcm1hdC5sZW5ndGgpIHtcbiAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHJhdzogZm9ybWF0LnNsaWNlKGxhc3RJbmRleCkgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBEaWFzIG5vIG3DqnMgKDEtMTIpLCBqw6EgcmVzb2x2ZW5kbyBmZXZlcmVpcm8vYW5vIGJpc3NleHRvIHZpYSByb2xsb3ZlciBuYXRpdm8gZG8gYERhdGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRheXNJbk1vbnRoKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNlZ21lbnRzKGRhdGVGb3JtYXQ6IHN0cmluZyk6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICByZXR1cm4gdG9rZW5pemVEYXRlRm9ybWF0KGRhdGVGb3JtYXQpLm1hcCgodG9rZW4pOiBTZWdtZW50U3RhdGUgPT4ge1xuICAgICAgICBpZiAodG9rZW4ua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4geyBraW5kOiAnbGl0ZXJhbCcsIHRleHQ6IHRva2VuLnJhdyB9O1xuICAgICAgICBpZiAodG9rZW4ua2luZCA9PT0gJ3llYXInKSByZXR1cm4geyBraW5kOiAneWVhcicsIGxlbmd0aDogWUVBUl9TRUdNRU5UX0xFTkdUSCwgdGV4dDogJycgfTtcbiAgICAgICAgaWYgKHRva2VuLmtpbmQgPT09ICdtb250aCcpIHJldHVybiB7IGtpbmQ6ICdtb250aCcsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH07XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdkYXknLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZE1vbnRoU2VnbWVudHMoZGF0ZUZvcm1hdDogc3RyaW5nKTogU2VnbWVudFN0YXRlW10ge1xuICAgIGNvbnN0IGFsbCA9IGJ1aWxkRGF0ZVNlZ21lbnRzKGRhdGVGb3JtYXQpO1xuICAgIGNvbnN0IGRheUlkeCA9IGFsbC5maW5kSW5kZXgoKHMpID0+IHMua2luZCA9PT0gJ2RheScpO1xuICAgIGlmIChkYXlJZHggPT09IC0xKSByZXR1cm4gYWxsO1xuICAgIGNvbnN0IGRyb3BJbmRleGVzID0gbmV3IFNldDxudW1iZXI+KFtkYXlJZHhdKTtcbiAgICBpZiAoYWxsW2RheUlkeCArIDFdPy5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZHJvcEluZGV4ZXMuYWRkKGRheUlkeCArIDEpO1xuICAgIH0gZWxzZSBpZiAoYWxsW2RheUlkeCAtIDFdPy5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZHJvcEluZGV4ZXMuYWRkKGRheUlkeCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYWxsLmZpbHRlcigoXywgaSkgPT4gIWRyb3BJbmRleGVzLmhhcyhpKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGltZVNlZ21lbnRzKGhvdXJGb3JtYXQ6ICcxMicgfCAnMjQnLCBzaG93U2Vjb25kczogYm9vbGVhbik6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICBjb25zdCBzZWdtZW50czogU2VnbWVudFN0YXRlW10gPSBbXG4gICAgICAgIHsga2luZDogJ2hvdXInLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9LFxuICAgICAgICB7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJzonIH0sXG4gICAgICAgIHsga2luZDogJ21pbnV0ZScsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0sXG4gICAgXTtcbiAgICBpZiAoc2hvd1NlY29uZHMpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJzonIH0sIHsga2luZDogJ3NlY29uZCcsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0pO1xuICAgIH1cbiAgICBpZiAoaG91ckZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgICBzZWdtZW50cy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiAnICcgfSwgeyBraW5kOiAnYW1wbScsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VnbWVudHNGb3IoY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnKTogU2VnbWVudFN0YXRlW10ge1xuICAgIHN3aXRjaCAoY29uZmlnLm1vZGUpIHtcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGREYXRlU2VnbWVudHMoY29uZmlnLmRhdGVGb3JtYXQpO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNb250aFNlZ21lbnRzKGNvbmZpZy5kYXRlRm9ybWF0KTtcbiAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRUaW1lU2VnbWVudHMoY29uZmlnLmhvdXJGb3JtYXQsIGNvbmZpZy5zaG93U2Vjb25kcyk7XG4gICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgLi4uYnVpbGREYXRlU2VnbWVudHMoY29uZmlnLmRhdGVGb3JtYXQpLFxuICAgICAgICAgICAgICAgIHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiAnICcgfSxcbiAgICAgICAgICAgICAgICAuLi5idWlsZFRpbWVTZWdtZW50cyhjb25maWcuaG91ckZvcm1hdCwgY29uZmlnLnNob3dTZWNvbmRzKSxcbiAgICAgICAgICAgIF07XG4gICAgfVxufVxuXG4vKipcbiAqIEVuZ2luZSBkZSBzZWdtZW50b3MgKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIHBhcmEgbyB0cmlnZ2VyIGRvIGRhdGVwaWNrZXIuXG4gKiBTZW0gZGVwZW5kw6puY2lhcyBkZSBBbmd1bGFyIOKAlCBET00vQ1ZBIGZpY2FtIHBvciBjb250YSBkbyBjb21wb25lbnRlIHF1ZSBhIGNvbnNvbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlU2VnbWVudEVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzZWdtZW50czogU2VnbWVudFN0YXRlW10gPSBbXTtcbiAgICBwcml2YXRlIGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYWN0aXZlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZnJlc2hFbnRyeSA9IHRydWU7XG5cbiAgICBjb25maWd1cmUoY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gYnVpbGRTZWdtZW50c0Zvcihjb25maWcpO1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5U3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLm1hcCgocykgPT4gKGlzRWRpdGFibGVTZWdtZW50KHMpID8gdGhpcy5yZW5kZXJTZWdtZW50KHMpIDogcy50ZXh0KSkuam9pbignJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJTZWdtZW50KHNlZ21lbnQ6IEVkaXRhYmxlU2VnbWVudFN0YXRlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHNlZ21lbnQudGV4dCArICdfJy5yZXBlYXQoTWF0aC5tYXgoMCwgc2VnbWVudC5sZW5ndGggLSBzZWdtZW50LnRleHQubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWdtZW50UmVuZGVyTGVuZ3RoKHNlZ21lbnQ6IFNlZ21lbnRTdGF0ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSA/IHNlZ21lbnQubGVuZ3RoIDogc2VnbWVudC50ZXh0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRTZWdtZW50UmFuZ2UoaW5kZXg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIHN0YXJ0ICs9IHRoaXMuc2VnbWVudFJlbmRlckxlbmd0aCh0aGlzLnNlZ21lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3N0YXJ0LCBzdGFydCArIHRoaXMuc2VnbWVudFJlbmRlckxlbmd0aCh0aGlzLnNlZ21lbnRzW2luZGV4XSldO1xuICAgIH1cblxuICAgIGdldEZpcnN0RWRpdGFibGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKHMpID0+IGlzRWRpdGFibGVTZWdtZW50KHMpKTtcbiAgICB9XG5cbiAgICBnZXRMYXN0RWRpdGFibGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKGlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbaV0pKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgZ2V0QWN0aXZlSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUluZGV4O1xuICAgIH1cblxuICAgIGFjdGl2ZUtpbmQoKTogU2VnbWVudEtpbmQgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLmFjdGl2ZUluZGV4XTtcbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpID8gc2VnbWVudC5raW5kIDogbnVsbDtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50QXQoY2hhckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgYWNjID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpXSk7XG4gICAgICAgICAgICBpZiAoY2hhckluZGV4IDwgYWNjICsgbGVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVhcmVzdEVkaXRhYmxlRnJvbShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjYyArPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5lYXJlc3RFZGl0YWJsZUZyb20oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW2ldKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCB8fCAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tpbmRleF0pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZWxlY3RGaXJzdFNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudCh0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpKTtcbiAgICB9XG5cbiAgICAvKiogQ29tbWl0YSAocGFkL2NsYW1wKSBvIHNlZ21lbnRvIGF0aXZvIGUgbW92ZSBwYXJhIG8gcHLDs3hpbW8vYW50ZXJpb3IgZWRpdMOhdmVsLiAqL1xuICAgIG1vdmVUb0FkamFjZW50U2VnbWVudChkaXJlY3Rpb246IDEgfCAtMSk6ICdtb3ZlZCcgfCAnYm91bmRhcnknIHtcbiAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLmFjdGl2ZUluZGV4O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBuZXh0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA+PSAwICYmIG5leHQgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aCAmJiAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tuZXh0XSkpO1xuICAgICAgICBpZiAobmV4dCA8IDAgfHwgbmV4dCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFNlZ21lbnQobmV4dCk7XG4gICAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH1cblxuICAgIHR5cGVEaWdpdChkaWdpdDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCA9PT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmZyZXNoRW50cnkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dC5sZW5ndGggPj0gc2VnbWVudC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgc2VnbWVudC50ZXh0ICs9IGRpZ2l0O1xuICAgICAgICBpZiAoc2VnbWVudC50ZXh0Lmxlbmd0aCA+PSBzZWdtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9BZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dG9BZHZhbmNlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYWN0aXZlSW5kZXg7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA8IHRoaXMuc2VnbWVudHMubGVuZ3RoICYmICFpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW25leHRdKSk7XG4gICAgICAgIGlmIChuZXh0IDwgdGhpcy5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudChuZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEFtUG0odmFsdWU6IDAgfCAxKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCAhPT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHZhbHVlID09PSAxID8gJ1BNJyA6ICdBTSc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgY2xlYXJBY3RpdmVTZWdtZW50KGtpbmQ6ICdiYWNrc3BhY2UnIHwgJ2RlbGV0ZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgICAgIGlmICghaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHJldHVybjtcbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSAnYmFja3NwYWNlJykge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5hY3RpdmVJbmRleDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYgLT0gMTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2ID49IDAgJiYgIWlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbcHJldl0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldiA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBwcmV2O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIExpbXBhIHRvZG9zIG9zIHNlZ21lbnRvcyBlZGl0w6F2ZWlzICh1c2FkbyBxdWFuZG8gbyBjYW1wbyBpbnRlaXJvIGVzdMOhIHNlbGVjaW9uYWRvLCBleC46IEN0cmwrQSkuICovXG4gICAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiB0aGlzLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpO1xuICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBJbmNyZW1lbnRhL2RlY3JlbWVudGEgbyBzZWdtZW50byBhdGl2bywgZGFuZG8gYSB2b2x0YSAod3JhcCkgZGVudHJvIGRvIHJhbmdlIHbDoWxpZG8uICovXG4gICAgaW5jcmVtZW50QWN0aXZlU2VnbWVudChkZWx0YTogMSB8IC0xKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJykge1xuICAgICAgICAgICAgdGhpcy5zZXRBbVBtKHNlZ21lbnQudGV4dCA9PT0gJ1BNJyA/IDAgOiAxKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiArIDE7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWdtZW50LnRleHQgPyBwYXJzZUludChzZWdtZW50LnRleHQsIDEwKSA6IGRlbHRhID4gMCA/IG1pbiAtIDEgOiBtaW47XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKChjdXJyZW50ICsgZGVsdGEgLSBtaW4pICUgcmFuZ2UpICsgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IFN0cmluZyhuZXh0KS5wYWRTdGFydChzZWdtZW50Lmxlbmd0aCwgJzAnKTtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNvbmNpbGVEYXlJZk5lZWRlZChzZWdtZW50LmtpbmQpO1xuICAgIH1cblxuICAgIC8qKiBQYWQvY2xhbXAgZG8gc2VnbWVudG8gYXRpdm8gKGV4LjogXCIyXCIgLT4gXCIwMlwiLCBcIjQ1XCIgbm8gZGlhIC0+IGNsYW1wIHBhcmEgZGF5c0luTW9udGgpLiAqL1xuICAgIGNvbW1pdEFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGtpbmQgPSBzZWdtZW50LmtpbmQ7XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHRoaXMuY2xhbXBBbmRQYWQoc2VnbWVudCk7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjb25jaWxlRGF5SWZOZWVkZWQoa2luZCk7XG4gICAgfVxuXG4gICAgLyoqIENvbW1pdGEgbyBzZWdtZW50byBhdGl2byBlIHNhaSBkbyBtb2RvIGRlIGVkacOnw6NvICh1c2FkbyBubyBibHVyIGRvIGNhbXBvKS4gKi9cbiAgICBkZWFjdGl2YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1pdEFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGFtcEFuZFBhZChzZWdtZW50OiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJyB8fCBzZWdtZW50LmtpbmQgPT09ICd5ZWFyJyB8fCAhc2VnbWVudC50ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2VnbWVudC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KHNlZ21lbnQudGV4dCwgMTApO1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG51bSkpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKGNsYW1wZWQpLnBhZFN0YXJ0KHNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYm91bmRzRm9yKGtpbmQ6IFNlZ21lbnRLaW5kKTogeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfSB7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IDEsIG1heDogdGhpcy5kYXlzSW5Nb250aE5vdygpIH07XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAxLCBtYXg6IEhPVVJTX1BFUl9NRVJJRElFTSB9O1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5ob3VyRm9ybWF0ID09PSAnMTInXG4gICAgICAgICAgICAgICAgICAgID8geyBtaW46IDEsIG1heDogSE9VUlNfUEVSX01FUklESUVNIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IG1pbjogMCwgbWF4OiBNQVhfSE9VUl8yNCB9O1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAwLCBtYXg6IE1BWF9NSU5VVEVfU0VDT05EIH07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG1pbjogMCwgbWF4OiA5OTk5IH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCb3VuZCBkbyBkaWEgZGVwZW5kZW5kbyBkbyBxdWUgasOhIMOpIGNvbmhlY2lkbyBkZSBtw6pzL2Fuby4gTnVuY2EgXCJhZGl2aW5oYVwiIGNvbSBvIG3DqnMvYW5vXG4gICAgICogYXR1YWlzIGRvIHNpc3RlbWEg4oCUIGlzc28gZXN0cmVpdGFyaWEgbyByYW5nZSBhbnRlcyBkYSBob3JhIChleC46IGRpYT0yOSBkaWdpdGFkbyBhbnRlcyBkb1xuICAgICAqIGFubywgbcOqcz1mZXZlcmVpcm8gY29uaGVjaWRvIG1hcyBhbm8gYWluZGEgbsOjbyAtPiBzZSBhc3N1bWlzc2UgbyBhbm8gYXR1YWwgZG8gc2lzdGVtYSBlIGVsZVxuICAgICAqIG7Do28gZm9zc2UgYmlzc2V4dG8sIG8gZGlhIHNlcmlhIGNsYW1wYWRvIHBhcmEgMjggZSBudW5jYSBtYWlzIHJlZXhwYW5kaWRvIHBhcmEgMjkgbWVzbW8gcXVlXG4gICAgICogbyBhbm8gcmVhbG1lbnRlIGRpZ2l0YWRvIGRlcG9pcyBzZWphIGJpc3NleHRvKS4gRW0gdmV6IGRpc3NvLCBmaWNhIHNlbXByZSBubyBsYWRvIHBlcm1pc3Npdm9cbiAgICAgKiBhdMOpIHF1ZSBhIGluZm9ybWHDp8OjbyByZWFsbWVudGUgZXhpc3RhLlxuICAgICAqL1xuICAgIHByaXZhdGUgZGF5c0luTW9udGhOb3coKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW9udGhTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoS25vd24gPSAhIW1vbnRoU2VnbWVudD8udGV4dCAmJiBtb250aFNlZ21lbnQudGV4dC5sZW5ndGggPT09IG1vbnRoU2VnbWVudC5sZW5ndGg7XG4gICAgICAgIGlmICghbW9udGhTZWdtZW50IHx8ICFtb250aEtub3duKSByZXR1cm4gR0VORVJJQ19NQVhfREFZO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1vbnRoU2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXJTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ3llYXInKTtcbiAgICAgICAgY29uc3QgeWVhcktub3duID0gISF5ZWFyU2VnbWVudD8udGV4dCAmJiB5ZWFyU2VnbWVudC50ZXh0Lmxlbmd0aCA9PT0gWUVBUl9TRUdNRU5UX0xFTkdUSDtcbiAgICAgICAgaWYgKCF5ZWFyU2VnbWVudCB8fCAheWVhcktub3duKSByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIExFQVBfUkVGRVJFTkNFX1lFQVIpO1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIHBhcnNlSW50KHllYXJTZWdtZW50LnRleHQsIDEwKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVEYXlJZk5lZWRlZChjb21taXR0ZWRLaW5kOiBTZWdtZW50S2luZCk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWl0dGVkS2luZCAhPT0gJ21vbnRoJyAmJiBjb21taXR0ZWRLaW5kICE9PSAneWVhcicpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF5U2VnbWVudCA9IHRoaXMuZmluZEVkaXRhYmxlKCdkYXknKTtcbiAgICAgICAgaWYgKCFkYXlTZWdtZW50IHx8IGRheVNlZ21lbnQudGV4dC5sZW5ndGggIT09IGRheVNlZ21lbnQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZGF5c0luTW9udGhOb3coKTtcbiAgICAgICAgY29uc3QgZGF5TnVtID0gcGFyc2VJbnQoZGF5U2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGlmIChkYXlOdW0gPiBtYXgpIHtcbiAgICAgICAgICAgIGRheVNlZ21lbnQudGV4dCA9IFN0cmluZyhtYXgpLnBhZFN0YXJ0KGRheVNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRWRpdGFibGUoa2luZDogU2VnbWVudEtpbmQpOiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLmZpbmQoKHMpOiBzIGlzIEVkaXRhYmxlU2VnbWVudFN0YXRlID0+IGlzRWRpdGFibGVTZWdtZW50KHMpICYmIHMua2luZCA9PT0ga2luZCk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuZXZlcnkoKHMpID0+ICFpc0VkaXRhYmxlU2VnbWVudChzKSB8fCBzLnRleHQgPT09ICcnKTtcbiAgICB9XG5cbiAgICBpc0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5ldmVyeSgocykgPT4gIWlzRWRpdGFibGVTZWdtZW50KHMpIHx8IHMudGV4dC5sZW5ndGggPT09IHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsb2FkRnJvbURhdGUoZGF0ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgaWYgKCFpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWdtZW50LnRleHQgPSB0aGlzLnJlbmRlclZhbHVlRm9yKHNlZ21lbnQua2luZCwgZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclZhbHVlRm9yKGtpbmQ6IFNlZ21lbnRLaW5kLCBkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSkucGFkU3RhcnQoWUVBUl9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicgPyAoaCAlIEhPVVJTX1BFUl9NRVJJRElFTSA9PT0gMCA/IEhPVVJTX1BFUl9NRVJJRElFTSA6IGggJSBIT1VSU19QRVJfTUVSSURJRU0pIDogaDtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRpc3BsYXkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydChTSE9SVF9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhkYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICdhbXBtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgSE9VUlNfUEVSX01FUklESUVNID8gJ0FNJyA6ICdQTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ29uc3Ryw7NpIG8gYERhdGVgIGEgcGFydGlyIGRvcyBzZWdtZW50b3M7IGBudWxsYCBlbnF1YW50byBpbmNvbXBsZXRvLiBVc2EgYHJlZmVyZW5jZURhdGVgIHBhcmEgcHJlZW5jaGVyIHBhcnRlcyBhdXNlbnRlcyAoZXguOiBob3JhIGFvIGVkaXRhciBzw7MgYSBkYXRhKS4gKi9cbiAgICB0b0RhdGUocmVmZXJlbmNlRGF0ZT86IERhdGUgfCBudWxsKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVmID0gcmVmZXJlbmNlRGF0ZSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBnZXROdW0gPSAoa2luZDogU2VnbWVudEtpbmQpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLmZpbmRFZGl0YWJsZShraW5kKTtcbiAgICAgICAgICAgIHJldHVybiBzZWdtZW50ID8gcGFyc2VJbnQoc2VnbWVudC50ZXh0LCAxMCkgOiBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHllYXIgPSBnZXROdW0oJ3llYXInKSA/PyByZWYuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGhOdW0gPSBnZXROdW0oJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbW9udGhOdW0gIT09IG51bGwgPyBtb250aE51bSAtIDEgOiByZWYuZ2V0TW9udGgoKTtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5jb25maWc/Lm1vZGUgPT09ICdtb250aCcgPyAxIDogKGdldE51bSgnZGF5JykgPz8gcmVmLmdldERhdGUoKSk7XG5cbiAgICAgICAgbGV0IGhvdXIgPSBnZXROdW0oJ2hvdXInKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gZ2V0TnVtKCdtaW51dGUnKSA/PyByZWYuZ2V0TWludXRlcygpO1xuICAgICAgICBjb25zdCBzZWNvbmQgPSBnZXROdW0oJ3NlY29uZCcpID8/IHJlZi5nZXRTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKGhvdXIgIT09IG51bGwgJiYgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcG1TZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ2FtcG0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUG0gPSBhbXBtU2VnbWVudD8udGV4dCA9PT0gJ1BNJztcbiAgICAgICAgICAgIGhvdXIgPSBob3VyICUgSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICAgICAgaWYgKGlzUG0pIGhvdXIgKz0gSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIgPz8gcmVmLmdldEhvdXJzKCksIG1pbnV0ZSwgc2Vjb25kKTtcbiAgICB9XG59XG4iXX0=
|