@careonbrasil/dashboard 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +355 -0
- package/esm2020/careonbrasil-dashboard.mjs +5 -0
- package/esm2020/lib/careon-dashboard.module.mjs +43 -0
- package/esm2020/lib/components/dashboard-icon/dashboard-icon.component.mjs +32 -0
- package/esm2020/lib/components/dashboard-skeleton/dashboard-skeleton.component.mjs +17 -0
- package/esm2020/lib/components/performance-wave/performance-wave.component.mjs +30 -0
- package/esm2020/lib/dashboard.component.mjs +522 -0
- package/esm2020/lib/models/dashboard.models.mjs +42 -0
- package/esm2020/public-api.mjs +10 -0
- package/fesm2015/careonbrasil-dashboard.mjs +703 -0
- package/fesm2015/careonbrasil-dashboard.mjs.map +1 -0
- package/fesm2020/careonbrasil-dashboard.mjs +677 -0
- package/fesm2020/careonbrasil-dashboard.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/careon-dashboard.module.d.ts +12 -0
- package/lib/components/dashboard-icon/dashboard-icon.component.d.ts +18 -0
- package/lib/components/dashboard-skeleton/dashboard-skeleton.component.d.ts +10 -0
- package/lib/components/performance-wave/performance-wave.component.d.ts +19 -0
- package/lib/dashboard.component.d.ts +173 -0
- package/lib/models/dashboard.models.d.ts +200 -0
- package/package.json +36 -0
- package/public-api.d.ts +6 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { DashboardPeriod, PerformanceLevel, DutySalaryStatus } from './models/dashboard.models';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "@careonbrasil/ng-charts";
|
|
6
|
+
import * as i3 from "./components/performance-wave/performance-wave.component";
|
|
7
|
+
import * as i4 from "./components/dashboard-icon/dashboard-icon.component";
|
|
8
|
+
import * as i5 from "./components/dashboard-skeleton/dashboard-skeleton.component";
|
|
9
|
+
export function formatKpiBadge(diff, polarity, isDecimal = false) {
|
|
10
|
+
const isZero = diff === 0;
|
|
11
|
+
const isPositive = diff > 0;
|
|
12
|
+
const isNegative = diff < 0;
|
|
13
|
+
const changeText = isZero
|
|
14
|
+
? (isDecimal ? '0,0' : '0')
|
|
15
|
+
: (isDecimal ? Math.abs(diff).toFixed(1).replace('.', ',') : `${Math.abs(diff)}`);
|
|
16
|
+
let badgeClass = 'kpi-badge--gray';
|
|
17
|
+
if (!isZero) {
|
|
18
|
+
if (polarity === 'neutral') {
|
|
19
|
+
badgeClass = 'kpi-badge--blue';
|
|
20
|
+
}
|
|
21
|
+
else if (polarity === 'higherIsBetter') {
|
|
22
|
+
badgeClass = isPositive ? 'kpi-badge--green' : 'kpi-badge--coral';
|
|
23
|
+
}
|
|
24
|
+
else if (polarity === 'lowerIsBetter') {
|
|
25
|
+
badgeClass = isPositive ? 'kpi-badge--coral' : 'kpi-badge--green';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { changeText, badgeClass, isPositive, isNegative, isZero };
|
|
29
|
+
}
|
|
30
|
+
export const DEFAULT_PERFORMANCE_TEXTS = {
|
|
31
|
+
[PerformanceLevel.Blue]: {
|
|
32
|
+
title: 'Ainda tem espaço para se destacar.',
|
|
33
|
+
description: 'Sua instituição já desperta bom interesse entre os candidatos. Fale com um consultor da CareOn para ir ainda mais longe.'
|
|
34
|
+
},
|
|
35
|
+
[PerformanceLevel.Orange]: {
|
|
36
|
+
title: 'Suas vagas estão sendo vistas, mas pouca gente se candidata.',
|
|
37
|
+
description: 'Isso pode indicar que os valores oferecidos estão abaixo da média da região, que faltam informações mais atrativas ou que suas informações estão incompletas. Fale com um consultor da CareOn.'
|
|
38
|
+
},
|
|
39
|
+
[PerformanceLevel.Red]: {
|
|
40
|
+
title: 'Sua instituição não está sendo muito procurada pelos candidatos.',
|
|
41
|
+
description: 'Faz tempo que você não publica uma vaga, por isso sua análise de desempenho vem caindo. Fale com um consultor da CareOn para ter um apoio personalizado.'
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Componente principal de Dashboard de Recrutamento Institucional da CareOn.
|
|
46
|
+
*
|
|
47
|
+
* Centraliza e orquestra a exibicao de:
|
|
48
|
+
* - Cabecalho com filtros temporais reativos (Hoje, Semana, Mes)
|
|
49
|
+
* - Cards superiores de Indicadores-Chave de Performance (KPIs)
|
|
50
|
+
* - Secao acionavel "Precisa da sua atencao" (alertas de vagas criticas)
|
|
51
|
+
* - Secao "Analise de Desempenho" (curva de ondas vetorial e orientacao consultiva)
|
|
52
|
+
* - Secao "Analise por Vaga" (dropdown de vagas, timeline, donut de conversao, funil e analise salarial)
|
|
53
|
+
* - Secao "Candidaturas por Vaga" (grafico comparativo de barras entre vagas)
|
|
54
|
+
*/
|
|
55
|
+
export class DashboardComponent {
|
|
56
|
+
constructor(cdr) {
|
|
57
|
+
this.cdr = cdr;
|
|
58
|
+
/**
|
|
59
|
+
* Whether the dashboard is currently fetching data from the backend API.
|
|
60
|
+
* @default false
|
|
61
|
+
*/
|
|
62
|
+
this.loading = false;
|
|
63
|
+
/**
|
|
64
|
+
* Active time period filter.
|
|
65
|
+
* @default 'Week'
|
|
66
|
+
*/
|
|
67
|
+
this.currentPeriod = DashboardPeriod.Week;
|
|
68
|
+
this.DutySalaryStatus = DutySalaryStatus;
|
|
69
|
+
this.PerformanceLevel = PerformanceLevel;
|
|
70
|
+
this.DashboardPeriod = DashboardPeriod;
|
|
71
|
+
/**
|
|
72
|
+
* Main dashboard title.
|
|
73
|
+
* @default 'Dashboard'
|
|
74
|
+
*/
|
|
75
|
+
this.title = 'Dashboard';
|
|
76
|
+
/**
|
|
77
|
+
* Optional subtitle or institution name displayed in the header.
|
|
78
|
+
* @default 'Visão geral de recrutamento'
|
|
79
|
+
*/
|
|
80
|
+
this.subtitle = 'Visão geral de recrutamento';
|
|
81
|
+
/**
|
|
82
|
+
* Empty state message when no data is returned.
|
|
83
|
+
*/
|
|
84
|
+
this.emptyMessage = 'Nenhum dado registrado para o período selecionado.';
|
|
85
|
+
/**
|
|
86
|
+
* Consultant phone number for WhatsApp redirect.
|
|
87
|
+
* @default '5547996569707'
|
|
88
|
+
*/
|
|
89
|
+
this.consultantPhone = '5547996569707';
|
|
90
|
+
/**
|
|
91
|
+
* Initial message for WhatsApp consultant chat.
|
|
92
|
+
* @default 'empty string'
|
|
93
|
+
*/
|
|
94
|
+
this.consultantMessage = '';
|
|
95
|
+
/**
|
|
96
|
+
* Controls whether zeroed states display the actionable 'Publicar Vaga' CTA banner or a basic informational zero state.
|
|
97
|
+
* - 'publish': displays the special business zero state with the 'Publicar Vaga' action button.
|
|
98
|
+
* - 'basic': displays the simple/basic zero state without the 'Publicar Vaga' action button.
|
|
99
|
+
* @default 'publish'
|
|
100
|
+
*/
|
|
101
|
+
this.zeroStateMode = 'publish';
|
|
102
|
+
// #endregion
|
|
103
|
+
// #region Outputs
|
|
104
|
+
/**
|
|
105
|
+
* Emitted whenever the user selects a different period filter (Today, Week, Month).
|
|
106
|
+
*/
|
|
107
|
+
this.periodChange = new EventEmitter();
|
|
108
|
+
/**
|
|
109
|
+
* Emitted whenever an interactive element in any chart is clicked (reserved for upcoming chart sections).
|
|
110
|
+
*/
|
|
111
|
+
this.itemSelected = new EventEmitter();
|
|
112
|
+
/**
|
|
113
|
+
* Emitted whenever the user clicks on 'Publicar Vaga' across any of the zero-state banners.
|
|
114
|
+
*/
|
|
115
|
+
this.publishDuty = new EventEmitter();
|
|
116
|
+
/**
|
|
117
|
+
* Emitted whenever the user selects a duty in the vacancy analysis dropdown.
|
|
118
|
+
*/
|
|
119
|
+
this.dutySelected = new EventEmitter();
|
|
120
|
+
/**
|
|
121
|
+
* Emitted whenever the user clicks on 'Fale com um consultor' across any section.
|
|
122
|
+
*/
|
|
123
|
+
this.consultantClick = new EventEmitter();
|
|
124
|
+
/**
|
|
125
|
+
* Emitted whenever a vacancy in the attention list is clicked.
|
|
126
|
+
*/
|
|
127
|
+
this.attentionItemSelected = new EventEmitter();
|
|
128
|
+
// #endregion
|
|
129
|
+
// #region PerformanceAnalysisSection
|
|
130
|
+
this.showInfoTooltip = false;
|
|
131
|
+
// #endregion
|
|
132
|
+
// #region VacancyAnalysisSection
|
|
133
|
+
this.selectedDutyId = null;
|
|
134
|
+
this.isDutyDropdownOpen = false;
|
|
135
|
+
}
|
|
136
|
+
get isPublishZeroState() {
|
|
137
|
+
return this.zeroStateMode === 'publish';
|
|
138
|
+
}
|
|
139
|
+
// #endregion
|
|
140
|
+
onPublishDuty(section = 'Zero State') {
|
|
141
|
+
this.publishDuty.emit(section);
|
|
142
|
+
}
|
|
143
|
+
ngOnChanges(changes) {
|
|
144
|
+
if (changes['data']) {
|
|
145
|
+
this.syncSelectedDuty();
|
|
146
|
+
this.cdr.markForCheck();
|
|
147
|
+
}
|
|
148
|
+
if (changes['loading'] || changes['currentPeriod']) {
|
|
149
|
+
this.cdr.markForCheck();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
syncSelectedDuty() {
|
|
153
|
+
if (!this.vacanciesAnalysis || this.vacanciesAnalysis.length === 0) {
|
|
154
|
+
this.selectedDutyId = null;
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const exists = this.vacanciesAnalysis.some(d => d.dutyId === this.selectedDutyId);
|
|
158
|
+
if (!exists) {
|
|
159
|
+
this.selectedDutyId = this.vacanciesAnalysis[0].dutyId;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// #region AttentionSection
|
|
163
|
+
get attentionItems() {
|
|
164
|
+
return this.data?.attentionItems ?? [];
|
|
165
|
+
}
|
|
166
|
+
onAttentionItemClick(item) {
|
|
167
|
+
this.attentionItemSelected.emit(item);
|
|
168
|
+
}
|
|
169
|
+
openConsultantWhatsApp(section = 'Consultor') {
|
|
170
|
+
this.consultantClick.emit(section);
|
|
171
|
+
if (typeof window !== 'undefined') {
|
|
172
|
+
const cleanPhone = (this.consultantPhone || '5547996569707').replace(/\D/g, '');
|
|
173
|
+
const textParam = this.consultantMessage
|
|
174
|
+
? `&text=${encodeURIComponent(this.consultantMessage)}`
|
|
175
|
+
: '';
|
|
176
|
+
const whatsappUrl = `https://api.whatsapp.com/send?phone=${cleanPhone}${textParam}`;
|
|
177
|
+
window.open(whatsappUrl, '_blank', 'noopener,noreferrer');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
toggleInfoTooltip() {
|
|
181
|
+
this.showInfoTooltip = !this.showInfoTooltip;
|
|
182
|
+
this.cdr.markForCheck();
|
|
183
|
+
}
|
|
184
|
+
onInfoMouseEnter() {
|
|
185
|
+
this.showInfoTooltip = true;
|
|
186
|
+
this.cdr.markForCheck();
|
|
187
|
+
}
|
|
188
|
+
onInfoMouseLeave() {
|
|
189
|
+
this.showInfoTooltip = false;
|
|
190
|
+
this.cdr.markForCheck();
|
|
191
|
+
}
|
|
192
|
+
get performanceAnalysis() {
|
|
193
|
+
return this.data?.performanceAnalysis;
|
|
194
|
+
}
|
|
195
|
+
get performanceLevel() {
|
|
196
|
+
const level = this.performanceAnalysis?.level;
|
|
197
|
+
if (level === PerformanceLevel.Blue || level === 0)
|
|
198
|
+
return PerformanceLevel.Blue;
|
|
199
|
+
if (level === PerformanceLevel.Orange || level === 1)
|
|
200
|
+
return PerformanceLevel.Orange;
|
|
201
|
+
if (level === PerformanceLevel.Red || level === 2)
|
|
202
|
+
return PerformanceLevel.Red;
|
|
203
|
+
return PerformanceLevel.Red;
|
|
204
|
+
}
|
|
205
|
+
get performanceTitle() {
|
|
206
|
+
return this.performanceAnalysis?.highlightTitle
|
|
207
|
+
|| DEFAULT_PERFORMANCE_TEXTS[this.performanceLevel]?.title
|
|
208
|
+
|| DEFAULT_PERFORMANCE_TEXTS[PerformanceLevel.Red].title;
|
|
209
|
+
}
|
|
210
|
+
get performanceDescription() {
|
|
211
|
+
return this.performanceAnalysis?.description
|
|
212
|
+
|| DEFAULT_PERFORMANCE_TEXTS[this.performanceLevel]?.description
|
|
213
|
+
|| DEFAULT_PERFORMANCE_TEXTS[PerformanceLevel.Red].description;
|
|
214
|
+
}
|
|
215
|
+
get vacanciesAnalysis() {
|
|
216
|
+
return this.data?.vacanciesAnalysis ?? [];
|
|
217
|
+
}
|
|
218
|
+
get selectedDuty() {
|
|
219
|
+
if (this.vacanciesAnalysis.length === 0)
|
|
220
|
+
return null;
|
|
221
|
+
if (this.selectedDutyId) {
|
|
222
|
+
const found = this.vacanciesAnalysis.find(d => d.dutyId === this.selectedDutyId);
|
|
223
|
+
if (found)
|
|
224
|
+
return found;
|
|
225
|
+
}
|
|
226
|
+
return this.vacanciesAnalysis[0];
|
|
227
|
+
}
|
|
228
|
+
toggleDutyDropdown() {
|
|
229
|
+
this.isDutyDropdownOpen = !this.isDutyDropdownOpen;
|
|
230
|
+
}
|
|
231
|
+
closeDutyDropdown() {
|
|
232
|
+
this.isDutyDropdownOpen = false;
|
|
233
|
+
}
|
|
234
|
+
selectDuty(duty) {
|
|
235
|
+
this.selectedDutyId = duty.dutyId;
|
|
236
|
+
this.isDutyDropdownOpen = false;
|
|
237
|
+
this.dutySelected.emit(duty);
|
|
238
|
+
}
|
|
239
|
+
get vacancySectionSubtitle() {
|
|
240
|
+
const candidates = this.selectedDuty?.candidatesCount ?? 0;
|
|
241
|
+
const candText = candidates === 1 ? 'candidatura' : 'candidaturas';
|
|
242
|
+
switch (this.currentPeriod) {
|
|
243
|
+
case DashboardPeriod.Week:
|
|
244
|
+
return `${candidates} ${candText} nos últimos 7 dias`;
|
|
245
|
+
case DashboardPeriod.Month:
|
|
246
|
+
return `${candidates} ${candText} neste mês`;
|
|
247
|
+
case DashboardPeriod.Today:
|
|
248
|
+
default:
|
|
249
|
+
return `${candidates} ${candText} hoje`;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
get selectedDutyTimelinePoints() {
|
|
253
|
+
return this.selectedDuty?.timelinePoints ?? [];
|
|
254
|
+
}
|
|
255
|
+
get selectedDutyDonutItems() {
|
|
256
|
+
if (this.selectedDuty?.conversionDonut && this.selectedDuty.conversionDonut.length > 0) {
|
|
257
|
+
return this.selectedDuty.conversionDonut;
|
|
258
|
+
}
|
|
259
|
+
const views = this.selectedDuty?.viewsCount ?? 0;
|
|
260
|
+
const candidates = this.selectedDuty?.candidatesCount ?? 0;
|
|
261
|
+
return [
|
|
262
|
+
{ label: 'Visualizações', value: views, color: '#1E1B4B' },
|
|
263
|
+
{ label: 'Candidaturas', value: candidates, color: '#3B82F6' }
|
|
264
|
+
];
|
|
265
|
+
}
|
|
266
|
+
get selectedDutyConversionRateText() {
|
|
267
|
+
const rate = this.selectedDuty?.conversionRate ?? 0;
|
|
268
|
+
return `${rate}%`;
|
|
269
|
+
}
|
|
270
|
+
get selectedDutyFunnelItems() {
|
|
271
|
+
if (this.selectedDuty?.funnelItems && this.selectedDuty.funnelItems.length > 0) {
|
|
272
|
+
return this.selectedDuty.funnelItems;
|
|
273
|
+
}
|
|
274
|
+
const views = this.selectedDuty?.viewsCount ?? 0;
|
|
275
|
+
const candidates = this.selectedDuty?.candidatesCount ?? 0;
|
|
276
|
+
return [
|
|
277
|
+
{ label: 'Visualizações', count: views, barColor: '#1E1B4B' },
|
|
278
|
+
{ label: 'Candidaturas', count: candidates, barColor: '#3B82F6' }
|
|
279
|
+
];
|
|
280
|
+
}
|
|
281
|
+
onTimelinePointSelected(point) {
|
|
282
|
+
this.itemSelected.emit({
|
|
283
|
+
chart: 'Linha Temporal por Vaga',
|
|
284
|
+
item: point
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// #endregion
|
|
288
|
+
// #region VacancySalaryComparisonSection
|
|
289
|
+
get selectedDutySalaryComparison() {
|
|
290
|
+
return this.selectedDuty?.salaryComparison;
|
|
291
|
+
}
|
|
292
|
+
get salaryStatus() {
|
|
293
|
+
const s = this.selectedDutySalaryComparison?.status;
|
|
294
|
+
if (s === DutySalaryStatus.BelowMarket || s === 0)
|
|
295
|
+
return DutySalaryStatus.BelowMarket;
|
|
296
|
+
if (s === DutySalaryStatus.AtMarket || s === 1)
|
|
297
|
+
return DutySalaryStatus.AtMarket;
|
|
298
|
+
if (s === DutySalaryStatus.AboveMarket || s === 2)
|
|
299
|
+
return DutySalaryStatus.AboveMarket;
|
|
300
|
+
if (s === DutySalaryStatus.NotInformed || s === 3)
|
|
301
|
+
return DutySalaryStatus.NotInformed;
|
|
302
|
+
if (s === DutySalaryStatus.InsufficientData || s === 4)
|
|
303
|
+
return DutySalaryStatus.InsufficientData;
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
formatCurrency(value) {
|
|
307
|
+
if (value === null || value === undefined) {
|
|
308
|
+
return '';
|
|
309
|
+
}
|
|
310
|
+
return new Intl.NumberFormat('pt-BR', {
|
|
311
|
+
style: 'currency',
|
|
312
|
+
currency: 'BRL',
|
|
313
|
+
maximumFractionDigits: 0
|
|
314
|
+
}).format(value).replace(/\u00A0/g, ' ');
|
|
315
|
+
}
|
|
316
|
+
get formattedYourSalary() {
|
|
317
|
+
const comparison = this.selectedDutySalaryComparison;
|
|
318
|
+
if (!comparison || this.salaryStatus === DutySalaryStatus.NotInformed || comparison.yourSalary === null || comparison.yourSalary === undefined) {
|
|
319
|
+
return 'Não informado';
|
|
320
|
+
}
|
|
321
|
+
return this.formatCurrency(comparison.yourSalary);
|
|
322
|
+
}
|
|
323
|
+
get formattedRegionalAverage() {
|
|
324
|
+
const comparison = this.selectedDutySalaryComparison;
|
|
325
|
+
if (!comparison || this.salaryStatus === DutySalaryStatus.InsufficientData || comparison.regionalAverageSalary === null || comparison.regionalAverageSalary === undefined) {
|
|
326
|
+
return 'Dados insuficientes';
|
|
327
|
+
}
|
|
328
|
+
return this.formatCurrency(comparison.regionalAverageSalary);
|
|
329
|
+
}
|
|
330
|
+
get salaryBadgeClass() {
|
|
331
|
+
switch (this.salaryStatus) {
|
|
332
|
+
case DutySalaryStatus.BelowMarket:
|
|
333
|
+
return 'salary-badge--orange';
|
|
334
|
+
case DutySalaryStatus.AtMarket:
|
|
335
|
+
return 'salary-badge--blue';
|
|
336
|
+
case DutySalaryStatus.AboveMarket:
|
|
337
|
+
return 'salary-badge--purple';
|
|
338
|
+
default:
|
|
339
|
+
return '';
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
get salaryTitleColorClass() {
|
|
343
|
+
switch (this.salaryStatus) {
|
|
344
|
+
case DutySalaryStatus.BelowMarket:
|
|
345
|
+
return 'salary-title--orange';
|
|
346
|
+
case DutySalaryStatus.AtMarket:
|
|
347
|
+
return 'salary-title--blue';
|
|
348
|
+
case DutySalaryStatus.AboveMarket:
|
|
349
|
+
return 'salary-title--purple';
|
|
350
|
+
case DutySalaryStatus.NotInformed:
|
|
351
|
+
return 'salary-title--red';
|
|
352
|
+
case DutySalaryStatus.InsufficientData:
|
|
353
|
+
default:
|
|
354
|
+
return 'salary-title--default';
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// #endregion
|
|
358
|
+
// #region KpiGetters
|
|
359
|
+
// 1. Vagas Publicadas
|
|
360
|
+
get registeredVacancies() {
|
|
361
|
+
return this.data?.kpis?.registeredVacancies ?? 0;
|
|
362
|
+
}
|
|
363
|
+
get registeredVacanciesDiff() {
|
|
364
|
+
return this.data?.kpis?.registeredVacanciesDifference ?? 0;
|
|
365
|
+
}
|
|
366
|
+
get registeredVacanciesBadge() {
|
|
367
|
+
return formatKpiBadge(this.registeredVacanciesDiff, 'neutral');
|
|
368
|
+
}
|
|
369
|
+
get registeredVacanciesChange() {
|
|
370
|
+
return this.registeredVacanciesBadge.changeText;
|
|
371
|
+
}
|
|
372
|
+
get registeredVacanciesBadgeClass() {
|
|
373
|
+
return this.registeredVacanciesBadge.badgeClass;
|
|
374
|
+
}
|
|
375
|
+
// 2. Candidatos Inscritos
|
|
376
|
+
get candidateApplications() {
|
|
377
|
+
return this.data?.kpis?.candidateApplications ?? 0;
|
|
378
|
+
}
|
|
379
|
+
get candidateApplicationsDiff() {
|
|
380
|
+
return this.data?.kpis?.candidateApplicationsDifference ?? 0;
|
|
381
|
+
}
|
|
382
|
+
get candidateApplicationsBadge() {
|
|
383
|
+
return formatKpiBadge(this.candidateApplicationsDiff, 'higherIsBetter');
|
|
384
|
+
}
|
|
385
|
+
get candidateApplicationsChange() {
|
|
386
|
+
return this.candidateApplicationsBadge.changeText;
|
|
387
|
+
}
|
|
388
|
+
get candidateApplicationsBadgeClass() {
|
|
389
|
+
return this.candidateApplicationsBadge.badgeClass;
|
|
390
|
+
}
|
|
391
|
+
// 3. Currículos para Avaliar
|
|
392
|
+
get pendingReviews() {
|
|
393
|
+
return this.data?.kpis?.pendingReviews ?? 0;
|
|
394
|
+
}
|
|
395
|
+
get pendingReviewsDiff() {
|
|
396
|
+
return this.data?.kpis?.pendingReviewsDifference ?? 0;
|
|
397
|
+
}
|
|
398
|
+
get pendingReviewsBadge() {
|
|
399
|
+
return formatKpiBadge(this.pendingReviewsDiff, 'lowerIsBetter');
|
|
400
|
+
}
|
|
401
|
+
get pendingReviewsChange() {
|
|
402
|
+
return this.pendingReviewsBadge.changeText;
|
|
403
|
+
}
|
|
404
|
+
get pendingReviewsBadgeClass() {
|
|
405
|
+
return this.pendingReviewsBadge.badgeClass;
|
|
406
|
+
}
|
|
407
|
+
// 4. Média de Candidatos
|
|
408
|
+
get averageCandidatesPerVacancy() {
|
|
409
|
+
const avg = this.data?.kpis?.averageCandidatesPerVacancy;
|
|
410
|
+
if (avg === undefined || avg === null)
|
|
411
|
+
return '0,0';
|
|
412
|
+
return avg.toFixed(1).replace('.', ',');
|
|
413
|
+
}
|
|
414
|
+
get averageCandidatesDiff() {
|
|
415
|
+
return this.data?.kpis?.averageCandidatesDifference ?? 0;
|
|
416
|
+
}
|
|
417
|
+
get averageCandidatesBadge() {
|
|
418
|
+
return formatKpiBadge(this.averageCandidatesDiff, 'higherIsBetter', true);
|
|
419
|
+
}
|
|
420
|
+
get averageCandidatesChange() {
|
|
421
|
+
return this.averageCandidatesBadge.changeText;
|
|
422
|
+
}
|
|
423
|
+
get averageCandidatesBadgeClass() {
|
|
424
|
+
return this.averageCandidatesBadge.badgeClass;
|
|
425
|
+
}
|
|
426
|
+
// 5. Status das Vagas
|
|
427
|
+
get openVacancies() {
|
|
428
|
+
return this.data?.kpis?.openVacancies ?? 0;
|
|
429
|
+
}
|
|
430
|
+
get closedVacancies() {
|
|
431
|
+
return this.data?.kpis?.closedVacancies ?? 0;
|
|
432
|
+
}
|
|
433
|
+
get totalDutiesCount() {
|
|
434
|
+
return this.data?.kpis?.totalVacancies ?? (this.openVacancies + this.closedVacancies);
|
|
435
|
+
}
|
|
436
|
+
get dutiesStatusItems() {
|
|
437
|
+
if (this.data?.dutiesStatus && this.data.dutiesStatus.length > 0) {
|
|
438
|
+
return this.data.dutiesStatus;
|
|
439
|
+
}
|
|
440
|
+
return [
|
|
441
|
+
{ label: 'Abertas', value: this.openVacancies, color: '#3B82F6' },
|
|
442
|
+
{ label: 'Encerradas', value: this.closedVacancies, color: '#1E1B4B' }
|
|
443
|
+
];
|
|
444
|
+
}
|
|
445
|
+
// #endregion
|
|
446
|
+
// #region ComparisonSection
|
|
447
|
+
get comparisonItems() {
|
|
448
|
+
return this.data?.comparison ?? [];
|
|
449
|
+
}
|
|
450
|
+
get hasComparisonDuties() {
|
|
451
|
+
return this.comparisonItems.length > 0;
|
|
452
|
+
}
|
|
453
|
+
get totalComparisonCandidates() {
|
|
454
|
+
return this.comparisonItems.reduce((acc, curr) => acc + (curr.value || 0), 0);
|
|
455
|
+
}
|
|
456
|
+
get totalComparisonVacancies() {
|
|
457
|
+
return this.comparisonItems.length;
|
|
458
|
+
}
|
|
459
|
+
get comparisonSubtitle() {
|
|
460
|
+
const candCount = this.totalComparisonCandidates;
|
|
461
|
+
const dutyCount = this.totalComparisonVacancies;
|
|
462
|
+
const candText = candCount === 1 ? '1 candidatura no total' : `${candCount} candidaturas no total`;
|
|
463
|
+
const dutyText = dutyCount === 1 ? '1 vaga ativa' : `${dutyCount} vagas ativas`;
|
|
464
|
+
return `${candText}, em ${dutyText}`;
|
|
465
|
+
}
|
|
466
|
+
// #endregion
|
|
467
|
+
// #region StateHelpers
|
|
468
|
+
get hasData() {
|
|
469
|
+
return !!this.data && !!this.data.kpis;
|
|
470
|
+
}
|
|
471
|
+
// #endregion
|
|
472
|
+
// #region UserActions
|
|
473
|
+
setPeriod(period) {
|
|
474
|
+
if (this.currentPeriod === period)
|
|
475
|
+
return;
|
|
476
|
+
this.currentPeriod = period;
|
|
477
|
+
this.periodChange.emit(period);
|
|
478
|
+
}
|
|
479
|
+
onChartItemSelected(item, chartName) {
|
|
480
|
+
this.itemSelected.emit({
|
|
481
|
+
chart: chartName,
|
|
482
|
+
item
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
DashboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DashboardComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
487
|
+
DashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DashboardComponent, selector: "careon-dashboard", inputs: { data: "data", loading: "loading", currentPeriod: "currentPeriod", title: "title", subtitle: "subtitle", emptyMessage: "emptyMessage", consultantPhone: "consultantPhone", consultantMessage: "consultantMessage", zeroStateMode: "zeroStateMode" }, outputs: { periodChange: "periodChange", itemSelected: "itemSelected", publishDuty: "publishDuty", dutySelected: "dutySelected", consultantClick: "consultantClick", attentionItemSelected: "attentionItemSelected" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"careon-dashboard-container\">\r\n <!-- #region DashboardHeader -->\r\n <header class=\"dashboard-header\">\r\n <div class=\"header-titles\">\r\n <h1 class=\"main-title\">{{ title }}</h1>\r\n <p *ngIf=\"subtitle\" class=\"subtitle\">\r\n {{ subtitle }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"period-filter-group\">\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Today\"\r\n (click)=\"setPeriod(DashboardPeriod.Today)\"\r\n >\r\n Hoje\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Week\"\r\n (click)=\"setPeriod(DashboardPeriod.Week)\"\r\n >\r\n Semana\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Month\"\r\n (click)=\"setPeriod(DashboardPeriod.Month)\"\r\n >\r\n M\u00EAs\r\n </button>\r\n </div>\r\n </header>\r\n <!-- #endregion -->\r\n\r\n <!-- #region LoadingSkeletonState -->\r\n <careon-dashboard-skeleton *ngIf=\"loading\"></careon-dashboard-skeleton>\r\n <!-- #endregion -->\r\n\r\n <!-- #region EmptyState -->\r\n <div *ngIf=\"!loading && !hasData\" class=\"dashboard-empty-state\">\r\n <p class=\"empty-title\">Sem registros</p>\r\n <p class=\"empty-description\">{{ emptyMessage }}</p>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region DashboardContent -->\r\n <main *ngIf=\"!loading && hasData\" class=\"dashboard-content\">\r\n <!-- #region KpiCardsRow -->\r\n <section class=\"kpi-cards-grid\">\r\n <!-- KPI 1: Vagas Publicadas -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Vagas Publicadas</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ registeredVacancies }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"registeredVacanciesBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"registeredVacanciesBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"registeredVacanciesBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ registeredVacanciesBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">\r\n no total\r\n </span>\r\n </article>\r\n\r\n <!-- KPI 2: Candidatos Inscritos -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Candidatos Inscritos</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ candidateApplications }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"candidateApplicationsBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"candidateApplicationsBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"candidateApplicationsBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ candidateApplicationsBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">\r\n {{ currentPeriod === 'Today' ? 'hoje' : currentPeriod === 'Week' ? 'essa semana' : 'esse m\u00EAs' }}\r\n </span>\r\n </article>\r\n\r\n <!-- KPI 3: Curr\u00EDculos para Avaliar -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Curr\u00EDculos para Avaliar</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ pendingReviews }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"pendingReviewsBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"pendingReviewsBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"pendingReviewsBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ pendingReviewsBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">aguardando agora</span>\r\n </article>\r\n\r\n <!-- KPI 4: M\u00E9dia de Candidatos -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">M\u00E9dia de Candidatos</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ averageCandidatesPerVacancy }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"averageCandidatesBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"averageCandidatesBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"averageCandidatesBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ averageCandidatesBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">por vaga</span>\r\n </article>\r\n\r\n <!-- KPI 5: Status das Vagas -->\r\n <article class=\"kpi-card kpi-card--status\">\r\n <careon-stacked-horizontal-bar\r\n [title]=\"'Status das Vagas'\"\r\n [totalLabel]=\"'vagas'\"\r\n [showHeader]=\"true\"\r\n [showLegend]=\"true\"\r\n [data]=\"dutiesStatusItems\"\r\n [emptyText]=\"'Sem vagas registradas'\"\r\n (itemSelected)=\"onChartItemSelected($event, 'Status das Vagas')\"\r\n ></careon-stacked-horizontal-bar>\r\n </article>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region AttentionSection -->\r\n <section class=\"attention-section\">\r\n <!-- #region AttentionCard -->\r\n <article class=\"attention-card\">\r\n <h2 class=\"attention-card-title\">Precisa da sua aten\u00E7\u00E3o</h2>\r\n\r\n <ng-container *ngIf=\"attentionItems.length > 0; else noAttention\">\r\n <div class=\"attention-items-list\">\r\n <div *ngFor=\"let item of attentionItems; let last = last\" class=\"attention-item-wrapper\">\r\n <div class=\"attention-item\" (click)=\"onAttentionItemClick(item)\">\r\n <span class=\"attention-item-title\">{{ item.title }}</span>\r\n <span class=\"attention-item-subtitle\">{{ item.subtitle }}</span>\r\n </div>\r\n <div *ngIf=\"!last\" class=\"attention-divider\"></div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('Precisa da sua aten\u00E7\u00E3o')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </ng-container>\r\n\r\n <ng-template #noAttention>\r\n <ng-container *ngIf=\"isPublishZeroState; else basicAttentionZero\">\r\n <div class=\"attention-zero-box\">\r\n <div class=\"attention-zero-header\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"attention-zero-texts\">\r\n <h3 class=\"attention-zero-title\">Nenhuma vaga precisa de aten\u00E7\u00E3o</h3>\r\n <p class=\"attention-zero-subtitle\">Voc\u00EA n\u00E3o tem vagas em aberto para revisar.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish btn-zero-publish--full\"\r\n (click)=\"onPublishDuty('Precisa da sua aten\u00E7\u00E3o')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #basicAttentionZero>\r\n <div class=\"basic-empty-state basic-empty-state--attention\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Tudo em dia!</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga precisa da sua aten\u00E7\u00E3o no momento.</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('Precisa da sua aten\u00E7\u00E3o - Sem vagas')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </ng-template>\r\n </ng-template>\r\n </article>\r\n <!-- #endregion -->\r\n\r\n <!-- #region PerformanceCard -->\r\n <article class=\"performance-card\">\r\n <div class=\"performance-card-header\">\r\n <h2 class=\"performance-card-title\">An\u00E1lise de Desempenho</h2>\r\n\r\n <div\r\n class=\"performance-info-wrapper\"\r\n (mouseenter)=\"onInfoMouseEnter()\"\r\n (mouseleave)=\"onInfoMouseLeave()\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn-info\"\r\n aria-label=\"Informa\u00E7\u00F5es sobre a An\u00E1lise de Desempenho\"\r\n (click)=\"toggleInfoTooltip()\"\r\n >\r\n <careon-dashboard-icon name=\"info\" class=\"info-icon\"></careon-dashboard-icon>\r\n </button>\r\n\r\n <!-- Tooltip -->\r\n <div *ngIf=\"showInfoTooltip\" class=\"info-tooltip\" role=\"tooltip\">\r\n <div class=\"tooltip-arrow\"></div>\r\n <p class=\"tooltip-text\">\r\n Esta an\u00E1lise mede o interesse dos candidatos pela sua empresa e \u00E9 atualizada continuamente \u00E0 medida que mais profissionais demonstram desejo de fazer parte do seu time.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Gr\u00E1fico de Ondas -->\r\n <careon-performance-wave [level]=\"performanceLevel\"></careon-performance-wave>\r\n\r\n <!-- Conte\u00FAdo Textual -->\r\n <div class=\"performance-body\">\r\n <h3 class=\"performance-highlight-title\">{{ performanceTitle }}</h3>\r\n <p class=\"performance-description\">{{ performanceDescription }}</p>\r\n </div>\r\n\r\n <!-- Bot\u00E3o WhatsApp -->\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('An\u00E1lise de Desempenho')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </article>\r\n <!-- #endregion -->\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VacancyAnalysisSection -->\r\n <section class=\"vacancy-analysis-section vacancy-analysis-card\">\r\n <!-- #region SectionHeader -->\r\n <header class=\"vacancy-section-header\">\r\n <div class=\"vacancy-section-title-group\">\r\n <h2 class=\"vacancy-section-title\">An\u00E1lise por Vaga</h2>\r\n <span class=\"vacancy-section-subtitle\" *ngIf=\"selectedDuty\">{{ vacancySectionSubtitle }}</span>\r\n <span class=\"vacancy-section-subtitle\" *ngIf=\"!selectedDuty\">\r\n {{ isPublishZeroState ? 'Nenhuma candidatura registrada' : 'Nenhuma vaga ativa no momento' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"vacancy-dropdown-wrapper\" *ngIf=\"vacanciesAnalysis.length > 0\">\r\n <span class=\"vacancy-dropdown-label\">Escolha a vaga:</span>\r\n\r\n <div class=\"vacancy-dropdown-container\">\r\n <button\r\n type=\"button\"\r\n class=\"vacancy-dropdown-btn\"\r\n [class.vacancy-dropdown-btn--open]=\"isDutyDropdownOpen\"\r\n (click)=\"toggleDutyDropdown()\"\r\n [attr.aria-expanded]=\"isDutyDropdownOpen\"\r\n >\r\n <span class=\"vacancy-dropdown-btn-text\">{{ selectedDuty?.title || 'Selecione uma vaga' }}</span>\r\n <careon-dashboard-icon name=\"chevron-down\" [rotated]=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-btn-icon\"></careon-dashboard-icon>\r\n </button>\r\n\r\n <!-- Backdrop para fechar dropdown ao clicar fora -->\r\n <div *ngIf=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-backdrop\" (click)=\"closeDutyDropdown()\"></div>\r\n\r\n <!-- Menu flutuante do dropdown -->\r\n <div *ngIf=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-menu\" role=\"menu\">\r\n <div\r\n *ngFor=\"let duty of vacanciesAnalysis\"\r\n class=\"vacancy-dropdown-item\"\r\n [class.vacancy-dropdown-item--selected]=\"duty.dutyId === selectedDuty?.dutyId\"\r\n (click)=\"selectDuty(duty)\"\r\n role=\"menuitem\"\r\n >\r\n <div class=\"duty-radio-outer\" [class.duty-radio-outer--checked]=\"duty.dutyId === selectedDuty?.dutyId\">\r\n <div class=\"duty-radio-inner\" *ngIf=\"duty.dutyId === selectedDuty?.dutyId\"></div>\r\n </div>\r\n\r\n <div class=\"duty-item-content\">\r\n <span class=\"duty-item-title\">{{ duty.title }}</span>\r\n <span class=\"duty-item-subtitle\">{{ duty.subtitle }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n <!-- #endregion -->\r\n\r\n <ng-container *ngIf=\"selectedDuty; else noActiveDuties\">\r\n <!-- #region TimelineChart -->\r\n <div class=\"vacancy-timeline-wrapper\">\r\n <careon-timeline-bar-chart\r\n [data]=\"selectedDutyTimelinePoints\"\r\n [autoBarWidth]=\"false\"\r\n [barWidth]=\"68\"\r\n (itemSelected)=\"onTimelinePointSelected($event)\"\r\n ></careon-timeline-bar-chart>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region BottomMetricsRow -->\r\n <div class=\"vacancy-bottom-grid\">\r\n <!-- Card Taxa de Convers\u00E3o -->\r\n <article class=\"vacancy-metric-card vacancy-metric-card--donut\">\r\n <careon-donut-chart\r\n [title]=\"'Taxa de convers\u00E3o'\"\r\n [titleBold]=\"true\"\r\n [titleSize]=\"14\"\r\n [titlePadding]=\"6\"\r\n [data]=\"selectedDutyDonutItems\"\r\n [centerText]=\"selectedDutyConversionRateText\"\r\n [size]=\"96\"\r\n [strokeWidth]=\"18\"\r\n ></careon-donut-chart>\r\n </article>\r\n\r\n <!-- Card Visualiza\u00E7\u00F5es \u2192 Candidaturas -->\r\n <article class=\"vacancy-metric-card vacancy-metric-card--funnel\">\r\n <careon-funnel-bar\r\n [title]=\"'Visualiza\u00E7\u00F5es \u2192 Candidaturas'\"\r\n [titleBold]=\"true\"\r\n [titleSize]=\"14\"\r\n [titlePadding]=\"6\"\r\n [data]=\"selectedDutyFunnelItems\"\r\n [minBarWidth]=\"260\"\r\n ></careon-funnel-bar>\r\n </article>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region SalaryAndSupportRow -->\r\n <div class=\"vacancy-salary-support-grid\" *ngIf=\"selectedDutySalaryComparison\">\r\n <!-- Card M\u00E9dia Salarial -->\r\n <article class=\"vacancy-salary-card\">\r\n <header class=\"salary-card-header\">\r\n <!-- Coluna 1: Seu valor -->\r\n <div class=\"salary-metric-col\">\r\n <span class=\"salary-metric-label\">Seu valor</span>\r\n <span\r\n class=\"salary-metric-value\"\r\n [class.salary-metric-value--not-informed]=\"salaryStatus === DutySalaryStatus.NotInformed\"\r\n [class.salary-metric-value--insufficient]=\"salaryStatus === DutySalaryStatus.InsufficientData\"\r\n >\r\n {{ formattedYourSalary }}\r\n </span>\r\n </div>\r\n\r\n <!-- Divisor vertical -->\r\n <div class=\"salary-metric-divider\"></div>\r\n\r\n <!-- Coluna 2: M\u00E9dia da regi\u00E3o -->\r\n <div class=\"salary-metric-col\">\r\n <span class=\"salary-metric-label\">M\u00E9dia da regi\u00E3o</span>\r\n <span\r\n class=\"salary-metric-value\"\r\n [class.salary-metric-value--orange]=\"salaryStatus === DutySalaryStatus.BelowMarket\"\r\n [class.salary-metric-value--blue]=\"salaryStatus === DutySalaryStatus.AtMarket\"\r\n [class.salary-metric-value--navy]=\"salaryStatus === DutySalaryStatus.AboveMarket\"\r\n [class.salary-metric-value--insufficient]=\"salaryStatus === DutySalaryStatus.InsufficientData\"\r\n [class.salary-metric-value--muted]=\"salaryStatus === DutySalaryStatus.NotInformed\"\r\n >\r\n {{ formattedRegionalAverage }}\r\n </span>\r\n </div>\r\n\r\n <!-- Badge Din\u00E2mico -->\r\n <div\r\n class=\"salary-badge\"\r\n [ngClass]=\"salaryBadgeClass\"\r\n *ngIf=\"selectedDutySalaryComparison.badgeText\"\r\n >\r\n {{ selectedDutySalaryComparison.badgeText }}\r\n </div>\r\n </header>\r\n\r\n <!-- Linha/Corpo textual com Destaque e Explica\u00E7\u00E3o -->\r\n <div class=\"salary-card-body\">\r\n <h4 class=\"salary-highlight-title\" [ngClass]=\"salaryTitleColorClass\">\r\n {{ selectedDutySalaryComparison.highlightTitle }}\r\n </h4>\r\n <p class=\"salary-description\">\r\n {{ selectedDutySalaryComparison.description }}\r\n </p>\r\n </div>\r\n </article>\r\n\r\n <!-- Card de Suporte: D\u00FAvidas sobre esses dados? -->\r\n <article class=\"vacancy-support-card\">\r\n <h4 class=\"support-card-title\">Ainda com d\u00FAvidas sobre esses dados?</h4>\r\n <p class=\"support-card-subtitle\">\r\n Se depois de ver os gr\u00E1ficos voc\u00EA ficou com perguntas sem resposta, fale com a nossa equipe.\r\n </p>\r\n <button\r\n type=\"button\"\r\n class=\"btn-support-consultant\"\r\n (click)=\"openConsultantWhatsApp('D\u00FAvidas sobre esses dados')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </article>\r\n </div>\r\n <!-- #endregion -->\r\n </ng-container>\r\n\r\n <ng-template #noActiveDuties>\r\n <div class=\"zero-state-banner\" *ngIf=\"isPublishZeroState; else basicVacancyZero\">\r\n <div class=\"zero-state-banner-left\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"zero-state-banner-texts\">\r\n <h3 class=\"zero-state-banner-title\">Nenhuma vaga para analisar</h3>\r\n <p class=\"zero-state-banner-subtitle\">Cadastre uma vaga para come\u00E7ar a acompanhar o desempenho dela aqui.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish\"\r\n (click)=\"onPublishDuty('An\u00E1lise por Vaga')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n\r\n <ng-template #basicVacancyZero>\r\n <div class=\"basic-empty-state basic-empty-state--vacancy\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Nenhuma vaga para analisar</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga ativa no momento para an\u00E1lise.</p>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region ApplicationsPerVacancySection -->\r\n <section class=\"applications-per-vacancy-section\">\r\n <header class=\"applications-section-header\">\r\n <h2 class=\"applications-section-title\">Candidaturas por Vaga</h2>\r\n <span class=\"applications-section-subtitle\" *ngIf=\"hasComparisonDuties\">\r\n {{ comparisonSubtitle }}\r\n </span>\r\n <span class=\"applications-section-subtitle\" *ngIf=\"!hasComparisonDuties\">\r\n {{ isPublishZeroState ? '0 candidaturas no total, nenhuma vaga ativa' : 'Nenhuma vaga ativa no momento' }}\r\n </span>\r\n </header>\r\n\r\n <div class=\"applications-chart-wrapper\" *ngIf=\"hasComparisonDuties; else noComparisonDuties\">\r\n <careon-comparison-bar-chart\r\n [data]=\"comparisonItems\"\r\n [autoBarWidth]=\"false\"\r\n [barWidth]=\"75\"\r\n [itemSlotWidth]=\"100\"\r\n [barColor]=\"'#3B82F6'\"\r\n [zeroColor]=\"'#EF4444'\"\r\n [trendLineColor]=\"'#1E293B'\"\r\n [dotColor]=\"'#1E293B'\"\r\n [textColor]=\"'#64748B'\"\r\n (itemSelected)=\"onChartItemSelected($event, 'Candidaturas por Vaga')\"\r\n ></careon-comparison-bar-chart>\r\n </div>\r\n\r\n <ng-template #noComparisonDuties>\r\n <div class=\"zero-state-banner\" *ngIf=\"isPublishZeroState; else basicComparisonZero\">\r\n <div class=\"zero-state-banner-left\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"zero-state-banner-texts\">\r\n <h3 class=\"zero-state-banner-title\">Nenhuma candidatura registrada</h3>\r\n <p class=\"zero-state-banner-subtitle\">Sem vagas em aberto, ainda n\u00E3o h\u00E1 candidaturas para mostrar.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish\"\r\n (click)=\"onPublishDuty('Candidaturas por Vaga')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n\r\n <ng-template #basicComparisonZero>\r\n <div class=\"basic-empty-state basic-empty-state--comparison\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Nenhuma candidatura registrada</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga ativa no momento para an\u00E1lise.</p>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </section>\r\n <!-- #endregion -->\r\n </main>\r\n <!-- #endregion -->\r\n</div>\r\n", styles: [":host{display:block;width:100%}.careon-dashboard-container{display:flex;flex-direction:column;gap:24px;width:100%;max-width:1400px;margin:0 auto;padding:16px 24px;box-sizing:border-box;font-family:Montserrat,sans-serif;color:#1b2559}.careon-dashboard-container .dashboard-header{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:16px;padding-bottom:8px}.careon-dashboard-container .dashboard-header .header-titles .main-title{font-size:26px;font-weight:700;color:#1b2559;margin:0;letter-spacing:-.3px}.careon-dashboard-container .dashboard-header .header-titles .subtitle{font-size:13px;color:#a3aed0;margin:4px 0 0;font-weight:500}.careon-dashboard-container .dashboard-header .period-filter-group{display:inline-flex;align-items:center;background:#ffffff;padding:4px;border-radius:9999px;gap:2px;border:1px solid #eef0f4;box-shadow:0 2px 8px #0000000a}.careon-dashboard-container .dashboard-header .period-filter-group .period-pill{padding:14px 25px;font-family:Montserrat,sans-serif;font-size:13px;font-weight:500;color:#8e9091;background:transparent;border:none;border-radius:9999px;cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);outline:none}.careon-dashboard-container .dashboard-header .period-filter-group .period-pill:hover{color:#292857}.careon-dashboard-container .dashboard-header .period-filter-group .period-pill.active{background:#292857;color:#fff;font-weight:600;box-shadow:0 2px 8px #29285740}.careon-dashboard-container .dashboard-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 24px;gap:16px}.careon-dashboard-container .dashboard-loading-state .loading-spinner{width:40px;height:40px;border:3px solid #e2e8f0;border-top-color:#3b82f6;border-radius:50%;animation:spin .8s linear infinite}.careon-dashboard-container .dashboard-loading-state .loading-text{font-size:14px;font-weight:500;color:#64748b;margin:0}.careon-dashboard-container .dashboard-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 24px;background:#ffffff;border:1px dashed #cbd5e1;border-radius:12px;text-align:center}.careon-dashboard-container .dashboard-empty-state .empty-title{font-size:16px;font-weight:700;color:#334155;margin:0 0 6px}.careon-dashboard-container .dashboard-empty-state .empty-description{font-size:14px;color:#64748b;margin:0}.careon-dashboard-container .dashboard-content{display:flex;flex-direction:column}.careon-dashboard-container .dashboard-content .zero-state-banner{background-color:#dee9fb;border-radius:12px;padding:20px 24px;display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%;box-sizing:border-box}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left{display:flex;align-items:center;gap:14px}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-info-icon{color:#5c8bef;width:24px;height:24px;flex-shrink:0}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-state-banner-texts{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-state-banner-texts .zero-state-banner-title{font-size:15px;font-weight:700;color:#1e2445;margin:0;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-state-banner-texts .zero-state-banner-subtitle{font-size:13px;font-weight:400;color:#718096;margin:0;font-family:Montserrat,sans-serif;line-height:1.4}@media (max-width: 768px){.careon-dashboard-container .dashboard-content .zero-state-banner{flex-direction:column;align-items:stretch}.careon-dashboard-container .dashboard-content .zero-state-banner .btn-zero-publish{width:100%;margin-top:8px}}.careon-dashboard-container .dashboard-content .btn-zero-publish{background-color:#5c8bef;color:#fff;border:none;border-radius:10px;padding:12px 28px;font-size:14px;font-weight:600;font-family:Montserrat,sans-serif;cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;transition:background-color .2s ease,transform .1s ease;outline:none}.careon-dashboard-container .dashboard-content .btn-zero-publish:hover{background-color:#4a7de6}.careon-dashboard-container .dashboard-content .btn-zero-publish:active{transform:scale(.98)}.careon-dashboard-container .dashboard-content .btn-zero-publish--full{width:100%;margin-top:auto}.careon-dashboard-container .dashboard-content .kpi-cards-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) minmax(0,1.75fr);gap:16px;align-items:stretch;width:100%;max-width:100%;box-sizing:border-box}@media (max-width: 1200px){.careon-dashboard-container .dashboard-content .kpi-cards-grid{grid-template-columns:repeat(2,1fr)}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status{grid-column:span 2}}@media (max-width: 600px){.careon-dashboard-container .dashboard-content .kpi-cards-grid{grid-template-columns:1fr}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status{grid-column:span 1}}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card{background:#ffffff;border-radius:24px;padding:14px 18px;border:none;box-shadow:0 4px 20px #0000000a;display:flex;flex-direction:column;justify-content:space-between;min-height:104px;box-sizing:border-box}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-header{display:flex;justify-content:space-between;align-items:center}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-header .kpi-label{font-size:12px;font-weight:600;color:#a3aed0}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-header .kpi-total-badge{font-size:11px;font-weight:700;color:#1b2559}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body{display:flex;align-items:center;gap:8px;margin-top:4px}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-value{font-size:24px;font-weight:700;color:#1b2559;line-height:1}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;padding:3px 8px;border-radius:12px;white-space:nowrap}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge .kpi-badge-icon{width:10px;height:10px;display:inline-block;flex-shrink:0}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--blue{background:#e0f2fe;color:#0284c7}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--green{background:#dcfce7;color:#16a34a}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--coral{background:#fee2e2;color:#dc2626}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--gray{background:#f1f5f9;color:#64748b}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-footer{font-size:11px;color:#a3aed0;font-weight:500;margin-top:6px}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status{padding:14px 18px;justify-content:center}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status careon-stacked-horizontal-bar{display:block;width:100%}.careon-dashboard-container .dashboard-content .attention-section{margin-top:32px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;width:100%;box-sizing:border-box}.careon-dashboard-container .dashboard-content .attention-section .attention-card{background:#ffffff;border-radius:24px;padding:24px 28px;border:none;box-shadow:0 4px 20px #0000000a;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-card-title{font-size:19px;font-weight:700;color:#1b2559;margin:0 0 16px;letter-spacing:-.3px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper{display:flex;flex-direction:column}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item{display:flex;flex-direction:column;gap:4px;padding:14px 0;cursor:pointer;transition:opacity .15s ease}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item:hover{opacity:.82}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item .attention-item-title{font-size:15px;font-weight:600;color:#2b3674;line-height:1.3}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item .attention-item-subtitle{font-size:13px;font-weight:400;color:#8e9091;line-height:1.4}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-divider{height:1px;background-color:#f1f5f9;width:100%;margin:0}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box{background-color:#dee9fb;border-radius:12px;padding:20px;display:flex;flex-direction:column;box-sizing:border-box}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header{display:flex;align-items:flex-start;gap:12px;margin-bottom:16px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .zero-info-icon{color:#5c8bef;width:22px;height:22px;flex-shrink:0;margin-top:1px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .attention-zero-texts{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .attention-zero-texts .attention-zero-title{font-size:14.5px;font-weight:700;color:#1e2445;margin:0;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .attention-zero-texts .attention-zero-subtitle{font-size:13px;font-weight:400;color:#718096;margin:0;font-family:Montserrat,sans-serif;line-height:1.4}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background-color:#f8fafc;border:1px dashed #cbd5e1;border-radius:16px;box-sizing:border-box;padding:28px 20px;flex:1;margin-bottom:20px;min-height:180px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-icon-wrap,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-icon-wrap{width:44px;height:44px;border-radius:50%;background-color:#eff6ff;color:#3b82f6;display:flex;align-items:center;justify-content:center;margin-bottom:12px;flex-shrink:0}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-icon-wrap .basic-empty-icon,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-icon-wrap .basic-empty-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-title,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-title{font-size:15px;font-weight:700;color:#1e293b;margin:0 0 6px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-text,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-text{font-size:13.5px;font-weight:400;color:#64748b;margin:0;font-family:Montserrat,sans-serif;line-height:1.45;max-width:460px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .btn-consultant{width:100%;display:flex;align-items:center;justify-content:center;background-color:#3b82f6;color:#fff;font-family:Montserrat,sans-serif;font-size:14px;font-weight:600;border:none;border-radius:9999px;padding:13px 24px;margin-top:auto;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 14px #3b82f64d;outline:none}.careon-dashboard-container .dashboard-content .attention-section .attention-card .btn-consultant:hover{background-color:#2563eb;box-shadow:0 6px 18px #2563eb66;transform:translateY(-1px)}.careon-dashboard-container .dashboard-content .attention-section .attention-card .btn-consultant:active{transform:translateY(0);box-shadow:0 2px 6px #2563eb40}.careon-dashboard-container .dashboard-content .attention-section .performance-card{background:#ffffff;border-radius:24px;padding:24px 28px;border:none;box-shadow:0 4px 20px #0000000a;display:flex;flex-direction:column;width:100%;box-sizing:border-box;position:relative}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-card-title{font-size:19px;font-weight:700;color:#1b2559;margin:0;letter-spacing:-.3px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper{position:relative;display:inline-flex;align-items:center}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .btn-info{background:transparent;border:none;padding:4px;cursor:pointer;color:#a3aed0;transition:color .2s ease;display:flex;align-items:center;justify-content:center;outline:none;border-radius:50%}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .btn-info:hover{color:#3b82f6}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .btn-info .info-icon{width:18px;height:18px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .info-tooltip{position:absolute;top:calc(100% + 8px);right:0;width:290px;background:#f0f7ff;border:1px solid #93c5fd;border-radius:10px;padding:12px 14px;box-shadow:0 6px 20px #3b82f626;z-index:20;box-sizing:border-box;animation:fadeInTooltip .2s ease-out}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .info-tooltip .tooltip-arrow{position:absolute;top:-6px;right:8px;width:10px;height:10px;background:#f0f7ff;border-top:1px solid #93c5fd;border-left:1px solid #93c5fd;transform:rotate(45deg)}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .info-tooltip .tooltip-text{font-size:12px;line-height:1.45;color:#334155;margin:0;font-weight:500;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .attention-section .performance-card careon-performance-wave{display:block;width:100%}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-body{display:flex;flex-direction:column;margin-bottom:16px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-body .performance-highlight-title{font-size:13.5px;font-weight:700;color:#3b82f6;margin:0 0 6px;line-height:1.35}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-body .performance-description{font-size:12.5px;font-weight:400;color:#8e9091;margin:0;line-height:1.45}.careon-dashboard-container .dashboard-content .attention-section .performance-card .btn-consultant{width:100%;display:flex;align-items:center;justify-content:center;background-color:#3b82f6;color:#fff;font-family:Montserrat,sans-serif;font-size:14px;font-weight:600;border:none;border-radius:9999px;padding:13px 24px;margin-top:auto;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 14px #3b82f64d;outline:none}.careon-dashboard-container .dashboard-content .attention-section .performance-card .btn-consultant:hover{background-color:#2563eb;box-shadow:0 6px 18px #2563eb66;transform:translateY(-1px)}.careon-dashboard-container .dashboard-content .attention-section .performance-card .btn-consultant:active{transform:translateY(0);box-shadow:0 2px 6px #2563eb40}.careon-dashboard-container .dashboard-content .vacancy-analysis-section{margin-top:32px;display:flex;flex-direction:column;background-color:#fff;border:none;border-radius:24px;padding:28px 32px;box-shadow:0 4px 20px #0000000a;box-sizing:border-box}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px;margin-bottom:24px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-section-title-group{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-section-title-group .vacancy-section-title{font-size:20px;font-weight:700;color:#1e1b4b;margin:0;letter-spacing:-.02em}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-section-title-group .vacancy-section-subtitle{font-size:13px;font-weight:400;color:#94a3b8}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper{display:flex;align-items:center;gap:12px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-label{font-size:13px;font-weight:500;color:#64748b}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container{position:relative}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn{display:inline-flex;align-items:center;justify-content:space-between;gap:10px;min-width:180px;padding:9px 18px;background-color:#fff;border:1px solid #e2e8f0;border-radius:9999px;font-family:Montserrat,sans-serif;font-size:13.5px;font-weight:600;color:#1e1b4b;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 3px #0000000a;outline:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn:hover{border-color:#cbd5e1;background-color:#f8fafc}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn--open{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f626}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn .vacancy-dropdown-btn-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn .vacancy-dropdown-btn-icon{width:18px;height:18px;color:#64748b;flex-shrink:0;transition:transform .2s ease}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn .vacancy-dropdown-btn-icon.rotated{transform:rotate(180deg)}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-backdrop{position:fixed;inset:0;z-index:99;background:transparent}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:100;min-width:320px;max-width:440px;max-height:360px;overflow-y:auto;background:#ffffff;border:1px solid #e2e8f0;border-radius:16px;padding:8px;box-shadow:0 10px 25px -5px #0000001a,0 8px 10px -6px #0000000d}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item{display:flex;align-items:center;gap:12px;padding:10px 14px;border-radius:10px;cursor:pointer;transition:background-color .15s ease}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item:hover{background-color:#f1f5f9}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item--selected{background-color:#eff6ff}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item--selected .duty-item-title{color:#3b82f6}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer{width:18px;height:18px;border-radius:50%;border:2px solid #3b82f6;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s ease}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer:not(.duty-radio-outer--checked){border-color:#93c5fd}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer--checked{border-color:#3b82f6}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer .duty-radio-inner{width:8px;height:8px;border-radius:50%;background-color:#3b82f6}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-item-content{display:flex;flex-direction:column;gap:2px;overflow:hidden}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-item-content .duty-item-title{font-size:13.5px;font-weight:600;color:#1e1b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-item-content .duty-item-subtitle{font-size:11.5px;font-weight:400;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-timeline-wrapper{width:100%;margin-bottom:24px;overflow:hidden}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-timeline-wrapper ::ng-deep .timeline-baseline{background-color:#f1f5f9}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid{display:grid;grid-template-columns:minmax(230px,26%) 1fr;gap:20px}@media (max-width: 900px){.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid{grid-template-columns:1fr}}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid .vacancy-metric-card{background-color:#f7f7f7;border:none;border-radius:24px;padding:20px 24px;box-shadow:none;display:flex;flex-direction:column;overflow:visible;min-height:164px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid .vacancy-metric-card--donut{min-height:164px;overflow:visible}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid .vacancy-metric-card--funnel{min-height:164px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid{display:grid;grid-template-columns:1fr 450px;gap:20px;margin-top:20px}@media (max-width: 992px){.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid{grid-template-columns:1fr}}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card{background-color:#f7f7f7;border:none;border-radius:24px;padding:24px 28px;display:flex;flex-direction:column;justify-content:center;box-shadow:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header{display:flex;align-items:center;gap:24px;margin-bottom:16px;flex-wrap:wrap}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-label{font-size:13px;font-weight:500;color:#71717a;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value{font-size:26px;font-weight:700;color:#374151;font-family:Montserrat,sans-serif;line-height:1.2}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--orange{color:#d97706}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--blue{color:#2563eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--navy{color:#1e1b4b}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--not-informed{color:#b91c1c;font-weight:700}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--insufficient{color:#444;font-weight:700}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--muted{color:#4b5563}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-divider{width:1px;height:38px;background-color:#e5e7eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge{margin-left:auto;padding:6px 14px;border-radius:9999px;font-size:13px;font-weight:600;font-family:Montserrat,sans-serif;display:inline-flex;align-items:center;white-space:nowrap}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge--orange{background-color:#ffedd5;color:#c2410c;border:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge--blue{background-color:#dbeafd;color:#1d4ed8;border:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge--purple{background-color:#ede9fe;color:#1e1b4b;border:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body{display:flex;flex-direction:column;gap:6px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title{font-size:14.5px;font-weight:700;margin:0;font-family:Montserrat,sans-serif;line-height:1.4}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--orange{color:#d97706}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--blue{color:#2563eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--purple{color:#1e1b4b}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--red{color:#b91c1c}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--default{color:#111827}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-description{font-size:13px;font-weight:400;color:#4b5563;margin:0;line-height:1.55;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card{background-color:#f7f7f7;border:none;border-radius:24px;padding:24px 28px;display:flex;flex-direction:column;justify-content:space-between;box-shadow:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .support-card-title{font-size:17px;font-weight:700;color:#3b82f6;margin:0 0 10px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .support-card-subtitle{font-size:13.5px;font-weight:400;color:#64748b;margin:0 0 20px;line-height:1.5;font-family:Montserrat,sans-serif;flex-grow:1}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .btn-support-consultant{background-color:#3b82f6;color:#fff;border:none;border-radius:9999px;padding:13px 24px;font-size:14px;font-weight:700;font-family:Montserrat,sans-serif;cursor:pointer;transition:background-color .15s ease,transform .1s ease;width:100%;text-align:center;box-shadow:none;outline:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .btn-support-consultant:hover{background-color:#2563eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .btn-support-consultant:active{transform:scale(.98)}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background-color:#f8fafc;border:1px dashed #cbd5e1;border-radius:16px;box-sizing:border-box;padding:44px 24px;width:100%;min-height:180px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-icon-wrap,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-icon-wrap{width:44px;height:44px;border-radius:50%;background-color:#eff6ff;color:#3b82f6;display:flex;align-items:center;justify-content:center;margin-bottom:12px;flex-shrink:0}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-icon-wrap .basic-empty-icon,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-icon-wrap .basic-empty-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-title,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-title{font-size:15px;font-weight:700;color:#1e293b;margin:0 0 6px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-text,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-text{font-size:13.5px;font-weight:400;color:#64748b;margin:0;font-family:Montserrat,sans-serif;line-height:1.45;max-width:460px}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section{margin-top:32px;display:flex;flex-direction:column;background-color:#fff;border:none;border-radius:24px;padding:28px 32px;box-shadow:0 4px 20px #0000000a;box-sizing:border-box}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-section-header{display:flex;flex-direction:column;gap:4px;margin-bottom:24px}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-section-header .applications-section-title{font-size:20px;font-weight:700;color:#1e1b4b;margin:0;letter-spacing:-.02em;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-section-header .applications-section-subtitle{font-size:13px;font-weight:400;color:#94a3b8;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-chart-wrapper{width:100%;overflow:hidden}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background-color:#f8fafc;border:1px dashed #cbd5e1;border-radius:16px;box-sizing:border-box;padding:44px 24px;width:100%;min-height:180px}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-icon-wrap,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-icon-wrap{width:44px;height:44px;border-radius:50%;background-color:#eff6ff;color:#3b82f6;display:flex;align-items:center;justify-content:center;margin-bottom:12px;flex-shrink:0}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-icon-wrap .basic-empty-icon,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-icon-wrap .basic-empty-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-title,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-title{font-size:15px;font-weight:700;color:#1e293b;margin:0 0 6px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-text,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-text{font-size:13.5px;font-weight:400;color:#64748b;margin:0;font-family:Montserrat,sans-serif;line-height:1.45;max-width:460px}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fadeInTooltip{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TimelineBarChartComponent, selector: "careon-timeline-bar-chart", inputs: ["data", "barColor", "currentBarColor", "pastHatchColor", "zeroColor", "trendLineColor", "dotColor", "tooltipBgColor", "tooltipTextColor", "textColor", "activeTextColor", "autoBarWidth", "barWidth", "itemSlotWidth"], outputs: ["itemSelected"] }, { kind: "component", type: i2.ComparisonBarChartComponent, selector: "careon-comparison-bar-chart", inputs: ["data", "limitTop10", "barColor", "zeroColor", "trendLineColor", "dotColor", "textColor", "autoBarWidth", "barWidth", "itemSlotWidth"], outputs: ["itemSelected"] }, { kind: "component", type: i2.DonutChartComponent, selector: "careon-donut-chart", inputs: ["title", "titleBold", "titleSize", "titlePadding", "data", "maxItems", "centerText", "emptyTrackColor", "size", "strokeWidth", "showLegend", "showLegendPercentage", "showTooltip", "tooltipBgColor", "tooltipTextColor"], outputs: ["itemSelected"] }, { kind: "component", type: i2.StackedHorizontalBarComponent, selector: "careon-stacked-horizontal-bar", inputs: ["title", "totalLabel", "showHeader", "showLegend", "emptyText", "emptyTrackColor", "maxSegments", "data"], outputs: ["itemSelected"] }, { kind: "component", type: i2.FunnelBarComponent, selector: "careon-funnel-bar", inputs: ["title", "titleBold", "titleSize", "titlePadding", "data", "fontColor", "minBarWidth"], outputs: ["itemSelected"] }, { kind: "component", type: i3.PerformanceWaveComponent, selector: "careon-performance-wave", inputs: ["level"] }, { kind: "component", type: i4.DashboardIconComponent, selector: "careon-dashboard-icon", inputs: ["name", "rotated", "customClass"] }, { kind: "component", type: i5.DashboardSkeletonComponent, selector: "careon-dashboard-skeleton" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
488
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DashboardComponent, decorators: [{
|
|
489
|
+
type: Component,
|
|
490
|
+
args: [{ selector: 'careon-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"careon-dashboard-container\">\r\n <!-- #region DashboardHeader -->\r\n <header class=\"dashboard-header\">\r\n <div class=\"header-titles\">\r\n <h1 class=\"main-title\">{{ title }}</h1>\r\n <p *ngIf=\"subtitle\" class=\"subtitle\">\r\n {{ subtitle }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"period-filter-group\">\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Today\"\r\n (click)=\"setPeriod(DashboardPeriod.Today)\"\r\n >\r\n Hoje\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Week\"\r\n (click)=\"setPeriod(DashboardPeriod.Week)\"\r\n >\r\n Semana\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Month\"\r\n (click)=\"setPeriod(DashboardPeriod.Month)\"\r\n >\r\n M\u00EAs\r\n </button>\r\n </div>\r\n </header>\r\n <!-- #endregion -->\r\n\r\n <!-- #region LoadingSkeletonState -->\r\n <careon-dashboard-skeleton *ngIf=\"loading\"></careon-dashboard-skeleton>\r\n <!-- #endregion -->\r\n\r\n <!-- #region EmptyState -->\r\n <div *ngIf=\"!loading && !hasData\" class=\"dashboard-empty-state\">\r\n <p class=\"empty-title\">Sem registros</p>\r\n <p class=\"empty-description\">{{ emptyMessage }}</p>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region DashboardContent -->\r\n <main *ngIf=\"!loading && hasData\" class=\"dashboard-content\">\r\n <!-- #region KpiCardsRow -->\r\n <section class=\"kpi-cards-grid\">\r\n <!-- KPI 1: Vagas Publicadas -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Vagas Publicadas</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ registeredVacancies }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"registeredVacanciesBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"registeredVacanciesBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"registeredVacanciesBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ registeredVacanciesBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">\r\n no total\r\n </span>\r\n </article>\r\n\r\n <!-- KPI 2: Candidatos Inscritos -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Candidatos Inscritos</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ candidateApplications }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"candidateApplicationsBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"candidateApplicationsBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"candidateApplicationsBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ candidateApplicationsBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">\r\n {{ currentPeriod === 'Today' ? 'hoje' : currentPeriod === 'Week' ? 'essa semana' : 'esse m\u00EAs' }}\r\n </span>\r\n </article>\r\n\r\n <!-- KPI 3: Curr\u00EDculos para Avaliar -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Curr\u00EDculos para Avaliar</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ pendingReviews }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"pendingReviewsBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"pendingReviewsBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"pendingReviewsBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ pendingReviewsBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">aguardando agora</span>\r\n </article>\r\n\r\n <!-- KPI 4: M\u00E9dia de Candidatos -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">M\u00E9dia de Candidatos</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ averageCandidatesPerVacancy }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"averageCandidatesBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"averageCandidatesBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"averageCandidatesBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ averageCandidatesBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">por vaga</span>\r\n </article>\r\n\r\n <!-- KPI 5: Status das Vagas -->\r\n <article class=\"kpi-card kpi-card--status\">\r\n <careon-stacked-horizontal-bar\r\n [title]=\"'Status das Vagas'\"\r\n [totalLabel]=\"'vagas'\"\r\n [showHeader]=\"true\"\r\n [showLegend]=\"true\"\r\n [data]=\"dutiesStatusItems\"\r\n [emptyText]=\"'Sem vagas registradas'\"\r\n (itemSelected)=\"onChartItemSelected($event, 'Status das Vagas')\"\r\n ></careon-stacked-horizontal-bar>\r\n </article>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region AttentionSection -->\r\n <section class=\"attention-section\">\r\n <!-- #region AttentionCard -->\r\n <article class=\"attention-card\">\r\n <h2 class=\"attention-card-title\">Precisa da sua aten\u00E7\u00E3o</h2>\r\n\r\n <ng-container *ngIf=\"attentionItems.length > 0; else noAttention\">\r\n <div class=\"attention-items-list\">\r\n <div *ngFor=\"let item of attentionItems; let last = last\" class=\"attention-item-wrapper\">\r\n <div class=\"attention-item\" (click)=\"onAttentionItemClick(item)\">\r\n <span class=\"attention-item-title\">{{ item.title }}</span>\r\n <span class=\"attention-item-subtitle\">{{ item.subtitle }}</span>\r\n </div>\r\n <div *ngIf=\"!last\" class=\"attention-divider\"></div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('Precisa da sua aten\u00E7\u00E3o')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </ng-container>\r\n\r\n <ng-template #noAttention>\r\n <ng-container *ngIf=\"isPublishZeroState; else basicAttentionZero\">\r\n <div class=\"attention-zero-box\">\r\n <div class=\"attention-zero-header\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"attention-zero-texts\">\r\n <h3 class=\"attention-zero-title\">Nenhuma vaga precisa de aten\u00E7\u00E3o</h3>\r\n <p class=\"attention-zero-subtitle\">Voc\u00EA n\u00E3o tem vagas em aberto para revisar.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish btn-zero-publish--full\"\r\n (click)=\"onPublishDuty('Precisa da sua aten\u00E7\u00E3o')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #basicAttentionZero>\r\n <div class=\"basic-empty-state basic-empty-state--attention\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Tudo em dia!</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga precisa da sua aten\u00E7\u00E3o no momento.</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('Precisa da sua aten\u00E7\u00E3o - Sem vagas')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </ng-template>\r\n </ng-template>\r\n </article>\r\n <!-- #endregion -->\r\n\r\n <!-- #region PerformanceCard -->\r\n <article class=\"performance-card\">\r\n <div class=\"performance-card-header\">\r\n <h2 class=\"performance-card-title\">An\u00E1lise de Desempenho</h2>\r\n\r\n <div\r\n class=\"performance-info-wrapper\"\r\n (mouseenter)=\"onInfoMouseEnter()\"\r\n (mouseleave)=\"onInfoMouseLeave()\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn-info\"\r\n aria-label=\"Informa\u00E7\u00F5es sobre a An\u00E1lise de Desempenho\"\r\n (click)=\"toggleInfoTooltip()\"\r\n >\r\n <careon-dashboard-icon name=\"info\" class=\"info-icon\"></careon-dashboard-icon>\r\n </button>\r\n\r\n <!-- Tooltip -->\r\n <div *ngIf=\"showInfoTooltip\" class=\"info-tooltip\" role=\"tooltip\">\r\n <div class=\"tooltip-arrow\"></div>\r\n <p class=\"tooltip-text\">\r\n Esta an\u00E1lise mede o interesse dos candidatos pela sua empresa e \u00E9 atualizada continuamente \u00E0 medida que mais profissionais demonstram desejo de fazer parte do seu time.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Gr\u00E1fico de Ondas -->\r\n <careon-performance-wave [level]=\"performanceLevel\"></careon-performance-wave>\r\n\r\n <!-- Conte\u00FAdo Textual -->\r\n <div class=\"performance-body\">\r\n <h3 class=\"performance-highlight-title\">{{ performanceTitle }}</h3>\r\n <p class=\"performance-description\">{{ performanceDescription }}</p>\r\n </div>\r\n\r\n <!-- Bot\u00E3o WhatsApp -->\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('An\u00E1lise de Desempenho')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </article>\r\n <!-- #endregion -->\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VacancyAnalysisSection -->\r\n <section class=\"vacancy-analysis-section vacancy-analysis-card\">\r\n <!-- #region SectionHeader -->\r\n <header class=\"vacancy-section-header\">\r\n <div class=\"vacancy-section-title-group\">\r\n <h2 class=\"vacancy-section-title\">An\u00E1lise por Vaga</h2>\r\n <span class=\"vacancy-section-subtitle\" *ngIf=\"selectedDuty\">{{ vacancySectionSubtitle }}</span>\r\n <span class=\"vacancy-section-subtitle\" *ngIf=\"!selectedDuty\">\r\n {{ isPublishZeroState ? 'Nenhuma candidatura registrada' : 'Nenhuma vaga ativa no momento' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"vacancy-dropdown-wrapper\" *ngIf=\"vacanciesAnalysis.length > 0\">\r\n <span class=\"vacancy-dropdown-label\">Escolha a vaga:</span>\r\n\r\n <div class=\"vacancy-dropdown-container\">\r\n <button\r\n type=\"button\"\r\n class=\"vacancy-dropdown-btn\"\r\n [class.vacancy-dropdown-btn--open]=\"isDutyDropdownOpen\"\r\n (click)=\"toggleDutyDropdown()\"\r\n [attr.aria-expanded]=\"isDutyDropdownOpen\"\r\n >\r\n <span class=\"vacancy-dropdown-btn-text\">{{ selectedDuty?.title || 'Selecione uma vaga' }}</span>\r\n <careon-dashboard-icon name=\"chevron-down\" [rotated]=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-btn-icon\"></careon-dashboard-icon>\r\n </button>\r\n\r\n <!-- Backdrop para fechar dropdown ao clicar fora -->\r\n <div *ngIf=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-backdrop\" (click)=\"closeDutyDropdown()\"></div>\r\n\r\n <!-- Menu flutuante do dropdown -->\r\n <div *ngIf=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-menu\" role=\"menu\">\r\n <div\r\n *ngFor=\"let duty of vacanciesAnalysis\"\r\n class=\"vacancy-dropdown-item\"\r\n [class.vacancy-dropdown-item--selected]=\"duty.dutyId === selectedDuty?.dutyId\"\r\n (click)=\"selectDuty(duty)\"\r\n role=\"menuitem\"\r\n >\r\n <div class=\"duty-radio-outer\" [class.duty-radio-outer--checked]=\"duty.dutyId === selectedDuty?.dutyId\">\r\n <div class=\"duty-radio-inner\" *ngIf=\"duty.dutyId === selectedDuty?.dutyId\"></div>\r\n </div>\r\n\r\n <div class=\"duty-item-content\">\r\n <span class=\"duty-item-title\">{{ duty.title }}</span>\r\n <span class=\"duty-item-subtitle\">{{ duty.subtitle }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n <!-- #endregion -->\r\n\r\n <ng-container *ngIf=\"selectedDuty; else noActiveDuties\">\r\n <!-- #region TimelineChart -->\r\n <div class=\"vacancy-timeline-wrapper\">\r\n <careon-timeline-bar-chart\r\n [data]=\"selectedDutyTimelinePoints\"\r\n [autoBarWidth]=\"false\"\r\n [barWidth]=\"68\"\r\n (itemSelected)=\"onTimelinePointSelected($event)\"\r\n ></careon-timeline-bar-chart>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region BottomMetricsRow -->\r\n <div class=\"vacancy-bottom-grid\">\r\n <!-- Card Taxa de Convers\u00E3o -->\r\n <article class=\"vacancy-metric-card vacancy-metric-card--donut\">\r\n <careon-donut-chart\r\n [title]=\"'Taxa de convers\u00E3o'\"\r\n [titleBold]=\"true\"\r\n [titleSize]=\"14\"\r\n [titlePadding]=\"6\"\r\n [data]=\"selectedDutyDonutItems\"\r\n [centerText]=\"selectedDutyConversionRateText\"\r\n [size]=\"96\"\r\n [strokeWidth]=\"18\"\r\n ></careon-donut-chart>\r\n </article>\r\n\r\n <!-- Card Visualiza\u00E7\u00F5es \u2192 Candidaturas -->\r\n <article class=\"vacancy-metric-card vacancy-metric-card--funnel\">\r\n <careon-funnel-bar\r\n [title]=\"'Visualiza\u00E7\u00F5es \u2192 Candidaturas'\"\r\n [titleBold]=\"true\"\r\n [titleSize]=\"14\"\r\n [titlePadding]=\"6\"\r\n [data]=\"selectedDutyFunnelItems\"\r\n [minBarWidth]=\"260\"\r\n ></careon-funnel-bar>\r\n </article>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region SalaryAndSupportRow -->\r\n <div class=\"vacancy-salary-support-grid\" *ngIf=\"selectedDutySalaryComparison\">\r\n <!-- Card M\u00E9dia Salarial -->\r\n <article class=\"vacancy-salary-card\">\r\n <header class=\"salary-card-header\">\r\n <!-- Coluna 1: Seu valor -->\r\n <div class=\"salary-metric-col\">\r\n <span class=\"salary-metric-label\">Seu valor</span>\r\n <span\r\n class=\"salary-metric-value\"\r\n [class.salary-metric-value--not-informed]=\"salaryStatus === DutySalaryStatus.NotInformed\"\r\n [class.salary-metric-value--insufficient]=\"salaryStatus === DutySalaryStatus.InsufficientData\"\r\n >\r\n {{ formattedYourSalary }}\r\n </span>\r\n </div>\r\n\r\n <!-- Divisor vertical -->\r\n <div class=\"salary-metric-divider\"></div>\r\n\r\n <!-- Coluna 2: M\u00E9dia da regi\u00E3o -->\r\n <div class=\"salary-metric-col\">\r\n <span class=\"salary-metric-label\">M\u00E9dia da regi\u00E3o</span>\r\n <span\r\n class=\"salary-metric-value\"\r\n [class.salary-metric-value--orange]=\"salaryStatus === DutySalaryStatus.BelowMarket\"\r\n [class.salary-metric-value--blue]=\"salaryStatus === DutySalaryStatus.AtMarket\"\r\n [class.salary-metric-value--navy]=\"salaryStatus === DutySalaryStatus.AboveMarket\"\r\n [class.salary-metric-value--insufficient]=\"salaryStatus === DutySalaryStatus.InsufficientData\"\r\n [class.salary-metric-value--muted]=\"salaryStatus === DutySalaryStatus.NotInformed\"\r\n >\r\n {{ formattedRegionalAverage }}\r\n </span>\r\n </div>\r\n\r\n <!-- Badge Din\u00E2mico -->\r\n <div\r\n class=\"salary-badge\"\r\n [ngClass]=\"salaryBadgeClass\"\r\n *ngIf=\"selectedDutySalaryComparison.badgeText\"\r\n >\r\n {{ selectedDutySalaryComparison.badgeText }}\r\n </div>\r\n </header>\r\n\r\n <!-- Linha/Corpo textual com Destaque e Explica\u00E7\u00E3o -->\r\n <div class=\"salary-card-body\">\r\n <h4 class=\"salary-highlight-title\" [ngClass]=\"salaryTitleColorClass\">\r\n {{ selectedDutySalaryComparison.highlightTitle }}\r\n </h4>\r\n <p class=\"salary-description\">\r\n {{ selectedDutySalaryComparison.description }}\r\n </p>\r\n </div>\r\n </article>\r\n\r\n <!-- Card de Suporte: D\u00FAvidas sobre esses dados? -->\r\n <article class=\"vacancy-support-card\">\r\n <h4 class=\"support-card-title\">Ainda com d\u00FAvidas sobre esses dados?</h4>\r\n <p class=\"support-card-subtitle\">\r\n Se depois de ver os gr\u00E1ficos voc\u00EA ficou com perguntas sem resposta, fale com a nossa equipe.\r\n </p>\r\n <button\r\n type=\"button\"\r\n class=\"btn-support-consultant\"\r\n (click)=\"openConsultantWhatsApp('D\u00FAvidas sobre esses dados')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </article>\r\n </div>\r\n <!-- #endregion -->\r\n </ng-container>\r\n\r\n <ng-template #noActiveDuties>\r\n <div class=\"zero-state-banner\" *ngIf=\"isPublishZeroState; else basicVacancyZero\">\r\n <div class=\"zero-state-banner-left\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"zero-state-banner-texts\">\r\n <h3 class=\"zero-state-banner-title\">Nenhuma vaga para analisar</h3>\r\n <p class=\"zero-state-banner-subtitle\">Cadastre uma vaga para come\u00E7ar a acompanhar o desempenho dela aqui.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish\"\r\n (click)=\"onPublishDuty('An\u00E1lise por Vaga')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n\r\n <ng-template #basicVacancyZero>\r\n <div class=\"basic-empty-state basic-empty-state--vacancy\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Nenhuma vaga para analisar</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga ativa no momento para an\u00E1lise.</p>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region ApplicationsPerVacancySection -->\r\n <section class=\"applications-per-vacancy-section\">\r\n <header class=\"applications-section-header\">\r\n <h2 class=\"applications-section-title\">Candidaturas por Vaga</h2>\r\n <span class=\"applications-section-subtitle\" *ngIf=\"hasComparisonDuties\">\r\n {{ comparisonSubtitle }}\r\n </span>\r\n <span class=\"applications-section-subtitle\" *ngIf=\"!hasComparisonDuties\">\r\n {{ isPublishZeroState ? '0 candidaturas no total, nenhuma vaga ativa' : 'Nenhuma vaga ativa no momento' }}\r\n </span>\r\n </header>\r\n\r\n <div class=\"applications-chart-wrapper\" *ngIf=\"hasComparisonDuties; else noComparisonDuties\">\r\n <careon-comparison-bar-chart\r\n [data]=\"comparisonItems\"\r\n [autoBarWidth]=\"false\"\r\n [barWidth]=\"75\"\r\n [itemSlotWidth]=\"100\"\r\n [barColor]=\"'#3B82F6'\"\r\n [zeroColor]=\"'#EF4444'\"\r\n [trendLineColor]=\"'#1E293B'\"\r\n [dotColor]=\"'#1E293B'\"\r\n [textColor]=\"'#64748B'\"\r\n (itemSelected)=\"onChartItemSelected($event, 'Candidaturas por Vaga')\"\r\n ></careon-comparison-bar-chart>\r\n </div>\r\n\r\n <ng-template #noComparisonDuties>\r\n <div class=\"zero-state-banner\" *ngIf=\"isPublishZeroState; else basicComparisonZero\">\r\n <div class=\"zero-state-banner-left\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"zero-state-banner-texts\">\r\n <h3 class=\"zero-state-banner-title\">Nenhuma candidatura registrada</h3>\r\n <p class=\"zero-state-banner-subtitle\">Sem vagas em aberto, ainda n\u00E3o h\u00E1 candidaturas para mostrar.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish\"\r\n (click)=\"onPublishDuty('Candidaturas por Vaga')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n\r\n <ng-template #basicComparisonZero>\r\n <div class=\"basic-empty-state basic-empty-state--comparison\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Nenhuma candidatura registrada</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga ativa no momento para an\u00E1lise.</p>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </section>\r\n <!-- #endregion -->\r\n </main>\r\n <!-- #endregion -->\r\n</div>\r\n", styles: [":host{display:block;width:100%}.careon-dashboard-container{display:flex;flex-direction:column;gap:24px;width:100%;max-width:1400px;margin:0 auto;padding:16px 24px;box-sizing:border-box;font-family:Montserrat,sans-serif;color:#1b2559}.careon-dashboard-container .dashboard-header{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:16px;padding-bottom:8px}.careon-dashboard-container .dashboard-header .header-titles .main-title{font-size:26px;font-weight:700;color:#1b2559;margin:0;letter-spacing:-.3px}.careon-dashboard-container .dashboard-header .header-titles .subtitle{font-size:13px;color:#a3aed0;margin:4px 0 0;font-weight:500}.careon-dashboard-container .dashboard-header .period-filter-group{display:inline-flex;align-items:center;background:#ffffff;padding:4px;border-radius:9999px;gap:2px;border:1px solid #eef0f4;box-shadow:0 2px 8px #0000000a}.careon-dashboard-container .dashboard-header .period-filter-group .period-pill{padding:14px 25px;font-family:Montserrat,sans-serif;font-size:13px;font-weight:500;color:#8e9091;background:transparent;border:none;border-radius:9999px;cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);outline:none}.careon-dashboard-container .dashboard-header .period-filter-group .period-pill:hover{color:#292857}.careon-dashboard-container .dashboard-header .period-filter-group .period-pill.active{background:#292857;color:#fff;font-weight:600;box-shadow:0 2px 8px #29285740}.careon-dashboard-container .dashboard-loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 24px;gap:16px}.careon-dashboard-container .dashboard-loading-state .loading-spinner{width:40px;height:40px;border:3px solid #e2e8f0;border-top-color:#3b82f6;border-radius:50%;animation:spin .8s linear infinite}.careon-dashboard-container .dashboard-loading-state .loading-text{font-size:14px;font-weight:500;color:#64748b;margin:0}.careon-dashboard-container .dashboard-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 24px;background:#ffffff;border:1px dashed #cbd5e1;border-radius:12px;text-align:center}.careon-dashboard-container .dashboard-empty-state .empty-title{font-size:16px;font-weight:700;color:#334155;margin:0 0 6px}.careon-dashboard-container .dashboard-empty-state .empty-description{font-size:14px;color:#64748b;margin:0}.careon-dashboard-container .dashboard-content{display:flex;flex-direction:column}.careon-dashboard-container .dashboard-content .zero-state-banner{background-color:#dee9fb;border-radius:12px;padding:20px 24px;display:flex;align-items:center;justify-content:space-between;gap:16px;width:100%;box-sizing:border-box}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left{display:flex;align-items:center;gap:14px}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-info-icon{color:#5c8bef;width:24px;height:24px;flex-shrink:0}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-state-banner-texts{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-state-banner-texts .zero-state-banner-title{font-size:15px;font-weight:700;color:#1e2445;margin:0;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .zero-state-banner .zero-state-banner-left .zero-state-banner-texts .zero-state-banner-subtitle{font-size:13px;font-weight:400;color:#718096;margin:0;font-family:Montserrat,sans-serif;line-height:1.4}@media (max-width: 768px){.careon-dashboard-container .dashboard-content .zero-state-banner{flex-direction:column;align-items:stretch}.careon-dashboard-container .dashboard-content .zero-state-banner .btn-zero-publish{width:100%;margin-top:8px}}.careon-dashboard-container .dashboard-content .btn-zero-publish{background-color:#5c8bef;color:#fff;border:none;border-radius:10px;padding:12px 28px;font-size:14px;font-weight:600;font-family:Montserrat,sans-serif;cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;transition:background-color .2s ease,transform .1s ease;outline:none}.careon-dashboard-container .dashboard-content .btn-zero-publish:hover{background-color:#4a7de6}.careon-dashboard-container .dashboard-content .btn-zero-publish:active{transform:scale(.98)}.careon-dashboard-container .dashboard-content .btn-zero-publish--full{width:100%;margin-top:auto}.careon-dashboard-container .dashboard-content .kpi-cards-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) minmax(0,1.75fr);gap:16px;align-items:stretch;width:100%;max-width:100%;box-sizing:border-box}@media (max-width: 1200px){.careon-dashboard-container .dashboard-content .kpi-cards-grid{grid-template-columns:repeat(2,1fr)}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status{grid-column:span 2}}@media (max-width: 600px){.careon-dashboard-container .dashboard-content .kpi-cards-grid{grid-template-columns:1fr}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status{grid-column:span 1}}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card{background:#ffffff;border-radius:24px;padding:14px 18px;border:none;box-shadow:0 4px 20px #0000000a;display:flex;flex-direction:column;justify-content:space-between;min-height:104px;box-sizing:border-box}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-header{display:flex;justify-content:space-between;align-items:center}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-header .kpi-label{font-size:12px;font-weight:600;color:#a3aed0}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-header .kpi-total-badge{font-size:11px;font-weight:700;color:#1b2559}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body{display:flex;align-items:center;gap:8px;margin-top:4px}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-value{font-size:24px;font-weight:700;color:#1b2559;line-height:1}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;padding:3px 8px;border-radius:12px;white-space:nowrap}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge .kpi-badge-icon{width:10px;height:10px;display:inline-block;flex-shrink:0}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--blue{background:#e0f2fe;color:#0284c7}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--green{background:#dcfce7;color:#16a34a}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--coral{background:#fee2e2;color:#dc2626}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-card-body .kpi-badge--gray{background:#f1f5f9;color:#64748b}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card .kpi-footer{font-size:11px;color:#a3aed0;font-weight:500;margin-top:6px}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status{padding:14px 18px;justify-content:center}.careon-dashboard-container .dashboard-content .kpi-cards-grid .kpi-card--status careon-stacked-horizontal-bar{display:block;width:100%}.careon-dashboard-container .dashboard-content .attention-section{margin-top:32px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;width:100%;box-sizing:border-box}.careon-dashboard-container .dashboard-content .attention-section .attention-card{background:#ffffff;border-radius:24px;padding:24px 28px;border:none;box-shadow:0 4px 20px #0000000a;display:flex;flex-direction:column;width:100%;box-sizing:border-box}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-card-title{font-size:19px;font-weight:700;color:#1b2559;margin:0 0 16px;letter-spacing:-.3px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper{display:flex;flex-direction:column}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item{display:flex;flex-direction:column;gap:4px;padding:14px 0;cursor:pointer;transition:opacity .15s ease}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item:hover{opacity:.82}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item .attention-item-title{font-size:15px;font-weight:600;color:#2b3674;line-height:1.3}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-item .attention-item-subtitle{font-size:13px;font-weight:400;color:#8e9091;line-height:1.4}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-items-list .attention-item-wrapper .attention-divider{height:1px;background-color:#f1f5f9;width:100%;margin:0}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box{background-color:#dee9fb;border-radius:12px;padding:20px;display:flex;flex-direction:column;box-sizing:border-box}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header{display:flex;align-items:flex-start;gap:12px;margin-bottom:16px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .zero-info-icon{color:#5c8bef;width:22px;height:22px;flex-shrink:0;margin-top:1px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .attention-zero-texts{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .attention-zero-texts .attention-zero-title{font-size:14.5px;font-weight:700;color:#1e2445;margin:0;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-zero-box .attention-zero-header .attention-zero-texts .attention-zero-subtitle{font-size:13px;font-weight:400;color:#718096;margin:0;font-family:Montserrat,sans-serif;line-height:1.4}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background-color:#f8fafc;border:1px dashed #cbd5e1;border-radius:16px;box-sizing:border-box;padding:28px 20px;flex:1;margin-bottom:20px;min-height:180px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-icon-wrap,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-icon-wrap{width:44px;height:44px;border-radius:50%;background-color:#eff6ff;color:#3b82f6;display:flex;align-items:center;justify-content:center;margin-bottom:12px;flex-shrink:0}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-icon-wrap .basic-empty-icon,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-icon-wrap .basic-empty-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-title,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-title{font-size:15px;font-weight:700;color:#1e293b;margin:0 0 6px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .attention-section .attention-card .basic-empty-state .basic-empty-text,.careon-dashboard-container .dashboard-content .attention-section .attention-card .attention-empty-state .basic-empty-text{font-size:13.5px;font-weight:400;color:#64748b;margin:0;font-family:Montserrat,sans-serif;line-height:1.45;max-width:460px}.careon-dashboard-container .dashboard-content .attention-section .attention-card .btn-consultant{width:100%;display:flex;align-items:center;justify-content:center;background-color:#3b82f6;color:#fff;font-family:Montserrat,sans-serif;font-size:14px;font-weight:600;border:none;border-radius:9999px;padding:13px 24px;margin-top:auto;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 14px #3b82f64d;outline:none}.careon-dashboard-container .dashboard-content .attention-section .attention-card .btn-consultant:hover{background-color:#2563eb;box-shadow:0 6px 18px #2563eb66;transform:translateY(-1px)}.careon-dashboard-container .dashboard-content .attention-section .attention-card .btn-consultant:active{transform:translateY(0);box-shadow:0 2px 6px #2563eb40}.careon-dashboard-container .dashboard-content .attention-section .performance-card{background:#ffffff;border-radius:24px;padding:24px 28px;border:none;box-shadow:0 4px 20px #0000000a;display:flex;flex-direction:column;width:100%;box-sizing:border-box;position:relative}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-card-title{font-size:19px;font-weight:700;color:#1b2559;margin:0;letter-spacing:-.3px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper{position:relative;display:inline-flex;align-items:center}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .btn-info{background:transparent;border:none;padding:4px;cursor:pointer;color:#a3aed0;transition:color .2s ease;display:flex;align-items:center;justify-content:center;outline:none;border-radius:50%}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .btn-info:hover{color:#3b82f6}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .btn-info .info-icon{width:18px;height:18px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .info-tooltip{position:absolute;top:calc(100% + 8px);right:0;width:290px;background:#f0f7ff;border:1px solid #93c5fd;border-radius:10px;padding:12px 14px;box-shadow:0 6px 20px #3b82f626;z-index:20;box-sizing:border-box;animation:fadeInTooltip .2s ease-out}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .info-tooltip .tooltip-arrow{position:absolute;top:-6px;right:8px;width:10px;height:10px;background:#f0f7ff;border-top:1px solid #93c5fd;border-left:1px solid #93c5fd;transform:rotate(45deg)}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-card-header .performance-info-wrapper .info-tooltip .tooltip-text{font-size:12px;line-height:1.45;color:#334155;margin:0;font-weight:500;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .attention-section .performance-card careon-performance-wave{display:block;width:100%}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-body{display:flex;flex-direction:column;margin-bottom:16px}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-body .performance-highlight-title{font-size:13.5px;font-weight:700;color:#3b82f6;margin:0 0 6px;line-height:1.35}.careon-dashboard-container .dashboard-content .attention-section .performance-card .performance-body .performance-description{font-size:12.5px;font-weight:400;color:#8e9091;margin:0;line-height:1.45}.careon-dashboard-container .dashboard-content .attention-section .performance-card .btn-consultant{width:100%;display:flex;align-items:center;justify-content:center;background-color:#3b82f6;color:#fff;font-family:Montserrat,sans-serif;font-size:14px;font-weight:600;border:none;border-radius:9999px;padding:13px 24px;margin-top:auto;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 14px #3b82f64d;outline:none}.careon-dashboard-container .dashboard-content .attention-section .performance-card .btn-consultant:hover{background-color:#2563eb;box-shadow:0 6px 18px #2563eb66;transform:translateY(-1px)}.careon-dashboard-container .dashboard-content .attention-section .performance-card .btn-consultant:active{transform:translateY(0);box-shadow:0 2px 6px #2563eb40}.careon-dashboard-container .dashboard-content .vacancy-analysis-section{margin-top:32px;display:flex;flex-direction:column;background-color:#fff;border:none;border-radius:24px;padding:28px 32px;box-shadow:0 4px 20px #0000000a;box-sizing:border-box}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px;margin-bottom:24px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-section-title-group{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-section-title-group .vacancy-section-title{font-size:20px;font-weight:700;color:#1e1b4b;margin:0;letter-spacing:-.02em}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-section-title-group .vacancy-section-subtitle{font-size:13px;font-weight:400;color:#94a3b8}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper{display:flex;align-items:center;gap:12px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-label{font-size:13px;font-weight:500;color:#64748b}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container{position:relative}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn{display:inline-flex;align-items:center;justify-content:space-between;gap:10px;min-width:180px;padding:9px 18px;background-color:#fff;border:1px solid #e2e8f0;border-radius:9999px;font-family:Montserrat,sans-serif;font-size:13.5px;font-weight:600;color:#1e1b4b;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 3px #0000000a;outline:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn:hover{border-color:#cbd5e1;background-color:#f8fafc}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn--open{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f626}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn .vacancy-dropdown-btn-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn .vacancy-dropdown-btn-icon{width:18px;height:18px;color:#64748b;flex-shrink:0;transition:transform .2s ease}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-btn .vacancy-dropdown-btn-icon.rotated{transform:rotate(180deg)}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-backdrop{position:fixed;inset:0;z-index:99;background:transparent}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:100;min-width:320px;max-width:440px;max-height:360px;overflow-y:auto;background:#ffffff;border:1px solid #e2e8f0;border-radius:16px;padding:8px;box-shadow:0 10px 25px -5px #0000001a,0 8px 10px -6px #0000000d}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item{display:flex;align-items:center;gap:12px;padding:10px 14px;border-radius:10px;cursor:pointer;transition:background-color .15s ease}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item:hover{background-color:#f1f5f9}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item--selected{background-color:#eff6ff}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item--selected .duty-item-title{color:#3b82f6}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer{width:18px;height:18px;border-radius:50%;border:2px solid #3b82f6;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s ease}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer:not(.duty-radio-outer--checked){border-color:#93c5fd}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer--checked{border-color:#3b82f6}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-radio-outer .duty-radio-inner{width:8px;height:8px;border-radius:50%;background-color:#3b82f6}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-item-content{display:flex;flex-direction:column;gap:2px;overflow:hidden}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-item-content .duty-item-title{font-size:13.5px;font-weight:600;color:#1e1b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-section-header .vacancy-dropdown-wrapper .vacancy-dropdown-container .vacancy-dropdown-menu .vacancy-dropdown-item .duty-item-content .duty-item-subtitle{font-size:11.5px;font-weight:400;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-timeline-wrapper{width:100%;margin-bottom:24px;overflow:hidden}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-timeline-wrapper ::ng-deep .timeline-baseline{background-color:#f1f5f9}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid{display:grid;grid-template-columns:minmax(230px,26%) 1fr;gap:20px}@media (max-width: 900px){.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid{grid-template-columns:1fr}}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid .vacancy-metric-card{background-color:#f7f7f7;border:none;border-radius:24px;padding:20px 24px;box-shadow:none;display:flex;flex-direction:column;overflow:visible;min-height:164px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid .vacancy-metric-card--donut{min-height:164px;overflow:visible}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-bottom-grid .vacancy-metric-card--funnel{min-height:164px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid{display:grid;grid-template-columns:1fr 450px;gap:20px;margin-top:20px}@media (max-width: 992px){.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid{grid-template-columns:1fr}}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card{background-color:#f7f7f7;border:none;border-radius:24px;padding:24px 28px;display:flex;flex-direction:column;justify-content:center;box-shadow:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header{display:flex;align-items:center;gap:24px;margin-bottom:16px;flex-wrap:wrap}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col{display:flex;flex-direction:column;gap:4px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-label{font-size:13px;font-weight:500;color:#71717a;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value{font-size:26px;font-weight:700;color:#374151;font-family:Montserrat,sans-serif;line-height:1.2}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--orange{color:#d97706}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--blue{color:#2563eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--navy{color:#1e1b4b}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--not-informed{color:#b91c1c;font-weight:700}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--insufficient{color:#444;font-weight:700}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-col .salary-metric-value--muted{color:#4b5563}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-metric-divider{width:1px;height:38px;background-color:#e5e7eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge{margin-left:auto;padding:6px 14px;border-radius:9999px;font-size:13px;font-weight:600;font-family:Montserrat,sans-serif;display:inline-flex;align-items:center;white-space:nowrap}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge--orange{background-color:#ffedd5;color:#c2410c;border:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge--blue{background-color:#dbeafd;color:#1d4ed8;border:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-header .salary-badge--purple{background-color:#ede9fe;color:#1e1b4b;border:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body{display:flex;flex-direction:column;gap:6px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title{font-size:14.5px;font-weight:700;margin:0;font-family:Montserrat,sans-serif;line-height:1.4}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--orange{color:#d97706}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--blue{color:#2563eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--purple{color:#1e1b4b}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--red{color:#b91c1c}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-highlight-title.salary-title--default{color:#111827}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-salary-card .salary-card-body .salary-description{font-size:13px;font-weight:400;color:#4b5563;margin:0;line-height:1.55;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card{background-color:#f7f7f7;border:none;border-radius:24px;padding:24px 28px;display:flex;flex-direction:column;justify-content:space-between;box-shadow:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .support-card-title{font-size:17px;font-weight:700;color:#3b82f6;margin:0 0 10px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .support-card-subtitle{font-size:13.5px;font-weight:400;color:#64748b;margin:0 0 20px;line-height:1.5;font-family:Montserrat,sans-serif;flex-grow:1}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .btn-support-consultant{background-color:#3b82f6;color:#fff;border:none;border-radius:9999px;padding:13px 24px;font-size:14px;font-weight:700;font-family:Montserrat,sans-serif;cursor:pointer;transition:background-color .15s ease,transform .1s ease;width:100%;text-align:center;box-shadow:none;outline:none}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .btn-support-consultant:hover{background-color:#2563eb}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-salary-support-grid .vacancy-support-card .btn-support-consultant:active{transform:scale(.98)}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background-color:#f8fafc;border:1px dashed #cbd5e1;border-radius:16px;box-sizing:border-box;padding:44px 24px;width:100%;min-height:180px}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-icon-wrap,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-icon-wrap{width:44px;height:44px;border-radius:50%;background-color:#eff6ff;color:#3b82f6;display:flex;align-items:center;justify-content:center;margin-bottom:12px;flex-shrink:0}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-icon-wrap .basic-empty-icon,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-icon-wrap .basic-empty-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-title,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-title{font-size:15px;font-weight:700;color:#1e293b;margin:0 0 6px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .vacancy-analysis-section .basic-empty-state .basic-empty-text,.careon-dashboard-container .dashboard-content .vacancy-analysis-section .vacancy-empty-state .basic-empty-text{font-size:13.5px;font-weight:400;color:#64748b;margin:0;font-family:Montserrat,sans-serif;line-height:1.45;max-width:460px}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section{margin-top:32px;display:flex;flex-direction:column;background-color:#fff;border:none;border-radius:24px;padding:28px 32px;box-shadow:0 4px 20px #0000000a;box-sizing:border-box}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-section-header{display:flex;flex-direction:column;gap:4px;margin-bottom:24px}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-section-header .applications-section-title{font-size:20px;font-weight:700;color:#1e1b4b;margin:0;letter-spacing:-.02em;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-section-header .applications-section-subtitle{font-size:13px;font-weight:400;color:#94a3b8;font-family:Montserrat,sans-serif}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-chart-wrapper{width:100%;overflow:hidden}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background-color:#f8fafc;border:1px dashed #cbd5e1;border-radius:16px;box-sizing:border-box;padding:44px 24px;width:100%;min-height:180px}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-icon-wrap,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-icon-wrap{width:44px;height:44px;border-radius:50%;background-color:#eff6ff;color:#3b82f6;display:flex;align-items:center;justify-content:center;margin-bottom:12px;flex-shrink:0}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-icon-wrap .basic-empty-icon,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-icon-wrap .basic-empty-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-title,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-title{font-size:15px;font-weight:700;color:#1e293b;margin:0 0 6px;font-family:Montserrat,sans-serif;line-height:1.35}.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .basic-empty-state .basic-empty-text,.careon-dashboard-container .dashboard-content .applications-per-vacancy-section .applications-empty-state .basic-empty-text{font-size:13.5px;font-weight:400;color:#64748b;margin:0;font-family:Montserrat,sans-serif;line-height:1.45;max-width:460px}@keyframes spin{to{transform:rotate(360deg)}}@keyframes fadeInTooltip{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"] }]
|
|
491
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], loading: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], currentPeriod: [{
|
|
496
|
+
type: Input
|
|
497
|
+
}], title: [{
|
|
498
|
+
type: Input
|
|
499
|
+
}], subtitle: [{
|
|
500
|
+
type: Input
|
|
501
|
+
}], emptyMessage: [{
|
|
502
|
+
type: Input
|
|
503
|
+
}], consultantPhone: [{
|
|
504
|
+
type: Input
|
|
505
|
+
}], consultantMessage: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], zeroStateMode: [{
|
|
508
|
+
type: Input
|
|
509
|
+
}], periodChange: [{
|
|
510
|
+
type: Output
|
|
511
|
+
}], itemSelected: [{
|
|
512
|
+
type: Output
|
|
513
|
+
}], publishDuty: [{
|
|
514
|
+
type: Output
|
|
515
|
+
}], dutySelected: [{
|
|
516
|
+
type: Output
|
|
517
|
+
}], consultantClick: [{
|
|
518
|
+
type: Output
|
|
519
|
+
}], attentionItemSelected: [{
|
|
520
|
+
type: Output
|
|
521
|
+
}] } });
|
|
522
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC9zcmMvbGliL2Rhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQvc3JjL2xpYi9kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFJeEIsTUFBTSxlQUFlLENBQUM7QUFRdkIsT0FBTyxFQUVMLGVBQWUsRUFJZixnQkFBZ0IsRUFHaEIsZ0JBQWdCLEVBQ2pCLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7QUFZbkMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFZLEVBQUUsUUFBcUIsRUFBRSxTQUFTLEdBQUcsS0FBSztJQUNuRixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQzFCLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7SUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUU1QixNQUFNLFVBQVUsR0FBRyxNQUFNO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXBGLElBQUksVUFBVSxHQUFHLGlCQUFpQixDQUFDO0lBQ25D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SztzQkFBYixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFNRyxlQUFlO3NCQUF2QixLQUFLO2dCQU1HLGlCQUFpQjtzQkFBekIsS0FBSztnQkFRRyxhQUFhO3NCQUFyQixLQUFLO2dCQVdJLFlBQVk7c0JBQXJCLE1BQU07Z0JBS0csWUFBWTtzQkFBckIsTUFBTTtnQkFLRyxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLFlBQVk7c0JBQXJCLE1BQU07Z0JBS0csZUFBZTtzQkFBeEIsTUFBTTtnQkFLRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgU3RhY2tlZEJhckl0ZW0sXHJcbiAgVGltZWxpbmVQb2ludCxcclxuICBEb251dENoYXJ0SXRlbSxcclxuICBGdW5uZWxCYXJJdGVtLFxyXG4gIENvbXBhcmlzb25JdGVtXHJcbn0gZnJvbSAnQGNhcmVvbmJyYXNpbC9uZy1jaGFydHMnO1xyXG5pbXBvcnQge1xyXG4gIERhc2hib2FyZE92ZXJ2aWV3RGF0YSxcclxuICBEYXNoYm9hcmRQZXJpb2QsXHJcbiAgRGFzaGJvYXJkSXRlbVNlbGVjdGVkRXZlbnQsXHJcbiAgRGFzaGJvYXJkQXR0ZW50aW9uSXRlbSxcclxuICBEYXNoYm9hcmRQZXJmb3JtYW5jZUFuYWx5c2lzLFxyXG4gIFBlcmZvcm1hbmNlTGV2ZWwsXHJcbiAgRGFzaGJvYXJkRHV0eUFuYWx5c2lzLFxyXG4gIERhc2hib2FyZER1dHlTYWxhcnlDb21wYXJpc29uLFxyXG4gIER1dHlTYWxhcnlTdGF0dXNcclxufSBmcm9tICcuL21vZGVscy9kYXNoYm9hcmQubW9kZWxzJztcclxuXHJcbmV4cG9ydCB0eXBlIEtwaVBvbGFyaXR5ID0gJ2hpZ2hlcklzQmV0dGVyJyB8ICdsb3dlcklzQmV0dGVyJyB8ICduZXV0cmFsJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgS3BpQmFkZ2VJbmZvIHtcclxuICBjaGFuZ2VUZXh0OiBzdHJpbmc7XHJcbiAgYmFkZ2VDbGFzczogc3RyaW5nO1xyXG4gIGlzUG9zaXRpdmU6IGJvb2xlYW47XHJcbiAgaXNOZWdhdGl2ZTogYm9vbGVhbjtcclxuICBpc1plcm86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRLcGlCYWRnZShkaWZmOiBudW1iZXIsIHBvbGFyaXR5OiBLcGlQb2xhcml0eSwgaXNEZWNpbWFsID0gZmFsc2UpOiBLcGlCYWRnZUluZm8ge1xyXG4gIGNvbnN0IGlzWmVybyA9IGRpZmYgPT09IDA7XHJcbiAgY29uc3QgaXNQb3NpdGl2ZSA9IGRpZmYgPiAwO1xyXG4gIGNvbnN0IGlzTmVnYXRpdmUgPSBkaWZmIDwgMDtcclxuXHJcbiAgY29uc3QgY2hhbmdlVGV4dCA9IGlzWmVyb1xyXG4gICAgPyAoaXNEZWNpbWFsID8gJzAsMCcgOiAnMCcpXHJcbiAgICA6IChpc0RlY2ltYWwgPyBNYXRoLmFicyhkaWZmKS50b0ZpeGVkKDEpLnJlcGxhY2UoJy4nLCAnLCcpIDogYCR7TWF0aC5hYnMoZGlmZil9YCk7XHJcblxyXG4gIGxldCBiYWRnZUNsYXNzID0gJ2twaS1iYWRnZS0tZ3JheSc7XHJcbiAgaWYgKCFpc1plcm8pIHtcclxuICAgIGlmIChwb2xhcml0eSA9PT0gJ25ldXRyYWwnKSB7XHJcbiAgICAgIGJhZGdlQ2xhc3MgPSAna3BpLWJhZGdlLS1ibHVlJztcclxuICAgIH0gZWxzZSBpZiAocG9sYXJpdHkgPT09ICdoaWdoZXJJc0JldHRlcicpIHtcclxuICAgICAgYmFkZ2VDbGFzcyA9IGlzUG9zaXRpdmUgPyAna3BpLWJhZGdlLS1ncmVlbicgOiAna3BpLWJhZGdlLS1jb3JhbCc7XHJcbiAgICB9IGVsc2UgaWYgKHBvbGFyaXR5ID09PSAnbG93ZXJJc0JldHRlcicpIHtcclxuICAgICAgYmFkZ2VDbGFzcyA9IGlzUG9zaXRpdmUgPyAna3BpLWJhZGdlLS1jb3JhbCcgOiAna3BpLWJhZGdlLS1ncmVlbic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyBjaGFuZ2VUZXh0LCBiYWRnZUNsYXNzLCBpc1Bvc2l0aXZlLCBpc05lZ2F0aXZlLCBpc1plcm8gfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEVSRk9STUFOQ0VfVEVYVFM6IFJlY29yZDxQZXJmb3JtYW5jZUxldmVsLCB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSB7XHJcbiAgW1BlcmZvcm1hbmNlTGV2ZWwuQmx1ZV06IHtcclxuICAgIHRpdGxlOiAnQWluZGEgdGVtIGVzcGHDp28gcGFyYSBzZSBkZXN0YWNhci4nLFxyXG4gICAgZGVzY3JpcHRpb246ICdTdWEgaW5zdGl0dWnDp8OjbyBqw6EgZGVzcGVydGEgYm9tIGludGVyZXNzZSBlbnRyZSBvcyBjYW5kaWRhdG9zLiBGYWxlIGNvbSB1bSBjb25zdWx0b3IgZGEgQ2FyZU9uIHBhcmEgaXIgYWluZGEgbWFpcyBsb25nZS4nXHJcbiAgfSxcclxuICBbUGVyZm9ybWFuY2VMZXZlbC5PcmFuZ2VdOiB7XHJcbiAgICB0aXRsZTogJ1N1YXMgdmFnYXMgZXN0w6NvIHNlbmRvIHZpc3RhcywgbWFzIHBvdWNhIGdlbnRlIHNlIGNhbmRpZGF0YS4nLFxyXG4gICAgZGVzY3JpcHRpb246ICdJc3NvIHBvZGUgaW5kaWNhciBxdWUgb3MgdmFsb3JlcyBvZmVyZWNpZG9zIGVzdMOjbyBhYmFpeG8gZGEgbcOpZGlhIGRhIHJlZ2nDo28sIHF1ZSBmYWx0YW0gaW5mb3JtYcOnw7VlcyBtYWlzIGF0cmF0aXZhcyBvdSBxdWUgc3VhcyBpbmZvcm1hw6fDtWVzIGVzdMOjbyBpbmNvbXBsZXRhcy4gRmFsZSBjb20gdW0gY29uc3VsdG9yIGRhIENhcmVPbi4nXHJcbiAgfSxcclxuICBbUGVyZm9ybWFuY2VMZXZlbC5SZWRdOiB7XHJcbiAgICB0aXRsZTogJ1N1YSBpbnN0aXR1acOnw6NvIG7Do28gZXN0w6Egc2VuZG8gbXVpdG8gcHJvY3VyYWRhIHBlbG9zIGNhbmRpZGF0b3MuJyxcclxuICAgIGRlc2NyaXB0aW9uOiAnRmF6IHRlbXBvIHF1ZSB2b2PDqiBuw6NvIHB1YmxpY2EgdW1hIHZhZ2EsIHBvciBpc3NvIHN1YSBhbsOhbGlzZSBkZSBkZXNlbXBlbmhvIHZlbSBjYWluZG8uIEZhbGUgY29tIHVtIGNvbnN1bHRvciBkYSBDYXJlT24gcGFyYSB0ZXIgdW0gYXBvaW8gcGVyc29uYWxpemFkby4nXHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgcHJpbmNpcGFsIGRlIERhc2hib2FyZCBkZSBSZWNydXRhbWVudG8gSW5zdGl0dWNpb25hbCBkYSBDYXJlT24uXHJcbiAqIFxyXG4gKiBDZW50cmFsaXphIGUgb3JxdWVzdHJhIGEgZXhpYmljYW8gZGU6XHJcbiAqIC0gQ2FiZWNhbGhvIGNvbSBmaWx0cm9zIHRlbXBvcmFpcyByZWF0aXZvcyAoSG9qZSwgU2VtYW5hLCBNZXMpXHJcbiAqIC0gQ2FyZHMgc3VwZXJpb3JlcyBkZSBJbmRpY2Fkb3Jlcy1DaGF2ZSBkZSBQZXJmb3JtYW5jZSAoS1BJcylcclxuICogLSBTZWNhbyBhY2lvbmF2ZWwgXCJQcmVjaXNhIGRhIHN1YSBhdGVuY2FvXCIgKGFsZXJ0YXMgZGUgdmFnYXMgY3JpdGljYXMpXHJcbiAqIC0gU2VjYW8gXCJBbmFsaXNlIGRlIERlc2VtcGVuaG9cIiAoY3VydmEgZGUgb25kYXMgdmV0b3JpYWwgZSBvcmllbnRhY2FvIGNvbnN1bHRpdmEpXHJcbiAqIC0gU2VjYW8gXCJBbmFsaXNlIHBvciBWYWdhXCIgKGRyb3Bkb3duIGRlIHZhZ2FzLCB0aW1lbGluZSwgZG9udXQgZGUgY29udmVyc2FvLCBmdW5pbCBlIGFuYWxpc2Ugc2FsYXJpYWwpXHJcbiAqIC0gU2VjYW8gXCJDYW5kaWRhdHVyYXMgcG9yIFZhZ2FcIiAoZ3JhZmljbyBjb21wYXJhdGl2byBkZSBiYXJyYXMgZW50cmUgdmFnYXMpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NhcmVvbi1kYXNoYm9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Rhc2hib2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIC8vICNyZWdpb24gSW5wdXRzXHJcbiAgLyoqXHJcbiAgICogQ29uc29saWRhdGVkIG1ldHJpY3MgZGF0YXNldCBmZWVkaW5nIHRoZSBkYXNoYm9hcmQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGF0YT86IERhc2hib2FyZE92ZXJ2aWV3RGF0YTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZGFzaGJvYXJkIGlzIGN1cnJlbnRseSBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGJhY2tlbmQgQVBJLlxyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICovXHJcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmUgdGltZSBwZXJpb2QgZmlsdGVyLlxyXG4gICAqIEBkZWZhdWx0ICdXZWVrJ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRQZXJpb2Q6IERhc2hib2FyZFBlcmlvZCA9IERhc2hib2FyZFBlcmlvZC5XZWVrO1xyXG5cclxuICByZWFkb25seSBEdXR5U2FsYXJ5U3RhdHVzID0gRHV0eVNhbGFyeVN0YXR1cztcclxuICByZWFkb25seSBQZXJmb3JtYW5jZUxldmVsID0gUGVyZm9ybWFuY2VMZXZlbDtcclxuICByZWFkb25seSBEYXNoYm9hcmRQZXJpb2QgPSBEYXNoYm9hcmRQZXJpb2Q7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1haW4gZGFzaGJvYXJkIHRpdGxlLlxyXG4gICAqIEBkZWZhdWx0ICdEYXNoYm9hcmQnXHJcbiAgICovXHJcbiAgQElucHV0KCkgdGl0bGUgPSAnRGFzaGJvYXJkJztcclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgc3VidGl0bGUgb3IgaW5zdGl0dXRpb24gbmFtZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci5cclxuICAgKiBAZGVmYXVsdCAnVmlzw6NvIGdlcmFsIGRlIHJlY3J1dGFtZW50bydcclxuICAgKi9cclxuICBASW5wdXQoKSBzdWJ0aXRsZSA9ICdWaXPDo28gZ2VyYWwgZGUgcmVjcnV0YW1lbnRvJztcclxuXHJcbiAgLyoqXHJcbiAgICogRW1wdHkgc3RhdGUgbWVzc2FnZSB3aGVuIG5vIGRhdGEgaXMgcmV0dXJuZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgZW1wdHlNZXNzYWdlID0gJ05lbmh1bSBkYWRvIHJlZ2lzdHJhZG8gcGFyYSBvIHBlcsOtb2RvIHNlbGVjaW9uYWRvLic7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN1bHRhbnQgcGhvbmUgbnVtYmVyIGZvciBXaGF0c0FwcCByZWRpcmVjdC5cclxuICAgKiBAZGVmYXVsdCAnNTU0Nzk5NjU2OTcwNydcclxuICAgKi9cclxuICBASW5wdXQoKSBjb25zdWx0YW50UGhvbmUgPSAnNTU0Nzk5NjU2OTcwNyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWwgbWVzc2FnZSBmb3IgV2hhdHNBcHAgY29uc3VsdGFudCBjaGF0LlxyXG4gICAqIEBkZWZhdWx0ICdlbXB0eSBzdHJpbmcnXHJcbiAgICovXHJcbiAgQElucHV0KCkgY29uc3VsdGFudE1lc3NhZ2UgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbHMgd2hldGhlciB6ZXJvZWQgc3RhdGVzIGRpc3BsYXkgdGhlIGFjdGlvbmFibGUgJ1B1YmxpY2FyIFZhZ2EnIENUQSBiYW5uZXIgb3IgYSBiYXNpYyBpbmZvcm1hdGlvbmFsIHplcm8gc3RhdGUuXHJcbiAgICogLSAncHVibGlzaCc6IGRpc3BsYXlzIHRoZSBzcGVjaWFsIGJ1c2luZXNzIHplcm8gc3RhdGUgd2l0aCB0aGUgJ1B1YmxpY2FyIFZhZ2EnIGFjdGlvbiBidXR0b24uXHJcbiAgICogLSAnYmFzaWMnOiBkaXNwbGF5cyB0aGUgc2ltcGxlL2Jhc2ljIHplcm8gc3RhdGUgd2l0aG91dCB0aGUgJ1B1YmxpY2FyIFZhZ2EnIGFjdGlvbiBidXR0b24uXHJcbiAgICogQGRlZmF1bHQgJ3B1Ymxpc2gnXHJcbiAgICovXHJcbiAgQElucHV0KCkgemVyb1N0YXRlTW9kZTogJ3B1Ymxpc2gnIHwgJ2Jhc2ljJyA9ICdwdWJsaXNoJztcclxuXHJcbiAgZ2V0IGlzUHVibGlzaFplcm9TdGF0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnplcm9TdGF0ZU1vZGUgPT09ICdwdWJsaXNoJztcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIE91dHB1dHNcclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW5ldmVyIHRoZSB1c2VyIHNlbGVjdHMgYSBkaWZmZXJlbnQgcGVyaW9kIGZpbHRlciAoVG9kYXksIFdlZWssIE1vbnRoKS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgcGVyaW9kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRQZXJpb2Q+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbmV2ZXIgYW4gaW50ZXJhY3RpdmUgZWxlbWVudCBpbiBhbnkgY2hhcnQgaXMgY2xpY2tlZCAocmVzZXJ2ZWQgZm9yIHVwY29taW5nIGNoYXJ0IHNlY3Rpb25zKS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgaXRlbVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRJdGVtU2VsZWN0ZWRFdmVudD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuZXZlciB0aGUgdXNlciBjbGlja3Mgb24gJ1B1YmxpY2FyIFZhZ2EnIGFjcm9zcyBhbnkgb2YgdGhlIHplcm8tc3RhdGUgYmFubmVycy5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgcHVibGlzaER1dHkgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IHZvaWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgc2VsZWN0cyBhIGR1dHkgaW4gdGhlIHZhY2FuY3kgYW5hbHlzaXMgZHJvcGRvd24uXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGR1dHlTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkRHV0eUFuYWx5c2lzPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW5ldmVyIHRoZSB1c2VyIGNsaWNrcyBvbiAnRmFsZSBjb20gdW0gY29uc3VsdG9yJyBhY3Jvc3MgYW55IHNlY3Rpb24uXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNvbnN1bHRhbnRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW5ldmVyIGEgdmFjYW5jeSBpbiB0aGUgYXR0ZW50aW9uIGxpc3QgaXMgY2xpY2tlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgYXR0ZW50aW9uSXRlbVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRBdHRlbnRpb25JdGVtPigpO1xyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgb25QdWJsaXNoRHV0eShzZWN0aW9uID0gJ1plcm8gU3RhdGUnKTogdm9pZCB7XHJcbiAgICB0aGlzLnB1Ymxpc2hEdXR5LmVtaXQoc2VjdGlvbik7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10pIHtcclxuICAgICAgdGhpcy5zeW5jU2VsZWN0ZWREdXR5KCk7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmcnXSB8fCBjaGFuZ2VzWydjdXJyZW50UGVyaW9kJ10pIHtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNTZWxlY3RlZER1dHkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudmFjYW5jaWVzQW5hbHlzaXMgfHwgdGhpcy52YWNhbmNpZXNBbmFseXNpcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZER1dHlJZCA9IG51bGw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMudmFjYW5jaWVzQW5hbHlzaXMuc29tZShkID0+IGQuZHV0eUlkID09PSB0aGlzLnNlbGVjdGVkRHV0eUlkKTtcclxuICAgIGlmICghZXhpc3RzKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREdXR5SWQgPSB0aGlzLnZhY2FuY2llc0FuYWx5c2lzWzBdLmR1dHlJZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gQXR0ZW50aW9uU2VjdGlvblxyXG4gIGdldCBhdHRlbnRpb25JdGVtcygpOiBEYXNoYm9hcmRBdHRlbnRpb25JdGVtW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uYXR0ZW50aW9uSXRlbXMgPz8gW107XHJcbiAgfVxyXG5cclxuICBvbkF0dGVudGlvbkl0ZW1DbGljayhpdGVtOiBEYXNoYm9hcmRBdHRlbnRpb25JdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dGVudGlvbkl0ZW1TZWxlY3RlZC5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgb3BlbkNvbnN1bHRhbnRXaGF0c0FwcChzZWN0aW9uID0gJ0NvbnN1bHRvcicpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uc3VsdGFudENsaWNrLmVtaXQoc2VjdGlvbik7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY29uc3QgY2xlYW5QaG9uZSA9ICh0aGlzLmNvbnN1bHRhbnRQaG9uZSB8fCAnNTU0Nzk5NjU2OTcwNycpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XHJcbiAgICAgIGNvbnN0IHRleHRQYXJhbSA9IHRoaXMuY29uc3VsdGFudE1lc3NhZ2VcclxuICAgICAgICA/IGAmdGV4dD0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmNvbnN1bHRhbnRNZXNzYWdlKX1gXHJcbiAgICAgICAgOiAnJztcclxuICAgICAgY29uc3Qgd2hhdHNhcHBVcmwgPSBgaHR0cHM6Ly9hcGkud2hhdHNhcHAuY29tL3NlbmQ/cGhvbmU9JHtjbGVhblBob25lfSR7dGV4dFBhcmFtfWA7XHJcbiAgICAgIHdpbmRvdy5vcGVuKHdoYXRzYXBwVXJsLCAnX2JsYW5rJywgJ25vb3BlbmVyLG5vcmVmZXJyZXInKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIFBlcmZvcm1hbmNlQW5hbHlzaXNTZWN0aW9uXHJcbiAgc2hvd0luZm9Ub29sdGlwID0gZmFsc2U7XHJcblxyXG4gIHRvZ2dsZUluZm9Ub29sdGlwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93SW5mb1Rvb2x0aXAgPSAhdGhpcy5zaG93SW5mb1Rvb2x0aXA7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uSW5mb01vdXNlRW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dJbmZvVG9vbHRpcCA9IHRydWU7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uSW5mb01vdXNlTGVhdmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dJbmZvVG9vbHRpcCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZm9ybWFuY2VBbmFseXNpcygpOiBEYXNoYm9hcmRQZXJmb3JtYW5jZUFuYWx5c2lzIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LnBlcmZvcm1hbmNlQW5hbHlzaXM7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZm9ybWFuY2VMZXZlbCgpOiBQZXJmb3JtYW5jZUxldmVsIHtcclxuICAgIGNvbnN0IGxldmVsID0gdGhpcy5wZXJmb3JtYW5jZUFuYWx5c2lzPy5sZXZlbDtcclxuICAgIGlmIChsZXZlbCA9PT0gUGVyZm9ybWFuY2VMZXZlbC5CbHVlIHx8IChsZXZlbCBhcyBhbnkpID09PSAwKSByZXR1cm4gUGVyZm9ybWFuY2VMZXZlbC5CbHVlO1xyXG4gICAgaWYgKGxldmVsID09PSBQZXJmb3JtYW5jZUxldmVsLk9yYW5nZSB8fCAobGV2ZWwgYXMgYW55KSA9PT0gMSkgcmV0dXJuIFBlcmZvcm1hbmNlTGV2ZWwuT3JhbmdlO1xyXG4gICAgaWYgKGxldmVsID09PSBQZXJmb3JtYW5jZUxldmVsLlJlZCB8fCAobGV2ZWwgYXMgYW55KSA9PT0gMikgcmV0dXJuIFBlcmZvcm1hbmNlTGV2ZWwuUmVkO1xyXG4gICAgcmV0dXJuIFBlcmZvcm1hbmNlTGV2ZWwuUmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZvcm1hbmNlVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnBlcmZvcm1hbmNlQW5hbHlzaXM/LmhpZ2hsaWdodFRpdGxlXHJcbiAgICAgIHx8IERFRkFVTFRfUEVSRk9STUFOQ0VfVEVYVFNbdGhpcy5wZXJmb3JtYW5jZUxldmVsXT8udGl0bGVcclxuICAgICAgfHwgREVGQVVMVF9QRVJGT1JNQU5DRV9URVhUU1tQZXJmb3JtYW5jZUxldmVsLlJlZF0udGl0bGU7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZm9ybWFuY2VEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybWFuY2VBbmFseXNpcz8uZGVzY3JpcHRpb25cclxuICAgICAgfHwgREVGQVVMVF9QRVJGT1JNQU5DRV9URVhUU1t0aGlzLnBlcmZvcm1hbmNlTGV2ZWxdPy5kZXNjcmlwdGlvblxyXG4gICAgICB8fCBERUZBVUxUX1BFUkZPUk1BTkNFX1RFWFRTW1BlcmZvcm1hbmNlTGV2ZWwuUmVkXS5kZXNjcmlwdGlvbjtcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIFZhY2FuY3lBbmFseXNpc1NlY3Rpb25cclxuICBzZWxlY3RlZER1dHlJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNEdXR5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcblxyXG4gIGdldCB2YWNhbmNpZXNBbmFseXNpcygpOiBEYXNoYm9hcmREdXR5QW5hbHlzaXNbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhPy52YWNhbmNpZXNBbmFseXNpcyA/PyBbXTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZER1dHkoKTogRGFzaGJvYXJkRHV0eUFuYWx5c2lzIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy52YWNhbmNpZXNBbmFseXNpcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREdXR5SWQpIHtcclxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnZhY2FuY2llc0FuYWx5c2lzLmZpbmQoZCA9PiBkLmR1dHlJZCA9PT0gdGhpcy5zZWxlY3RlZER1dHlJZCk7XHJcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudmFjYW5jaWVzQW5hbHlzaXNbMF07XHJcbiAgfVxyXG5cclxuICB0b2dnbGVEdXR5RHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRHV0eURyb3Bkb3duT3BlbiA9ICF0aGlzLmlzRHV0eURyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIGNsb3NlRHV0eURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0R1dHlEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdER1dHkoZHV0eTogRGFzaGJvYXJkRHV0eUFuYWx5c2lzKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRHV0eUlkID0gZHV0eS5kdXR5SWQ7XHJcbiAgICB0aGlzLmlzRHV0eURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5kdXR5U2VsZWN0ZWQuZW1pdChkdXR5KTtcclxuICB9XHJcblxyXG4gIGdldCB2YWNhbmN5U2VjdGlvblN1YnRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5zZWxlY3RlZER1dHk/LmNhbmRpZGF0ZXNDb3VudCA/PyAwO1xyXG4gICAgY29uc3QgY2FuZFRleHQgPSBjYW5kaWRhdGVzID09PSAxID8gJ2NhbmRpZGF0dXJhJyA6ICdjYW5kaWRhdHVyYXMnO1xyXG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRQZXJpb2QpIHtcclxuICAgICAgY2FzZSBEYXNoYm9hcmRQZXJpb2QuV2VlazpcclxuICAgICAgICByZXR1cm4gYCR7Y2FuZGlkYXRlc30gJHtjYW5kVGV4dH0gbm9zIMO6bHRpbW9zIDcgZGlhc2A7XHJcbiAgICAgIGNhc2UgRGFzaGJvYXJkUGVyaW9kLk1vbnRoOlxyXG4gICAgICAgIHJldHVybiBgJHtjYW5kaWRhdGVzfSAke2NhbmRUZXh0fSBuZXN0ZSBtw6pzYDtcclxuICAgICAgY2FzZSBEYXNoYm9hcmRQZXJpb2QuVG9kYXk6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGAke2NhbmRpZGF0ZXN9ICR7Y2FuZFRleHR9IGhvamVgO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkRHV0eVRpbWVsaW5lUG9pbnRzKCk6IFRpbWVsaW5lUG9pbnRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZER1dHk/LnRpbWVsaW5lUG9pbnRzID8/IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkRHV0eURvbnV0SXRlbXMoKTogRG9udXRDaGFydEl0ZW1bXSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZER1dHk/LmNvbnZlcnNpb25Eb251dCAmJiB0aGlzLnNlbGVjdGVkRHV0eS5jb252ZXJzaW9uRG9udXQubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZER1dHkuY29udmVyc2lvbkRvbnV0O1xyXG4gICAgfVxyXG4gICAgY29uc3Qgdmlld3MgPSB0aGlzLnNlbGVjdGVkRHV0eT8udmlld3NDb3VudCA/PyAwO1xyXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IHRoaXMuc2VsZWN0ZWREdXR5Py5jYW5kaWRhdGVzQ291bnQgPz8gMDtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6ICdWaXN1YWxpemHDp8O1ZXMnLCB2YWx1ZTogdmlld3MsIGNvbG9yOiAnIzFFMUI0QicgfSxcclxuICAgICAgeyBsYWJlbDogJ0NhbmRpZGF0dXJhcycsIHZhbHVlOiBjYW5kaWRhdGVzLCBjb2xvcjogJyMzQjgyRjYnIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWREdXR5Q29udmVyc2lvblJhdGVUZXh0KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByYXRlID0gdGhpcy5zZWxlY3RlZER1dHk/LmNvbnZlcnNpb25SYXRlID8/IDA7XHJcbiAgICByZXR1cm4gYCR7cmF0ZX0lYDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZER1dHlGdW5uZWxJdGVtcygpOiBGdW5uZWxCYXJJdGVtW10ge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREdXR5Py5mdW5uZWxJdGVtcyAmJiB0aGlzLnNlbGVjdGVkRHV0eS5mdW5uZWxJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRHV0eS5mdW5uZWxJdGVtcztcclxuICAgIH1cclxuICAgIGNvbnN0IHZpZXdzID0gdGhpcy5zZWxlY3RlZER1dHk/LnZpZXdzQ291bnQgPz8gMDtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLnNlbGVjdGVkRHV0eT8uY2FuZGlkYXRlc0NvdW50ID8/IDA7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGxhYmVsOiAnVmlzdWFsaXphw6fDtWVzJywgY291bnQ6IHZpZXdzLCBiYXJDb2xvcjogJyMxRTFCNEInIH0sXHJcbiAgICAgIHsgbGFiZWw6ICdDYW5kaWRhdHVyYXMnLCBjb3VudDogY2FuZGlkYXRlcywgYmFyQ29sb3I6ICcjM0I4MkY2JyB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgb25UaW1lbGluZVBvaW50U2VsZWN0ZWQocG9pbnQ6IFRpbWVsaW5lUG9pbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaXRlbVNlbGVjdGVkLmVtaXQoe1xyXG4gICAgICBjaGFydDogJ0xpbmhhIFRlbXBvcmFsIHBvciBWYWdhJyxcclxuICAgICAgaXRlbTogcG9pbnRcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gVmFjYW5jeVNhbGFyeUNvbXBhcmlzb25TZWN0aW9uXHJcbiAgZ2V0IHNlbGVjdGVkRHV0eVNhbGFyeUNvbXBhcmlzb24oKTogRGFzaGJvYXJkRHV0eVNhbGFyeUNvbXBhcmlzb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREdXR5Py5zYWxhcnlDb21wYXJpc29uO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNhbGFyeVN0YXR1cygpOiBEdXR5U2FsYXJ5U3RhdHVzIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzID0gdGhpcy5zZWxlY3RlZER1dHlTYWxhcnlDb21wYXJpc29uPy5zdGF0dXM7XHJcbiAgICBpZiAocyA9PT0gRHV0eVNhbGFyeVN0YXR1cy5CZWxvd01hcmtldCB8fCAocyBhcyBhbnkpID09PSAwKSByZXR1cm4gRHV0eVNhbGFyeVN0YXR1cy5CZWxvd01hcmtldDtcclxuICAgIGlmIChzID09PSBEdXR5U2FsYXJ5U3RhdHVzLkF0TWFya2V0IHx8IChzIGFzIGFueSkgPT09IDEpIHJldHVybiBEdXR5U2FsYXJ5U3RhdHVzLkF0TWFya2V0O1xyXG4gICAgaWYgKHMgPT09IER1dHlTYWxhcnlTdGF0dXMuQWJvdmVNYXJrZXQgfHwgKHMgYXMgYW55KSA9PT0gMikgcmV0dXJuIER1dHlTYWxhcnlTdGF0dXMuQWJvdmVNYXJrZXQ7XHJcbiAgICBpZiAocyA9PT0gRHV0eVNhbGFyeVN0YXR1cy5Ob3RJbmZvcm1lZCB8fCAocyBhcyBhbnkpID09PSAzKSByZXR1cm4gRHV0eVNhbGFyeVN0YXR1cy5Ob3RJbmZvcm1lZDtcclxuICAgIGlmIChzID09PSBEdXR5U2FsYXJ5U3RhdHVzLkluc3VmZmljaWVudERhdGEgfHwgKHMgYXMgYW55KSA9PT0gNCkgcmV0dXJuIER1dHlTYWxhcnlTdGF0dXMuSW5zdWZmaWNpZW50RGF0YTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0Q3VycmVuY3kodmFsdWU/OiBudW1iZXIgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ3B0LUJSJywge1xyXG4gICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcclxuICAgICAgY3VycmVuY3k6ICdCUkwnLFxyXG4gICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDBcclxuICAgIH0pLmZvcm1hdCh2YWx1ZSkucmVwbGFjZSgvXFx1MDBBMC9nLCAnICcpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvcm1hdHRlZFlvdXJTYWxhcnkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNvbXBhcmlzb24gPSB0aGlzLnNlbGVjdGVkRHV0eVNhbGFyeUNvbXBhcmlzb247XHJcbiAgICBpZiAoIWNvbXBhcmlzb24gfHwgdGhpcy5zYWxhcnlTdGF0dXMgPT09IER1dHlTYWxhcnlTdGF0dXMuTm90SW5mb3JtZWQgfHwgY29tcGFyaXNvbi55b3VyU2FsYXJ5ID09PSBudWxsIHx8IGNvbXBhcmlzb24ueW91clNhbGFyeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiAnTsOjbyBpbmZvcm1hZG8nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0Q3VycmVuY3koY29tcGFyaXNvbi55b3VyU2FsYXJ5KTtcclxuICB9XHJcblxyXG4gIGdldCBmb3JtYXR0ZWRSZWdpb25hbEF2ZXJhZ2UoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNvbXBhcmlzb24gPSB0aGlzLnNlbGVjdGVkRHV0eVNhbGFyeUNvbXBhcmlzb247XHJcbiAgICBpZiAoIWNvbXBhcmlzb24gfHwgdGhpcy5zYWxhcnlTdGF0dXMgPT09IER1dHlTYWxhcnlTdGF0dXMuSW5zdWZmaWNpZW50RGF0YSB8fCBjb21wYXJpc29uLnJlZ2lvbmFsQXZlcmFnZVNhbGFyeSA9PT0gbnVsbCB8fCBjb21wYXJpc29uLnJlZ2lvbmFsQXZlcmFnZVNhbGFyeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiAnRGFkb3MgaW5zdWZpY2llbnRlcyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRDdXJyZW5jeShjb21wYXJpc29uLnJlZ2lvbmFsQXZlcmFnZVNhbGFyeSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2FsYXJ5QmFkZ2VDbGFzcygpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLnNhbGFyeVN0YXR1cykge1xyXG4gICAgICBjYXNlIER1dHlTYWxhcnlTdGF0dXMuQmVsb3dNYXJrZXQ6XHJcbiAgICAgICAgcmV0dXJuICdzYWxhcnktYmFkZ2UtLW9yYW5nZSc7XHJcbiAgICAgIGNhc2UgRHV0eVNhbGFyeVN0YXR1cy5BdE1hcmtldDpcclxuICAgICAgICByZXR1cm4gJ3NhbGFyeS1iYWRnZS0tYmx1ZSc7XHJcbiAgICAgIGNhc2UgRHV0eVNhbGFyeVN0YXR1cy5BYm92ZU1hcmtldDpcclxuICAgICAgICByZXR1cm4gJ3NhbGFyeS1iYWRnZS0tcHVycGxlJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2FsYXJ5VGl0bGVDb2xvckNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuc2FsYXJ5U3RhdHVzKSB7XHJcbiAgICAgIGNhc2UgRHV0eVNhbGFyeVN0YXR1cy5CZWxvd01hcmtldDpcclxuICAgICAgICByZXR1cm4gJ3NhbGFyeS10aXRsZS0tb3JhbmdlJztcclxuICAgICAgY2FzZSBEdXR5U2FsYXJ5U3RhdHVzLkF0TWFya2V0OlxyXG4gICAgICAgIHJldHVybiAnc2FsYXJ5LXRpdGxlLS1ibHVlJztcclxuICAgICAgY2FzZSBEdXR5U2FsYXJ5U3RhdHVzLkFib3ZlTWFya2V0OlxyXG4gICAgICAgIHJldHVybiAnc2FsYXJ5LXRpdGxlLS1wdXJwbGUnO1xyXG4gICAgICBjYXNlIER1dHlTYWxhcnlTdGF0dXMuTm90SW5mb3JtZWQ6XHJcbiAgICAgICAgcmV0dXJuICdzYWxhcnktdGl0bGUtLXJlZCc7XHJcbiAgICAgIGNhc2UgRHV0eVNhbGFyeVN0YXR1cy5JbnN1ZmZpY2llbnREYXRhOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnc2FsYXJ5LXRpdGxlLS1kZWZhdWx0JztcclxuICAgIH1cclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIEtwaUdldHRlcnNcclxuICAvLyAxLiBWYWdhcyBQdWJsaWNhZGFzXHJcbiAgZ2V0IHJlZ2lzdGVyZWRWYWNhbmNpZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmtwaXM/LnJlZ2lzdGVyZWRWYWNhbmNpZXMgPz8gMDtcclxuICB9XHJcblxyXG4gIGdldCByZWdpc3RlcmVkVmFjYW5jaWVzRGlmZigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8ua3Bpcz8ucmVnaXN0ZXJlZFZhY2FuY2llc0RpZmZlcmVuY2UgPz8gMDtcclxuICB9XHJcblxyXG4gIGdldCByZWdpc3RlcmVkVmFjYW5jaWVzQmFkZ2UoKTogS3BpQmFkZ2VJbmZvIHtcclxuICAgIHJldHVybiBmb3JtYXRLcGlCYWRnZSh0aGlzLnJlZ2lzdGVyZWRWYWNhbmNpZXNEaWZmLCAnbmV1dHJhbCcpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZ2lzdGVyZWRWYWNhbmNpZXNDaGFuZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyZWRWYWNhbmNpZXNCYWRnZS5jaGFuZ2VUZXh0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlZ2lzdGVyZWRWYWNhbmNpZXNCYWRnZUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlcmVkVmFjYW5jaWVzQmFkZ2UuYmFkZ2VDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIDIuIENhbmRpZGF0b3MgSW5zY3JpdG9zXHJcbiAgZ2V0IGNhbmRpZGF0ZUFwcGxpY2F0aW9ucygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8ua3Bpcz8uY2FuZGlkYXRlQXBwbGljYXRpb25zID8/IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuZGlkYXRlQXBwbGljYXRpb25zRGlmZigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8ua3Bpcz8uY2FuZGlkYXRlQXBwbGljYXRpb25zRGlmZmVyZW5jZSA/PyAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhbmRpZGF0ZUFwcGxpY2F0aW9uc0JhZGdlKCk6IEtwaUJhZGdlSW5mbyB7XHJcbiAgICByZXR1cm4gZm9ybWF0S3BpQmFkZ2UodGhpcy5jYW5kaWRhdGVBcHBsaWNhdGlvbnNEaWZmLCAnaGlnaGVySXNCZXR0ZXInKTtcclxuICB9XHJcblxyXG4gIGdldCBjYW5kaWRhdGVBcHBsaWNhdGlvbnNDaGFuZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNhbmRpZGF0ZUFwcGxpY2F0aW9uc0JhZGdlLmNoYW5nZVRleHQ7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuZGlkYXRlQXBwbGljYXRpb25zQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FuZGlkYXRlQXBwbGljYXRpb25zQmFkZ2UuYmFkZ2VDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIDMuIEN1cnLDrWN1bG9zIHBhcmEgQXZhbGlhclxyXG4gIGdldCBwZW5kaW5nUmV2aWV3cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8ua3Bpcz8ucGVuZGluZ1Jldmlld3MgPz8gMDtcclxuICB9XHJcblxyXG4gIGdldCBwZW5kaW5nUmV2aWV3c0RpZmYoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmtwaXM/LnBlbmRpbmdSZXZpZXdzRGlmZmVyZW5jZSA/PyAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlbmRpbmdSZXZpZXdzQmFkZ2UoKTogS3BpQmFkZ2VJbmZvIHtcclxuICAgIHJldHVybiBmb3JtYXRLcGlCYWRnZSh0aGlzLnBlbmRpbmdSZXZpZXdzRGlmZiwgJ2xvd2VySXNCZXR0ZXInKTtcclxuICB9XHJcblxyXG4gIGdldCBwZW5kaW5nUmV2aWV3c0NoYW5nZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1Jldmlld3NCYWRnZS5jaGFuZ2VUZXh0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlbmRpbmdSZXZpZXdzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1Jldmlld3NCYWRnZS5iYWRnZUNsYXNzO1xyXG4gIH1cclxuXHJcbiAgLy8gNC4gTcOpZGlhIGRlIENhbmRpZGF0b3NcclxuICBnZXQgYXZlcmFnZUNhbmRpZGF0ZXNQZXJWYWNhbmN5KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhdmcgPSB0aGlzLmRhdGE/LmtwaXM/LmF2ZXJhZ2VDYW5kaWRhdGVzUGVyVmFjYW5jeTtcclxuICAgIGlmIChhdmcgPT09IHVuZGVmaW5lZCB8fCBhdmcgPT09IG51bGwpIHJldHVybiAnMCwwJztcclxuICAgIHJldHVybiBhdmcudG9GaXhlZCgxKS5yZXBsYWNlKCcuJywgJywnKTtcclxuICB9XHJcblxyXG4gIGdldCBhdmVyYWdlQ2FuZGlkYXRlc0RpZmYoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmtwaXM/LmF2ZXJhZ2VDYW5kaWRhdGVzRGlmZmVyZW5jZSA/PyAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF2ZXJhZ2VDYW5kaWRhdGVzQmFkZ2UoKTogS3BpQmFkZ2VJbmZvIHtcclxuICAgIHJldHVybiBmb3JtYXRLcGlCYWRnZSh0aGlzLmF2ZXJhZ2VDYW5kaWRhdGVzRGlmZiwgJ2hpZ2hlcklzQmV0dGVyJywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXZlcmFnZUNhbmRpZGF0ZXNDaGFuZ2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmF2ZXJhZ2VDYW5kaWRhdGVzQmFkZ2UuY2hhbmdlVGV4dDtcclxuICB9XHJcblxyXG4gIGdldCBhdmVyYWdlQ2FuZGlkYXRlc0JhZGdlQ2xhc3MoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmF2ZXJhZ2VDYW5kaWRhdGVzQmFkZ2UuYmFkZ2VDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIDUuIFN0YXR1cyBkYXMgVmFnYXNcclxuICBnZXQgb3BlblZhY2FuY2llcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8ua3Bpcz8ub3BlblZhY2FuY2llcyA/PyAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNsb3NlZFZhY2FuY2llcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8ua3Bpcz8uY2xvc2VkVmFjYW5jaWVzID8/IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxEdXRpZXNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8ua3Bpcz8udG90YWxWYWNhbmNpZXMgPz8gKHRoaXMub3BlblZhY2FuY2llcyArIHRoaXMuY2xvc2VkVmFjYW5jaWVzKTtcclxuICB9XHJcblxyXG4gIGdldCBkdXRpZXNTdGF0dXNJdGVtcygpOiBTdGFja2VkQmFySXRlbVtdIHtcclxuICAgIGlmICh0aGlzLmRhdGE/LmR1dGllc1N0YXR1cyAmJiB0aGlzLmRhdGEuZHV0aWVzU3RhdHVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kdXRpZXNTdGF0dXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGxhYmVsOiAnQWJlcnRhcycsIHZhbHVlOiB0aGlzLm9wZW5WYWNhbmNpZXMsIGNvbG9yOiAnIzNCODJGNicgfSxcclxuICAgICAgeyBsYWJlbDogJ0VuY2VycmFkYXMnLCB2YWx1ZTogdGhpcy5jbG9zZWRWYWNhbmNpZXMsIGNvbG9yOiAnIzFFMUI0QicgfVxyXG4gICAgXTtcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIENvbXBhcmlzb25TZWN0aW9uXHJcbiAgZ2V0IGNvbXBhcmlzb25JdGVtcygpOiBDb21wYXJpc29uSXRlbVtdIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmNvbXBhcmlzb24gPz8gW107XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzQ29tcGFyaXNvbkR1dGllcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBhcmlzb25JdGVtcy5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsQ29tcGFyaXNvbkNhbmRpZGF0ZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBhcmlzb25JdGVtcy5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgKGN1cnIudmFsdWUgfHwgMCksIDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsQ29tcGFyaXNvblZhY2FuY2llcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyaXNvbkl0ZW1zLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGdldCBjb21wYXJpc29uU3VidGl0bGUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNhbmRDb3VudCA9IHRoaXMudG90YWxDb21wYXJpc29uQ2FuZGlkYXRlcztcclxuICAgIGNvbnN0IGR1dHlDb3VudCA9IHRoaXMudG90YWxDb21wYXJpc29uVmFjYW5jaWVzO1xyXG4gICAgY29uc3QgY2FuZFRleHQgPSBjYW5kQ291bnQgPT09IDEgPyAnMSBjYW5kaWRhdHVyYSBubyB0b3RhbCcgOiBgJHtjYW5kQ291bnR9IGNhbmRpZGF0dXJhcyBubyB0b3RhbGA7XHJcbiAgICBjb25zdCBkdXR5VGV4dCA9IGR1dHlDb3VudCA9PT0gMSA/ICcxIHZhZ2EgYXRpdmEnIDogYCR7ZHV0eUNvdW50fSB2YWdhcyBhdGl2YXNgO1xyXG4gICAgcmV0dXJuIGAke2NhbmRUZXh0fSwgZW0gJHtkdXR5VGV4dH1gO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gU3RhdGVIZWxwZXJzXHJcbiAgZ2V0IGhhc0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgJiYgISF0aGlzLmRhdGEua3BpcztcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIFVzZXJBY3Rpb25zXHJcbiAgc2V0UGVyaW9kKHBlcmlvZDogRGFzaGJvYXJkUGVyaW9kKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50UGVyaW9kID09PSBwZXJpb2QpIHJldHVybjtcclxuICAgIHRoaXMuY3VycmVudFBlcmlvZCA9IHBlcmlvZDtcclxuICAgIHRoaXMucGVyaW9kQ2hhbmdlLmVtaXQocGVyaW9kKTtcclxuICB9XHJcblxyXG4gIG9uQ2hhcnRJdGVtU2VsZWN0ZWQoaXRlbTogYW55LCBjaGFydE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWQuZW1pdCh7XHJcbiAgICAgIGNoYXJ0OiBjaGFydE5hbWUsXHJcbiAgICAgIGl0ZW1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNhcmVvbi1kYXNoYm9hcmQtY29udGFpbmVyXCI+XHJcbiAgPCEtLSAjcmVnaW9uIERhc2hib2FyZEhlYWRlciAtLT5cclxuICA8aGVhZGVyIGNsYXNzPVwiZGFzaGJvYXJkLWhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlci10aXRsZXNcIj5cclxuICAgICAgPGgxIGNsYXNzPVwibWFpbi10aXRsZVwiPnt7IHRpdGxlIH19PC9oMT5cclxuICAgICAgPHAgKm5nSWY9XCJzdWJ0aXRsZVwiIGNsYXNzPVwic3VidGl0bGVcIj5cclxuICAgICAgICB7eyBzdWJ0aXRsZSB9fVxyXG4gICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLWZpbHRlci1ncm91cFwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwZXJpb2QtcGlsbFwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjdXJyZW50UGVyaW9kID09PSBEYXNoYm9hcmRQZXJpb2QuVG9kYXlcIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRQZXJpb2QoRGFzaGJvYXJkUGVyaW9kLlRvZGF5KVwiXHJcbiAgICAgID5cclxuICAgICAgICBIb2plXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwZXJpb2QtcGlsbFwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjdXJyZW50UGVyaW9kID09PSBEYXNoYm9hcmRQZXJpb2QuV2Vla1wiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldFBlcmlvZChEYXNoYm9hcmRQZXJpb2QuV2VlaylcIlxyXG4gICAgICA+XHJcbiAgICAgICAgU2VtYW5hXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwZXJpb2QtcGlsbFwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjdXJyZW50UGVyaW9kID09PSBEYXNoYm9hcmRQZXJpb2QuTW9udGhcIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRQZXJpb2QoRGFzaGJvYXJkUGVyaW9kLk1vbnRoKVwiXHJcbiAgICAgID5cclxuICAgICAgICBNw6pzXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9oZWFkZXI+XHJcbiAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICA8IS0tICNyZWdpb24gTG9hZGluZ1NrZWxldG9uU3RhdGUgLS0+XHJcbiAgPGNhcmVvbi1kYXNoYm9hcmQtc2tlbGV0b24gKm5nSWY9XCJsb2FkaW5nXCI+PC9jYXJlb24tZGFzaGJvYXJkLXNrZWxldG9uPlxyXG4gIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgPCEtLSAjcmVnaW9uIEVtcHR5U3RhdGUgLS0+XHJcbiAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmICFoYXNEYXRhXCIgY2xhc3M9XCJkYXNoYm9hcmQtZW1wdHktc3RhdGVcIj5cclxuICAgIDxwIGNsYXNzPVwiZW1wdHktdGl0bGVcIj5TZW0gcmVnaXN0cm9zPC9wPlxyXG4gICAgPHAgY2xhc3M9XCJlbXB0eS1kZXNjcmlwdGlvblwiPnt7IGVtcHR5TWVzc2FnZSB9fTwvcD5cclxuICA8L2Rpdj5cclxuICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gIDwhLS0gI3JlZ2lvbiBEYXNoYm9hcmRDb250ZW50IC0tPlxyXG4gIDxtYWluICpuZ0lmPVwiIWxvYWRpbmcgJiYgaGFzRGF0YVwiIGNsYXNzPVwiZGFzaGJvYXJkLWNvbnRlbnRcIj5cclxuICAgIDwhLS0gI3JlZ2lvbiBLcGlDYXJkc1JvdyAtLT5cclxuICAgIDxzZWN0aW9uIGNsYXNzPVwia3BpLWNhcmRzLWdyaWRcIj5cclxuICAgICAgPCEtLSBLUEkgMTogVmFnYXMgUHVibGljYWRhcyAtLT5cclxuICAgICAgPGFydGljbGUgY2xhc3M9XCJrcGktY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrcGktY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwia3BpLWxhYmVsXCI+VmFnYXMgUHVibGljYWRhczwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwia3BpLWNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJrcGktdmFsdWVcIj57eyByZWdpc3RlcmVkVmFjYW5jaWVzIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJrcGktYmFkZ2VcIiBbbmdDbGFzc109XCJyZWdpc3RlcmVkVmFjYW5jaWVzQmFkZ2UuYmFkZ2VDbGFzc1wiPlxyXG4gICAgICAgICAgICA8Y2FyZW9uLWRhc2hib2FyZC1pY29uICpuZ0lmPVwicmVnaXN0ZXJlZFZhY2FuY2llc0JhZGdlLmlzUG9zaXRpdmVcIiBuYW1lPVwiYXJyb3ctdXBcIiBjbGFzcz1cImtwaS1iYWRnZS1pY29uXCI+PC9jYXJlb24tZGFzaGJvYXJkLWljb24+XHJcbiAgICAgICAgICAgIDxjYXJlb24tZGFzaGJvYXJkLWljb24gKm5nSWY9XCJyZWdpc3RlcmVkVmFjYW5jaWVzQmFkZ2UuaXNOZWdhdGl2ZVwiIG5hbWU9XCJhcnJvdy1kb3duXCIgY2xhc3M9XCJrcGktYmFkZ2UtaWNvblwiPjwvY2FyZW9uLWRhc2hib2FyZC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyByZWdpc3RlcmVkVmFjYW5jaWVzQmFkZ2UuY2hhbmdlVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImtwaS1mb290ZXJcIj5cclxuICAgICAgICAgIG5vIHRvdGFsXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2FydGljbGU+XHJcblxyXG4gICAgICA8IS0tIEtQSSAyOiBDYW5kaWRhdG9zIEluc2NyaXRvcyAtLT5cclxuICAgICAgPGFydGljbGUgY2xhc3M9XCJrcGktY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrcGktY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwia3BpLWxhYmVsXCI+Q2FuZGlkYXRvcyBJbnNjcml0b3M8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImtwaS1jYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwia3BpLXZhbHVlXCI+e3sgY2FuZGlkYXRlQXBwbGljYXRpb25zIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJrcGktYmFkZ2VcIiBbbmdDbGFzc109XCJjYW5kaWRhdGVBcHBsaWNhdGlvbnNCYWRnZS5iYWRnZUNsYXNzXCI+XHJcbiAgICAgICAgICAgIDxjYXJlb24tZGFzaGJvYXJkLWljb24gKm5nSWY9XCJjYW5kaWRhdGVBcHBsaWNhdGlvbnNCYWRnZS5pc1Bvc2l0aXZlXCIgbmFtZT1cImFycm93LXVwXCIgY2xhc3M9XCJrcGktYmFkZ2UtaWNvblwiPjwvY2FyZW9uLWRhc2hib2FyZC1pY29uPlxyXG4gICAgICAgICAgICA8Y2FyZW9uLWRhc2hib2FyZC1pY29uICpuZ0lmPVwiY2FuZGlkYXRlQXBwbGljYXRpb25zQmFkZ2UuaXNOZWdhdGl2ZVwiIG5hbWU9XCJhcnJvdy1kb3duXCIgY2xhc3M9XCJrcGktYmFkZ2UtaWNvblwiPjwvY2FyZW9uLWRhc2hib2FyZC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBjYW5kaWRhdGVBcHBsaWNhdGlvbnNCYWRnZS5jaGFuZ2VUZXh0IH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwia3BpLWZvb3RlclwiPlxyXG4gICAgICAgICAge3sgY3VycmVudFBlcmlvZCA9PT0gJ1RvZGF5JyA/ICdob2plJyA6IGN1cnJlbnRQZXJpb2QgPT09ICdXZWVrJyA/ICdlc3NhIHNlbWFuYScgOiAnZXNzZSBtw6pzJyB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9hcnRpY2xlPlxyXG5cclxuICAgICAgPCEtLSBLUEkgMzogQ3VycsOtY3Vsb3MgcGFyYSBBdmFsaWFyIC0tPlxyXG4gICAgICA8YXJ0aWNsZSBjbGFzcz1cImtwaS1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImtwaS1jYXJkLWhlYWRlclwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJrcGktbGFiZWxcIj5DdXJyw61jdWxvcyBwYXJhIEF2YWxpYXI8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImtwaS1jYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwia3BpLXZhbHVlXCI+e3sgcGVuZGluZ1Jldmlld3MgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImtwaS1iYWRnZVwiIFtuZ0NsYXNzXT1cInBlbmRpbmdSZXZpZXdzQmFkZ2UuYmFkZ2VDbGFzc1wiPlxyXG4gICAgICAgICAgICA8Y2FyZW9uLWRhc2hib2FyZC1pY29uICpuZ0lmPVwicGVuZGluZ1Jldmlld3NCYWRnZS5pc1Bvc2l0aXZlXCIgbmFtZT1cImFycm93LXVwXCIgY2xhc3M9XCJrcGktYmFkZ2UtaWNvblwiPjwvY2FyZW9uLWRhc2hib2FyZC1pY29uPlxyXG4gICAgICAgICAgICA8Y2FyZW9uLWRhc2hib2FyZC1pY29uICpuZ0lmPVwicGVuZGluZ1Jldmlld3NCYWRnZS5pc05lZ2F0aXZlXCIgbmFtZT1cImFycm93LWRvd25cIiBjbGFzcz1cImtwaS1iYWRnZS1pY29uXCI+PC9jYXJlb24tZGFzaGJvYXJkLWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IHBlbmRpbmdSZXZpZXdzQmFkZ2UuY2hhbmdlVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImtwaS1mb290ZXJcIj5hZ3VhcmRhbmRvIGFnb3JhPC9zcGFuPlxyXG4gICAgICA8L2FydGljbGU+XHJcblxyXG4gICAgICA8IS0tIEtQSSA0OiBNw6lkaWEgZGUgQ2FuZGlkYXRvcyAtLT5cclxuICAgICAgPGFydGljbGUgY2xhc3M9XCJrcGktY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJrcGktY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwia3BpLWxhYmVsXCI+TcOpZGlhIGRlIENhbmRpZGF0b3M8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImtwaS1jYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwia3BpLXZhbHVlXCI+e3sgYXZlcmFnZUNhbmRpZGF0ZXNQZXJWYWNhbmN5IH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJrcGktYmFkZ2VcIiBbbmdDbGFzc109XCJhdmVyYWdlQ2FuZGlkYXRlc0JhZGdlLmJhZGdlQ2xhc3NcIj5cclxuICAgICAgICAgICAgPGNhcmVvbi1kYXNoYm9hcmQtaWNvbiAqbmdJZj1cImF2ZXJhZ2VDYW5kaWRhdGVzQmFkZ2UuaXNQb3NpdGl2ZVwiIG5hbWU9XCJhcnJvdy11cFwiIGNsYXNzPVwia3BpLWJhZGdlLWljb25cIj48L2NhcmVvbi1kYXNoYm9hcmQtaWNvbj5cclxuICAgICAgICAgICAgPGNhcmVvbi1kYXNoYm9hcmQtaWNvbiAqbmdJZj1cImF2ZXJhZ2VDYW5kaWRhdGVzQmFkZ2UuaXNOZWdhdGl2ZVwiIG5hbWU9XCJhcnJvdy1kb3duXCIgY2xhc3M9XCJrcGktYmFkZ2UtaWNvblwiPjwvY2FyZW9uLWRhc2hib2FyZC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBhdmVyYWdlQ2FuZGlkYXRlc0JhZGdlLmNoYW5nZVRleHQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJrcGktZm9vdGVyXCI+cG9yIHZhZ2E8L3NwYW4+XHJcbiAgICAgIDwvYXJ0aWNsZT5cclxuXHJcbiAgICAgIDwhLS0gS1BJIDU6IFN0YXR1cyBkYXMgVmFnYXMgLS0+XHJcbiAgICAgIDxhcnRpY2xlIGNsYXNzPVwia3BpLWNhcmQga3BpLWNhcmQtLXN0YXR1c1wiPlxyXG4gICAgICAgIDxjYXJlb24tc3RhY2tlZC1ob3Jpem9udGFsLWJhclxyXG4gICAgICAgICAgW3RpdGxlXT1cIidTdGF0dXMgZGFzIFZhZ2FzJ1wiXHJcbiAgICAgICAgICBbdG90YWxMYWJlbF09XCIndmFnYXMnXCJcclxuICAgICAgICAgIFtzaG93SGVhZGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgW3Nob3dMZWdlbmRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbZGF0YV09XCJkdXRpZXNTdGF0dXNJdGVtc1wiXHJcbiAgICAgICAgICBbZW1wdHlUZXh0XT1cIidTZW0gdmFnYXMgcmVnaXN0cmFkYXMnXCJcclxuICAgICAgICAgIChpdGVtU2VsZWN0ZWQpPVwib25DaGFydEl0ZW1TZWxlY3RlZCgkZXZlbnQsICdTdGF0dXMgZGFzIFZhZ2FzJylcIlxyXG4gICAgICAgID48L2NhcmVvbi1zdGFja2VkLWhvcml6b250YWwtYmFyPlxyXG4gICAgICA8L2FydGljbGU+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgPCEtLSAjcmVnaW9uIEF0dGVudGlvblNlY3Rpb24gLS0+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImF0dGVudGlvbi1zZWN0aW9uXCI+XHJcbiAgICAgIDwhLS0gI3JlZ2lvbiBBdHRlbnRpb25DYXJkIC0tPlxyXG4gICAgICA8YXJ0aWNsZSBjbGFzcz1cImF0dGVudGlvbi1jYXJkXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwiYXR0ZW50aW9uLWNhcmQtdGl0bGVcIj5QcmVjaXNhIGRhIHN1YSBhdGVuw6fDo288L2gyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXR0ZW50aW9uSXRlbXMubGVuZ3RoID4gMDsgZWxzZSBub0F0dGVudGlvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVudGlvbi1pdGVtcy1saXN0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYXR0ZW50aW9uSXRlbXM7IGxldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiYXR0ZW50aW9uLWl0ZW0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbnRpb24taXRlbVwiIChjbGljayk9XCJvbkF0dGVudGlvbkl0ZW1DbGljayhpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRlbnRpb24taXRlbS10aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0dGVudGlvbi1pdGVtLXN1YnRpdGxlXCI+e3sgaXRlbS5zdWJ0aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxhc3RcIiBjbGFzcz1cImF0dGVudGlvbi1kaXZpZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4tY29uc3VsdGFudFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29uc3VsdGFudFdoYXRzQXBwKCdQcmVjaXNhIGRhIHN1YSBhdGVuw6fDo28nKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIEZhbGUgY29tIHVtIGNvbnN1bHRvclxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9BdHRlbnRpb24+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQdWJsaXNoWmVyb1N0YXRlOyBlbHNlIGJhc2ljQXR0ZW50aW9uWmVyb1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW50aW9uLXplcm8tYm94XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVudGlvbi16ZXJvLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGNhcmVvbi1kYXNoYm9hcmQtaWNvbiBuYW1lPVwiaW5mb1wiIGNsYXNzPVwiemVyby1pbmZvLWljb25cIj48L2NhcmVvbi1kYXNoYm9hcmQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbnRpb24temVyby10ZXh0c1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJhdHRlbnRpb24temVyby10aXRsZVwiPk5lbmh1bWEgdmFnYSBwcmVjaXNhIGRlIGF0ZW7Dp8OjbzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXR0ZW50aW9uLXplcm8tc3VidGl0bGVcIj5Wb2PDqiBuw6NvIHRlbSB2YWdhcyBlbSBhYmVydG8gcGFyYSByZXZpc2FyLjwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4temVyby1wdWJsaXNoIGJ0bi16ZXJvLXB1Ymxpc2gtLWZ1bGxcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHVibGlzaER1dHkoJ1ByZWNpc2EgZGEgc3VhIGF0ZW7Dp8OjbycpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICBQdWJsaWNhciBWYWdhXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNiYXNpY0F0dGVudGlvblplcm8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXNpYy1lbXB0eS1zdGF0ZSBiYXNpYy1lbXB0eS1zdGF0ZS0tYXR0ZW50aW9uXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhc2ljLWVtcHR5LWljb24td3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgPGNhcmVvbi1kYXNoYm9hcmQtaWNvbiBuYW1lPVwiaW5mb1wiIGNsYXNzPVwiYmFzaWMtZW1wdHktaWNvblwiPjwvY2FyZW9uLWRhc2hib2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImJhc2ljLWVtcHR5LXRpdGxlXCI+VHVkbyBlbSBkaWEhPC9oMz5cclxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImJhc2ljLWVtcHR5LXRleHRcIj5OZW5odW1hIHZhZ2EgcHJlY2lzYSBkYSBzdWEgYXRlbsOnw6NvIG5vIG1vbWVudG8uPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNvbnN1bHRhbnRcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29uc3VsdGFudFdoYXRzQXBwKCdQcmVjaXNhIGRhIHN1YSBhdGVuw6fDo28gLSBTZW0gdmFnYXMnKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICBGYWxlIGNvbSB1bSBjb25zdWx0b3JcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvYXJ0aWNsZT5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgPCEtLSAjcmVnaW9uIFBlcmZvcm1hbmNlQ2FyZCAtLT5cclxuICAgICAgPGFydGljbGUgY2xhc3M9XCJwZXJmb3JtYW5jZS1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBlcmZvcm1hbmNlLWNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDIgY2xhc3M9XCJwZXJmb3JtYW5jZS1jYXJkLXRpdGxlXCI+QW7DoWxpc2UgZGUgRGVzZW1wZW5obzwvaDI+XHJcblxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInBlcmZvcm1hbmNlLWluZm8td3JhcHBlclwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uSW5mb01vdXNlRW50ZXIoKVwiXHJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uSW5mb01vdXNlTGVhdmUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1pbmZvXCJcclxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSW5mb3JtYcOnw7VlcyBzb2JyZSBhIEFuw6FsaXNlIGRlIERlc2VtcGVuaG9cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVJbmZvVG9vbHRpcCgpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxjYXJlb24tZGFzaGJvYXJkLWljb24gbmFtZT1cImluZm9cIiBjbGFzcz1cImluZm8taWNvblwiPjwvY2FyZW9uLWRhc2hib2FyZC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVG9vbHRpcCAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dJbmZvVG9vbHRpcFwiIGNsYXNzPVwiaW5mby10b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwidG9vbHRpcC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICBFc3RhIGFuw6FsaXNlIG1lZGUgbyBpbnRlcmVzc2UgZG9zIGNhbmRpZGF0b3MgcGVsYSBzdWEgZW1wcmVzYSBlIMOpIGF0dWFsaXphZGEgY29udGludWFtZW50ZSDDoCBtZWRpZGEgcXVlIG1haXMgcHJvZmlzc2lvbmFpcyBkZW1vbnN0cmFtIGRlc2VqbyBkZSBmYXplciBwYXJ0ZSBkbyBzZXUgdGltZS5cclxuICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gR3LDoWZpY28gZGUgT25kYXMgLS0+XHJcbiAgICAgICAgPGNhcmVvbi1wZXJmb3JtYW5jZS13YXZlIFtsZXZlbF09XCJwZXJmb3JtYW5jZUxldmVsXCI+PC9jYXJlb24tcGVyZm9ybWFuY2Utd2F2ZT5cclxuXHJcbiAgICAgICAgPCEtLSBDb250ZcO6ZG8gVGV4dHVhbCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGVyZm9ybWFuY2UtYm9keVwiPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwicGVyZm9ybWFuY2UtaGlnaGxpZ2h0LXRpdGxlXCI+e3sgcGVyZm9ybWFuY2VUaXRsZSB9fTwvaDM+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInBlcmZvcm1hbmNlLWRlc2NyaXB0aW9uXCI+e3sgcGVyZm9ybWFuY2VEZXNjcmlwdGlvbiB9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBCb3TDo28gV2hhdHNBcHAgLS0+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0bi1jb25zdWx0YW50XCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuQ29uc3VsdGFudFdoYXRzQXBwKCdBbsOhbGlzZSBkZSBEZXNlbXBlbmhvJylcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIEZhbGUgY29tIHVtIGNvbnN1bHRvclxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2FydGljbGU+XHJcbiAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuICAgIDwvc2VjdGlvbj5cclxuICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICA8IS0tICNyZWdpb24gVmFjYW5jeUFuYWx5c2lzU2VjdGlvbiAtLT5cclxuICAgIDxzZWN0aW9uIGNsYXNzPVwidmFjYW5jeS1hbmFseXNpcy1zZWN0aW9uIHZhY2FuY3ktYW5hbHlzaXMtY2FyZFwiPlxyXG4gICAgICA8IS0tICNyZWdpb24gU2VjdGlvbkhlYWRlciAtLT5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cInZhY2FuY3ktc2VjdGlvbi1oZWFkZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidmFjYW5jeS1zZWN0aW9uLXRpdGxlLWdyb3VwXCI+XHJcbiAgICAgICAgICA8aDIgY2xhc3M9XCJ2YWNhbmN5LXNlY3Rpb24tdGl0bGVcIj5BbsOhbGlzZSBwb3IgVmFnYTwvaDI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhY2FuY3ktc2VjdGlvbi1zdWJ0aXRsZVwiICpuZ0lmPVwic2VsZWN0ZWREdXR5XCI+e3sgdmFjYW5jeVNlY3Rpb25TdWJ0aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFjYW5jeS1zZWN0aW9uLXN1YnRpdGxlXCIgKm5nSWY9XCIhc2VsZWN0ZWREdXR5XCI+XHJcbiAgICAgICAgICAgIHt7IGlzUHVibGlzaFplcm9TdGF0ZSA/ICdOZW5odW1hIGNhbmRpZGF0dXJhIHJlZ2lzdHJhZGEnIDogJ05lbmh1bWEgdmFnYSBhdGl2YSBubyBtb21lbnRvJyB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidmFjYW5jeS1kcm9wZG93bi13cmFwcGVyXCIgKm5nSWY9XCJ2YWNhbmNpZXNBbmFseXNpcy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhY2FuY3ktZHJvcGRvd24tbGFiZWxcIj5Fc2NvbGhhIGEgdmFnYTo8L3NwYW4+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhY2FuY3ktZHJvcGRvd24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInZhY2FuY3ktZHJvcGRvd24tYnRuXCJcclxuICAgICAgICAgICAgICBbY2xhc3MudmFjYW5jeS1kcm9wZG93bi1idG4tLW9wZW5dPVwiaXNEdXR5RHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRHV0eURyb3Bkb3duKClcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNEdXR5RHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmFjYW5jeS1kcm9wZG93bi1idG4tdGV4dFwiPnt7IHNlbGVjdGVkRHV0eT8udGl0bGUgfHwgJ1NlbGVjaW9uZSB1bWEgdmFnYScgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGNhcmVvbi1kYXNoYm9hcmQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3JvdGF0ZWRdPVwiaXNEdXR5RHJvcGRvd25PcGVuXCIgY2xhc3M9XCJ2YWNhbmN5LWRyb3Bkb3duLWJ0bi1pY29uXCI+PC9jYXJlb24tZGFzaGJvYXJkLWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCYWNrZHJvcCBwYXJhIGZlY2hhciBkcm9wZG93biBhbyBjbGljYXIgZm9yYSAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRHV0eURyb3Bkb3duT3BlblwiIGNsYXNzPVwidmFjYW5jeS1kcm9wZG93bi1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZUR1dHlEcm9wZG93bigpXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIE1lbnUgZmx1dHVhbnRlIGRvIGRyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNEdXR5RHJvcGRvd25PcGVuXCIgY2xhc3M9XCJ2YWNhbmN5LWRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkdXR5IG9mIHZhY2FuY2llc0FuYWx5c2lzXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidmFjYW5jeS1kcm9wZG93bi1pdGVtXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy52YWNhbmN5LWRyb3Bkb3duLWl0ZW0tLXNlbGVjdGVkXT1cImR1dHkuZHV0eUlkID09PSBzZWxlY3RlZER1dHk/LmR1dHlJZFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RHV0eShkdXR5KVwiXHJcbiAgICAgICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdXR5LXJhZGlvLW91dGVyXCIgW2NsYXNzLmR1dHktcmFkaW8tb3V0ZXItLWNoZWNrZWRdPVwiZHV0eS5kdXR5SWQgPT09IHNlbGVjdGVkRHV0eT8uZHV0eUlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdXR5LXJhZGlvLWlubmVyXCIgKm5nSWY9XCJkdXR5LmR1dHlJZCA9PT0gc2VsZWN0ZWREdXR5Py5kdXR5SWRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdXR5LWl0ZW0tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR1dHktaXRlbS10aXRsZVwiPnt7IGR1dHkudGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHV0eS1pdGVtLXN1YnRpdGxlXCI+e3sgZHV0eS5zdWJ0aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2hlYWRlcj5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkRHV0eTsgZWxzZSBub0FjdGl2ZUR1dGllc1wiPlxyXG4gICAgICAgIDwhLS0gI3JlZ2lvbiBUaW1lbGluZUNoYXJ0IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWNhbmN5LXRpbWVsaW5lLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxjYXJlb24tdGltZWxpbmUtYmFyLWNoYXJ0XHJcbiAgICAgICAgICAgIFtkYXRhXT1cInNlbGVjdGVkRHV0eVRpbWVsaW5lUG9pbnRzXCJcclxuICAgICAgICAgICAgW2F1dG9CYXJXaWR0aF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIFtiYXJXaWR0aF09XCI2OFwiXHJcbiAgICAgICAgICAgIChpdGVtU2VsZWN0ZWQpPVwib25UaW1lbGluZVBvaW50U2VsZWN0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+PC9jYXJlb24tdGltZWxpbmUtYmFyLWNoYXJ0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbiAgICAgICAgPCEtLSAjcmVnaW9uIEJvdHRvbU1ldHJpY3NSb3cgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZhY2FuY3ktYm90dG9tLWdyaWRcIj5cclxuICAgICAgICAgIDwhLS0gQ2FyZCBUYXhhIGRlIENvbnZlcnPDo28gLS0+XHJcbiAgICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cInZhY2FuY3ktbWV0cmljLWNhcmQgdmFjYW5jeS1tZXRyaWMtY2FyZC0tZG9udXRcIj5cclxuICAgICAgICAgICAgPGNhcmVvbi1kb251dC1jaGFydFxyXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInVGF4YSBkZSBjb252ZXJzw6NvJ1wiXHJcbiAgICAgICAgICAgICAgW3RpdGxlQm9sZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbdGl0bGVTaXplXT1cIjE0XCJcclxuICAgICAgICAgICAgICBbdGl0bGVQYWRkaW5nXT1cIjZcIlxyXG4gICAgICAgICAgICAgIFtkYXRhXT1cInNlbGVjdGVkRHV0eURvbnV0SXRlbXNcIlxyXG4gICAgICAgICAgICAgIFtjZW50ZXJUZXh0XT1cInNlbGVjdGVkRHV0eUNvbnZlcnNpb25SYXRlVGV4dFwiXHJcbiAgICAgICAgICAgICAgW3NpemVdPVwiOTZcIlxyXG4gICAgICAgICAgICAgIFtzdHJva2VXaWR0aF09XCIxOFwiXHJcbiAgICAgICAgICAgID48L2NhcmVvbi1kb251dC1jaGFydD5cclxuICAgICAgICAgIDwvYXJ0aWNsZT5cclxuXHJcbiAgICAgICAgICA8IS0tIENhcmQgVmlzdWFsaXphw6fDtWVzIOKGkiBDYW5kaWRhdHVyYXMgLS0+XHJcbiAgICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cInZhY2FuY3ktbWV0cmljLWNhcmQgdmFjYW5jeS1tZXRyaWMtY2FyZC0tZnVubmVsXCI+XHJcbiAgICAgICAgICAgIDxjYXJlb24tZnVubmVsLWJhclxyXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInVmlzdWFsaXphw6fDtWVzIOKGkiBDYW5kaWRhdHVyYXMnXCJcclxuICAgICAgICAgICAgICBbdGl0bGVCb2xkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFt0aXRsZVNpemVdPVwiMTRcIlxyXG4gICAgICAgICAgICAgIFt0aXRsZVBhZGRpbmddPVwiNlwiXHJcbiAgICAgICAgICAgICAgW2RhdGFdPVwic2VsZWN0ZWREdXR5RnVubmVsSXRlbXNcIlxyXG4gICAgICAgICAgICAgIFttaW5CYXJXaWR0aF09XCIyNjBcIlxyXG4gICAgICAgICAgICA+PC9jYXJlb24tZnVubmVsLWJhcj5cclxuICAgICAgICAgIDwvYXJ0aWNsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG4gICAgICAgIDwhLS0gI3JlZ2lvbiBTYWxhcnlBbmRTdXBwb3J0Um93IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWNhbmN5LXNhbGFyeS1zdXBwb3J0LWdyaWRcIiAqbmdJZj1cInNlbGVjdGVkRHV0eVNhbGFyeUNvbXBhcmlzb25cIj5cclxuICAgICAgICAgIDwhLS0gQ2FyZCBNw6lkaWEgU2FsYXJpYWwgLS0+XHJcbiAgICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cInZhY2FuY3ktc2FsYXJ5LWNhcmRcIj5cclxuICAgICAgICAgICAgPGhlYWRlciBjbGFzcz1cInNhbGFyeS1jYXJkLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gQ29sdW5hIDE6IFNldSB2YWxvciAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2FsYXJ5LW1ldHJpYy1jb2xcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2FsYXJ5LW1ldHJpYy1sYWJlbFwiPlNldSB2YWxvcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2FsYXJ5LW1ldHJpYy12YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zYWxhcnktbWV0cmljLXZhbHVlLS1ub3QtaW5mb3JtZWRdPVwic2FsYXJ5U3RhdHVzID09PSBEdXR5U2FsYXJ5U3RhdHVzLk5vdEluZm9ybWVkXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNhbGFyeS1tZXRyaWMtdmFsdWUtLWluc3VmZmljaWVudF09XCJzYWxhcnlTdGF0dXMgPT09IER1dHlTYWxhcnlTdGF0dXMuSW5zdWZmaWNpZW50RGF0YVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdHRlZFlvdXJTYWxhcnkgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBEaXZpc29yIHZlcnRpY2FsIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYWxhcnktbWV0cmljLWRpdmlkZXJcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBDb2x1bmEgMjogTcOpZGlhIGRhIHJlZ2nDo28gLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhbGFyeS1tZXRyaWMtY29sXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNhbGFyeS1tZXRyaWMtbGFiZWxcIj5Nw6lkaWEgZGEgcmVnacOjbzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2FsYXJ5LW1ldHJpYy12YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zYWxhcnktbWV0cmljLXZhbHVlLS1vcmFuZ2VdPVwic2FsYXJ5U3RhdHVzID09PSBEdXR5U2FsYXJ5U3RhdHVzLkJlbG93TWFya2V0XCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNhbGFyeS1tZXRyaWMtdmFsdWUtLWJsdWVdPVwic2FsYXJ5U3RhdHVzID09PSBEdXR5U2FsYXJ5U3RhdHVzLkF0TWFya2V0XCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNhbGFyeS1tZXRyaWMtdmFsdWUtLW5hdnldPVwic2FsYXJ5U3RhdHVzID09PSBEdXR5U2FsYXJ5U3RhdHVzLkFib3ZlTWFya2V0XCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNhbGFyeS1tZXRyaWMtdmFsdWUtLWluc3VmZmljaWVudF09XCJzYWxhcnlTdGF0dXMgPT09IER1dHlTYWxhcnlTdGF0dXMuSW5zdWZmaWNpZW50RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zYWxhcnktbWV0cmljLXZhbHVlLS1tdXRlZF09XCJzYWxhcnlTdGF0dXMgPT09IER1dHlTYWxhcnlTdGF0dXMuTm90SW5mb3JtZWRcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICB7eyBmb3JtYXR0ZWRSZWdpb25hbEF2ZXJhZ2UgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBCYWRnZSBEaW7Dom1pY28gLS0+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzYWxhcnktYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2FsYXJ5QmFkZ2VDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRHV0eVNhbGFyeUNvbXBhcmlzb24uYmFkZ2VUZXh0XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZER1dHlTYWxhcnlDb21wYXJpc29uLmJhZGdlVGV4dCB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2hlYWRlcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gTGluaGEvQ29ycG8gdGV4dHVhbCBjb20gRGVzdGFxdWUgZSBFeHBsaWNhw6fDo28gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYWxhcnktY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwic2FsYXJ5LWhpZ2hsaWdodC10aXRsZVwiIFtuZ0NsYXNzXT1cInNhbGFyeVRpdGxlQ29sb3JDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAge3sgc2VsZWN0ZWREdXR5U2FsYXJ5Q29tcGFyaXNvbi5oaWdobGlnaHRUaXRsZSB9fVxyXG4gICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzYWxhcnktZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkRHV0eVNhbGFyeUNvbXBhcmlzb24uZGVzY3JpcHRpb24gfX1cclxuICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9hcnRpY2xlPlxyXG5cclxuICAgICAgICAgIDwhLS0gQ2FyZCBkZSBTdXBvcnRlOiBEw7p2aWRhcyBzb2JyZSBlc3NlcyBkYWRvcz8gLS0+XHJcbiAgICAgICAgICA8YXJ0aWNsZSBjbGFzcz1cInZhY2FuY3ktc3VwcG9ydC1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cInN1cHBvcnQtY2FyZC10aXRsZVwiPkFpbmRhIGNvbSBkw7p2aWRhcyBzb2JyZSBlc3NlcyBkYWRvcz88L2g0PlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInN1cHBvcnQtY2FyZC1zdWJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgIFNlIGRlcG9pcyBkZSB2ZXIgb3MgZ3LDoWZpY29zIHZvY8OqIGZpY291IGNvbSBwZXJndW50YXMgc2VtIHJlc3Bvc3RhLCBmYWxlIGNvbSBhIG5vc3NhIGVxdWlwZS5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4tc3VwcG9ydC1jb25zdWx0YW50XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbnN1bHRhbnRXaGF0c0FwcCgnRMO6dmlkYXMgc29icmUgZXNzZXMgZGFkb3MnKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICBGYWxlIGNvbSB1bSBjb25zdWx0b3JcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2FydGljbGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9BY3RpdmVEdXRpZXM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInplcm8tc3RhdGUtYmFubmVyXCIgKm5nSWY9XCJpc1B1Ymxpc2haZXJvU3RhdGU7IGVsc2UgYmFzaWNWYWNhbmN5WmVyb1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInplcm8tc3RhdGUtYmFubmVyLWxlZnRcIj5cclxuICAgICAgICAgICAgPGNhcmVvbi1kYXNoYm9hcmQtaWNvbiBuYW1lPVwiaW5mb1wiIGNsYXNzPVwiemVyby1pbmZvLWljb25cIj48L2NhcmVvbi1kYXNoYm9hcmQtaWNvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInplcm8tc3RhdGUtYmFubmVyLXRleHRzXCI+XHJcbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiemVyby1zdGF0ZS1iYW5uZXItdGl0bGVcIj5OZW5odW1hIHZhZ2EgcGFyYSBhbmFsaXNhcjwvaDM+XHJcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ6ZXJvLXN0YXRlLWJhbm5lci1zdWJ0aXRsZVwiPkNhZGFzdHJlIHVtYSB2YWdhIHBhcmEgY29tZcOnYXIgYSBhY29tcGFuaGFyIG8gZGVzZW1wZW5obyBkZWxhIGFxdWkuPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4temVyby1wdWJsaXNoXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHVibGlzaER1dHkoJ0Fuw6FsaXNlIHBvciBWYWdhJylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBQdWJsaWNhciBWYWdhXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNiYXNpY1ZhY2FuY3laZXJvPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJhc2ljLWVtcHR5LXN0YXRlIGJhc2ljLWVtcHR5LXN0YXRlLS12YWNhbmN5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXNpYy1lbXB0eS1pY29uLXdyYXBcIj5cclxuICAgICAgICAgICAgICA8Y2FyZW9uLWRhc2hib2FyZC1pY29uIG5hbWU9XCJpbmZvXCIgY2xhc3M9XCJiYXNpYy1lbXB0eS1pY29uXCI+PC9jYXJlb24tZGFzaGJvYXJkLWljb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJiYXNpYy1lbXB0eS10aXRsZVwiPk5lbmh1bWEgdmFnYSBwYXJhIGFuYWxpc2FyPC9oMz5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJiYXNpYy1lbXB0eS10ZXh0XCI+TmVuaHVtYSB2YWdhIGF0aXZhIG5vIG1vbWVudG8gcGFyYSBhbsOhbGlzZS48L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9zZWN0aW9uPlxyXG4gICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuICAgIDwhLS0gI3JlZ2lvbiBBcHBsaWNhdGlvbnNQZXJWYWNhbmN5U2VjdGlvbiAtLT5cclxuICAgIDxzZWN0aW9uIGNsYXNzPVwiYXBwbGljYXRpb25zLXBlci12YWNhbmN5LXNlY3Rpb25cIj5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cImFwcGxpY2F0aW9ucy1zZWN0aW9uLWhlYWRlclwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cImFwcGxpY2F0aW9ucy1zZWN0aW9uLXRpdGxlXCI+Q2FuZGlkYXR1cmFzIHBvciBWYWdhPC9oMj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImFwcGxpY2F0aW9ucy1zZWN0aW9uLXN1YnRpdGxlXCIgKm5nSWY9XCJoYXNDb21wYXJpc29uRHV0aWVzXCI+XHJcbiAgICAgICAgICB7eyBjb21wYXJpc29uU3VidGl0bGUgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhcHBsaWNhdGlvbnMtc2VjdGlvbi1zdWJ0aXRsZVwiICpuZ0lmPVwiIWhhc0NvbXBhcmlzb25EdXRpZXNcIj5cclxuICAgICAgICAgIHt7IGlzUHVibGlzaFplcm9TdGF0ZSA/ICcwIGNhbmRpZGF0dXJhcyBubyB0b3RhbCwgbmVuaHVtYSB2YWdhIGF0aXZhJyA6ICdOZW5odW1hIHZhZ2EgYXRpdmEgbm8gbW9tZW50bycgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImFwcGxpY2F0aW9ucy1jaGFydC13cmFwcGVyXCIgKm5nSWY9XCJoYXNDb21wYXJpc29uRHV0aWVzOyBlbHNlIG5vQ29tcGFyaXNvbkR1dGllc1wiPlxyXG4gICAgICAgIDxjYXJlb24tY29tcGFyaXNvbi1iYXItY2hhcnRcclxuICAgICAgICAgIFtkYXRhXT1cImNvbXBhcmlzb25JdGVtc1wiXHJcbiAgICAgICAgICBbYXV0b0JhcldpZHRoXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtiYXJXaWR0aF09XCI3NVwiXHJcbiAgICAgICAgICBbaXRlbVNsb3RXaWR0aF09XCIxMDBcIlxyXG4gICAgICAgICAgW2JhckNvbG9yXT1cIicjM0I4MkY2J1wiXHJcbiAgICAgICAgICBbemVyb0NvbG9yXT1cIicjRUY0NDQ0J1wiXHJcbiAgICAgICAgICBbdHJlbmRMaW5lQ29sb3JdPVwiJyMxRTI5M0InXCJcclxuICAgICAgICAgIFtkb3RDb2xvcl09XCInIzFFMjkzQidcIlxyXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInIzY0NzQ4QidcIlxyXG4gICAgICAgICAgKGl0ZW1TZWxlY3RlZCk9XCJvbkNoYXJ0SXRlbVNlbGVjdGVkKCRldmVudCwgJ0NhbmRpZGF0dXJhcyBwb3IgVmFnYScpXCJcclxuICAgICAgICA+PC9jYXJlb24tY29tcGFyaXNvbi1iYXItY2hhcnQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub0NvbXBhcmlzb25EdXRpZXM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInplcm8tc3RhdGUtYmFubmVyXCIgKm5nSWY9XCJpc1B1Ymxpc2haZXJvU3RhdGU7IGVsc2UgYmFzaWNDb21wYXJpc29uWmVyb1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInplcm8tc3RhdGUtYmFubmVyLWxlZnRcIj5cclxuICAgICAgICAgICAgPGNhcmVvbi1kYXNoYm9hcmQtaWNvbiBuYW1lPVwiaW5mb1wiIGNsYXNzPVwiemVyby1pbmZvLWljb25cIj48L2NhcmVvbi1kYXNoYm9hcmQtaWNvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInplcm8tc3RhdGUtYmFubmVyLXRleHRzXCI+XHJcbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiemVyby1zdGF0ZS1iYW5uZXItdGl0bGVcIj5OZW5odW1hIGNhbmRpZGF0dXJhIHJlZ2lzdHJhZGE8L2gzPlxyXG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiemVyby1zdGF0ZS1iYW5uZXItc3VidGl0bGVcIj5TZW0gdmFnYXMgZW0gYWJlcnRvLCBhaW5kYSBuw6NvIGjDoSBjYW5kaWRhdHVyYXMgcGFyYSBtb3N0cmFyLjwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLXplcm8tcHVibGlzaFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblB1Ymxpc2hEdXR5KCdDYW5kaWRhdHVyYXMgcG9yIFZhZ2EnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFB1YmxpY2FyIFZhZ2FcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2Jhc2ljQ29tcGFyaXNvblplcm8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFzaWMtZW1wdHktc3RhdGUgYmFzaWMtZW1wdHktc3RhdGUtLWNvbXBhcmlzb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhc2ljLWVtcHR5LWljb24td3JhcFwiPlxyXG4gICAgICAgICAgICAgIDxjYXJlb24tZGFzaGJvYXJkLWljb24gbmFtZT1cImluZm9cIiBjbGFzcz1cImJhc2ljLWVtcHR5LWljb25cIj48L2NhcmVvbi1kYXNoYm9hcmQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxoMyBjbGFzcz1cImJhc2ljLWVtcHR5LXRpdGxlXCI+TmVuaHVtYSBjYW5kaWRhdHVyYSByZWdpc3RyYWRhPC9oMz5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJiYXNpYy1lbXB0eS10ZXh0XCI+TmVuaHVtYSB2YWdhIGF0aXZhIG5vIG1vbWVudG8gcGFyYSBhbsOhbGlzZS48L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9zZWN0aW9uPlxyXG4gICAgPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG4gIDwvbWFpbj5cclxuICA8IS0tICNlbmRyZWdpb24gLS0+XHJcbjwvZGl2PlxyXG4iXX0=
|