@senior-gestao-pessoas/payroll-core 9.1.0-4c189107-f538-4deb-9b77-aee8dab91b50 → 9.1.0-7f16e3ee-01cd-4128-8f8e-7bee7dee1e66
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/bundles/senior-gestao-pessoas-payroll-core.umd.js +992 -0
- package/bundles/senior-gestao-pessoas-payroll-core.umd.js.map +1 -1
- package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js +1 -1
- package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js.map +1 -1
- package/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.d.ts +73 -0
- package/components/historical-pix-account/historical-pix-account.component.d.ts +74 -0
- package/components/historical-pix-account/historical-pix-account.module.d.ts +2 -0
- package/components/historical-pix-account/historical-pix-account.service.d.ts +8 -0
- package/components/historical-pix-account/index.d.ts +3 -0
- package/components/utils/format-utils/format-utils.service.d.ts +33 -0
- package/components/utils/generic-validators.d.ts +24 -0
- package/esm2015/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +307 -0
- package/esm2015/components/historical-pix-account/historical-pix-account.component.js +323 -0
- package/esm2015/components/historical-pix-account/historical-pix-account.module.js +58 -0
- package/esm2015/components/historical-pix-account/historical-pix-account.service.js +20 -0
- package/esm2015/components/historical-pix-account/index.js +4 -0
- package/esm2015/components/utils/format-utils/format-utils.service.js +96 -0
- package/esm2015/components/utils/generic-validators.js +164 -0
- package/esm2015/public_api.js +2 -1
- package/esm2015/senior-gestao-pessoas-payroll-core.js +2 -1
- package/esm5/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +331 -0
- package/esm5/components/historical-pix-account/historical-pix-account.component.js +357 -0
- package/esm5/components/historical-pix-account/historical-pix-account.module.js +61 -0
- package/esm5/components/historical-pix-account/historical-pix-account.service.js +22 -0
- package/esm5/components/historical-pix-account/index.js +4 -0
- package/esm5/components/utils/format-utils/format-utils.service.js +100 -0
- package/esm5/components/utils/generic-validators.js +167 -0
- package/esm5/public_api.js +2 -1
- package/esm5/senior-gestao-pessoas-payroll-core.js +2 -1
- package/fesm2015/senior-gestao-pessoas-payroll-core.js +921 -1
- package/fesm2015/senior-gestao-pessoas-payroll-core.js.map +1 -1
- package/fesm5/senior-gestao-pessoas-payroll-core.js +989 -1
- package/fesm5/senior-gestao-pessoas-payroll-core.js.map +1 -1
- package/locale/en-US.json +25 -1
- package/locale/es-ES.json +25 -1
- package/locale/pt-BR.json +25 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/senior-gestao-pessoas-payroll-core.d.ts +1 -0
- package/senior-gestao-pessoas-payroll-core.metadata.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { OnInit, EventEmitter, ChangeDetectorRef, OnDestroy, AfterViewInit } from "@angular/core";
|
|
2
|
+
import { FormGroup, FormBuilder } from "@angular/forms";
|
|
3
|
+
import { NumberLocaleOptions, CustomFieldsComponent } from "@seniorsistemas/angular-components";
|
|
4
|
+
export declare class HistoricalPixAccountFormComponent implements OnInit, OnDestroy, AfterViewInit {
|
|
5
|
+
private formBuilder;
|
|
6
|
+
private cd;
|
|
7
|
+
customFields: CustomFieldsComponent;
|
|
8
|
+
currency: NumberLocaleOptions;
|
|
9
|
+
customEntity: string;
|
|
10
|
+
customService: string;
|
|
11
|
+
withSideBar: boolean;
|
|
12
|
+
isEditMode: boolean;
|
|
13
|
+
paramsForm: FormGroup;
|
|
14
|
+
visibleChange: EventEmitter<boolean>;
|
|
15
|
+
pixAccountItemToList: EventEmitter<any>;
|
|
16
|
+
private _visible;
|
|
17
|
+
private ngUnsubscribe;
|
|
18
|
+
private employeeId;
|
|
19
|
+
private pixAccountList;
|
|
20
|
+
private initialValidatorOfPercentage;
|
|
21
|
+
labelBtnAdd: string;
|
|
22
|
+
pixAccountFormGroup: FormGroup;
|
|
23
|
+
maxValuePercentage: number;
|
|
24
|
+
visibleBtnSave: boolean;
|
|
25
|
+
isView: boolean;
|
|
26
|
+
pixKeyType: string;
|
|
27
|
+
isShowPixKeyFieldValidatorMessage: boolean;
|
|
28
|
+
constructor(formBuilder: FormBuilder, cd: ChangeDetectorRef);
|
|
29
|
+
ngOnInit(): void;
|
|
30
|
+
ngAfterViewInit(): void;
|
|
31
|
+
ngOnDestroy(): void;
|
|
32
|
+
private registerSubjects;
|
|
33
|
+
private createFormGroup;
|
|
34
|
+
onChangePixKeyType(item: any): void;
|
|
35
|
+
onClearPixKeyType(): void;
|
|
36
|
+
visible: boolean;
|
|
37
|
+
isEditAndViewValue: any;
|
|
38
|
+
convertDTOToShowWithCustomFields(data: object): object;
|
|
39
|
+
private configEnableFields;
|
|
40
|
+
close(): void;
|
|
41
|
+
addItem(): void;
|
|
42
|
+
resetForm(): void;
|
|
43
|
+
readonly percentagePlaceholder: string;
|
|
44
|
+
readonly optionsPercentage: object;
|
|
45
|
+
private getOptions;
|
|
46
|
+
/**
|
|
47
|
+
* O Input que recebe a lista do component pai e chama o método de validação passando a lista recebida.
|
|
48
|
+
* @param pixAccountList
|
|
49
|
+
*/
|
|
50
|
+
getListPixAccount: object[];
|
|
51
|
+
/**
|
|
52
|
+
* Recebe a lista de registros já inseridos na tabela adiciona em uma variável os valores que serão usados para
|
|
53
|
+
* a validação dos campos "percentage" e "pixAccount".
|
|
54
|
+
* Quando tem index significa que está em uma edição, os valores na posição do registro da edição (index) não serão adicionados
|
|
55
|
+
* no array de comparação dos validators.
|
|
56
|
+
* @param pixAccountList
|
|
57
|
+
* @param index
|
|
58
|
+
*/
|
|
59
|
+
private setValidatorsAccordingList;
|
|
60
|
+
/**
|
|
61
|
+
* Antes de setar o validator prepara as variáveis necessária para que seja feita a validação do campo.
|
|
62
|
+
*/
|
|
63
|
+
setPixKeyValidators(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Este método calcula as parcentagens que já foram inseridas, e seta a diferença para chegar em
|
|
66
|
+
* 100% na validação do campo "percentage" como um novo maxValue;
|
|
67
|
+
* @param listValue
|
|
68
|
+
*/
|
|
69
|
+
private validatePercentageValid;
|
|
70
|
+
isViewMode: boolean;
|
|
71
|
+
phoneMask(event: any): void;
|
|
72
|
+
setDefaultCpfPixKey(): void;
|
|
73
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { OnInit, ChangeDetectorRef, AfterViewInit, OnDestroy } from "@angular/core";
|
|
2
|
+
import { FormGroup, FormBuilder } from "@angular/forms";
|
|
3
|
+
import { TranslateService } from "@ngx-translate/core";
|
|
4
|
+
import { CustomFieldsComponent, NumberLocaleOptions } from "@seniorsistemas/angular-components";
|
|
5
|
+
export declare class HistoricalPixAccountComponent implements OnInit, OnDestroy, AfterViewInit {
|
|
6
|
+
private translateService;
|
|
7
|
+
private cd;
|
|
8
|
+
private formBuilder;
|
|
9
|
+
customFields: CustomFieldsComponent;
|
|
10
|
+
formGroup: FormGroup;
|
|
11
|
+
fieldFormGroup: string;
|
|
12
|
+
_dateChange: string;
|
|
13
|
+
_displayDateChange: string;
|
|
14
|
+
recordByRow: number;
|
|
15
|
+
showDateChange: boolean;
|
|
16
|
+
msgTooltipAdd: string;
|
|
17
|
+
isEditMode: boolean;
|
|
18
|
+
isViewMode: boolean;
|
|
19
|
+
currency: NumberLocaleOptions;
|
|
20
|
+
customEntity: string;
|
|
21
|
+
customService: string;
|
|
22
|
+
withSideBar: boolean;
|
|
23
|
+
paramsForm: FormGroup;
|
|
24
|
+
private visibleChange;
|
|
25
|
+
private ngUnsubscribe;
|
|
26
|
+
private historicalPixAccountList;
|
|
27
|
+
private orderBy;
|
|
28
|
+
private _visible;
|
|
29
|
+
pixAccountItemInput: object;
|
|
30
|
+
totalRecords: number;
|
|
31
|
+
actionLabel: string;
|
|
32
|
+
loading: boolean;
|
|
33
|
+
parameters: any;
|
|
34
|
+
msgTotalLimitByPercentage: string;
|
|
35
|
+
listData: object[];
|
|
36
|
+
listDataNoPage: object[];
|
|
37
|
+
cols: {
|
|
38
|
+
label: any;
|
|
39
|
+
field: string;
|
|
40
|
+
}[];
|
|
41
|
+
actions: (rowData: any, key: any) => {
|
|
42
|
+
visible: boolean;
|
|
43
|
+
label: any;
|
|
44
|
+
command: () => void;
|
|
45
|
+
}[];
|
|
46
|
+
constructor(translateService: TranslateService, cd: ChangeDetectorRef, formBuilder: FormBuilder);
|
|
47
|
+
ngOnInit(): void;
|
|
48
|
+
private createFormGroup;
|
|
49
|
+
ngOnDestroy(): void;
|
|
50
|
+
ngAfterViewInit(): void;
|
|
51
|
+
onLazyLoad(event?: any): void;
|
|
52
|
+
/**
|
|
53
|
+
* Um Bug de CSS que acontece nas linhas da tabela, que resolve só atualizando qualquer parte do CSS da pagina.
|
|
54
|
+
*/
|
|
55
|
+
private refreshCssInIE11;
|
|
56
|
+
add(): void;
|
|
57
|
+
private deleteAnnuityItem;
|
|
58
|
+
getHistoricalPixAccountList(): object[];
|
|
59
|
+
addItemInList($event: any): void;
|
|
60
|
+
private getNumberPageByIndex;
|
|
61
|
+
private verifyTotalPercentage;
|
|
62
|
+
readonly scopedActions: any;
|
|
63
|
+
readonly recordsMessage: string;
|
|
64
|
+
readonly getTooltipAndDisableButtonAdd: string;
|
|
65
|
+
dateChange: string;
|
|
66
|
+
displayDateChange: string;
|
|
67
|
+
addListData: object[];
|
|
68
|
+
visible: boolean;
|
|
69
|
+
close(): void;
|
|
70
|
+
getFormattedCpfTelephoneNumber(telephoneNumber: string): string;
|
|
71
|
+
getFormattedCpf(cpf: string): string;
|
|
72
|
+
getFormattedCnpj(cnpj: string): string;
|
|
73
|
+
getFormattedPercentage(value: string): string;
|
|
74
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { HttpClientService } from '../shared/http-client.service';
|
|
3
|
+
import { ServiceType } from '../../core/enums/serviceType';
|
|
4
|
+
export declare class HistoricalPixAccountService {
|
|
5
|
+
private http;
|
|
6
|
+
constructor(http: HttpClientService);
|
|
7
|
+
query(path: string, body: object, service?: ServiceType): Observable<any>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare class FormatUtilsService {
|
|
2
|
+
/**
|
|
3
|
+
* Retorna o CPF formatado
|
|
4
|
+
* @param cpf CPF
|
|
5
|
+
*/
|
|
6
|
+
static getFormattedCpf(cpf: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Retorna o CNPJ formatado
|
|
9
|
+
* @param cnpj CNPJ
|
|
10
|
+
*/
|
|
11
|
+
static getFormattedCnpj(cnpj: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Retorna a mascara do CPF/CNPJ
|
|
14
|
+
* @param key Valores possíveis são CPF ou CNPJ
|
|
15
|
+
*/
|
|
16
|
+
static getCpfCnpjMask(key: string): "" | "999.999.999-99" | "99.999.999/9999-99";
|
|
17
|
+
/**
|
|
18
|
+
* Metódo para formatar o número de telefone.
|
|
19
|
+
* @param telephoneNumber String contendo o número de telefone.
|
|
20
|
+
* @returns String formatada com o número de telefone.
|
|
21
|
+
*/
|
|
22
|
+
static getFormattedTelephoneNumber(telephoneNumber: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Metódo para formatar o número de telefone de um campo Input.
|
|
25
|
+
* @param event Evento do Input do campo de telefone.
|
|
26
|
+
*/
|
|
27
|
+
static formatTelephoneInputEvent(event: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Metódo para formatar a porcentagem para 2 casas decimais.
|
|
30
|
+
* @param value Número a ser formatado.
|
|
31
|
+
*/
|
|
32
|
+
static getFormattedPercentage(value: string): string;
|
|
33
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Validators, AbstractControl } from "@angular/forms";
|
|
2
|
+
export declare class GenericValidator {
|
|
3
|
+
constructor();
|
|
4
|
+
/**
|
|
5
|
+
* Valida o CEI (Cadastro específico de INSS) digitado.
|
|
6
|
+
*/
|
|
7
|
+
static isValidCei(control: AbstractControl): Validators;
|
|
8
|
+
/**
|
|
9
|
+
* Valida se o CPF é valido. Deve-se ser informado o cpf sem máscara.
|
|
10
|
+
*/
|
|
11
|
+
static isValidCpf(control: AbstractControl): Validators;
|
|
12
|
+
/**
|
|
13
|
+
* Valida se o CNPJ é valido. Deve-se ser informado o cpf sem máscara.
|
|
14
|
+
*/
|
|
15
|
+
static isValidCnpj(control: AbstractControl): Validators;
|
|
16
|
+
/**
|
|
17
|
+
* Válida o número de telefone da chave PIX.
|
|
18
|
+
*/
|
|
19
|
+
static isValidPhoneNumber(control: AbstractControl): Validators;
|
|
20
|
+
/**
|
|
21
|
+
* Valida o email da chave PIX.
|
|
22
|
+
*/
|
|
23
|
+
static isValidEmail(control: AbstractControl): Validators;
|
|
24
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import * as tslib_1 from "tslib";
|
|
2
|
+
import { Component, OnInit, Input, Output, EventEmitter, ChangeDetectorRef, OnDestroy, AfterViewInit, ViewChild, } from "@angular/core";
|
|
3
|
+
import { FormGroup, FormBuilder, Validators, ValidatorFn } from "@angular/forms";
|
|
4
|
+
import { CustomFieldsComponent } from "@seniorsistemas/angular-components";
|
|
5
|
+
import { Subject } from "rxjs";
|
|
6
|
+
import { verifyValidationsForm, configEnabledFields, mountCustomToShow, } from "../../utils/helpers";
|
|
7
|
+
import { GenericValidator } from "../../utils/generic-validators";
|
|
8
|
+
import { FormatUtilsService } from "../../utils/format-utils/format-utils.service";
|
|
9
|
+
let HistoricalPixAccountFormComponent = class HistoricalPixAccountFormComponent {
|
|
10
|
+
constructor(formBuilder, cd) {
|
|
11
|
+
this.formBuilder = formBuilder;
|
|
12
|
+
this.cd = cd;
|
|
13
|
+
this.withSideBar = true;
|
|
14
|
+
this.isEditMode = false;
|
|
15
|
+
this.paramsForm = new FormGroup({});
|
|
16
|
+
this.visibleChange = new EventEmitter();
|
|
17
|
+
this.pixAccountItemToList = new EventEmitter();
|
|
18
|
+
this.ngUnsubscribe = new Subject();
|
|
19
|
+
this.initialValidatorOfPercentage = [Validators.required, Validators.min(0.01)];
|
|
20
|
+
this.labelBtnAdd = "hcm.payroll.employees_add";
|
|
21
|
+
this.maxValuePercentage = 100.00;
|
|
22
|
+
this.visibleBtnSave = true;
|
|
23
|
+
this.isView = false;
|
|
24
|
+
this.isShowPixKeyFieldValidatorMessage = false;
|
|
25
|
+
this.createFormGroup();
|
|
26
|
+
this.registerSubjects();
|
|
27
|
+
}
|
|
28
|
+
ngOnInit() {
|
|
29
|
+
}
|
|
30
|
+
ngAfterViewInit() {
|
|
31
|
+
this.cd.detectChanges();
|
|
32
|
+
}
|
|
33
|
+
ngOnDestroy() {
|
|
34
|
+
this.ngUnsubscribe.next(true);
|
|
35
|
+
this.ngUnsubscribe.unsubscribe();
|
|
36
|
+
}
|
|
37
|
+
registerSubjects() {
|
|
38
|
+
}
|
|
39
|
+
createFormGroup() {
|
|
40
|
+
this.pixAccountFormGroup = this.formBuilder.group({
|
|
41
|
+
id: this.formBuilder.control(null),
|
|
42
|
+
index: this.formBuilder.control(null),
|
|
43
|
+
employee: this.formBuilder.control({ value: { tableId: null }, disabled: true }),
|
|
44
|
+
dateChange: this.formBuilder.control(null),
|
|
45
|
+
pixKeyType: this.formBuilder.control(null, Validators.required),
|
|
46
|
+
pixKey: this.formBuilder.control(null),
|
|
47
|
+
percentage: this.formBuilder.control(null, Validators.compose([
|
|
48
|
+
...this.initialValidatorOfPercentage,
|
|
49
|
+
Validators.max(this.maxValuePercentage),
|
|
50
|
+
])),
|
|
51
|
+
customFields: this.formBuilder.control(null),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
onChangePixKeyType(item) {
|
|
55
|
+
if (item.key) {
|
|
56
|
+
this.pixKeyType = item.key;
|
|
57
|
+
this.isShowPixKeyFieldValidatorMessage = true;
|
|
58
|
+
this.pixAccountFormGroup.get("pixKey").reset();
|
|
59
|
+
this.setPixKeyValidators();
|
|
60
|
+
if (item.key === "CPF") {
|
|
61
|
+
this.setDefaultCpfPixKey();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onClearPixKeyType() {
|
|
66
|
+
this.isShowPixKeyFieldValidatorMessage = false;
|
|
67
|
+
this.pixAccountFormGroup.get("pixKey").reset();
|
|
68
|
+
}
|
|
69
|
+
get visible() {
|
|
70
|
+
return this._visible;
|
|
71
|
+
}
|
|
72
|
+
set visible(value) {
|
|
73
|
+
this._visible = value;
|
|
74
|
+
this.visibleChange.emit(this.visible);
|
|
75
|
+
}
|
|
76
|
+
set isEditAndViewValue(value) {
|
|
77
|
+
this.resetForm();
|
|
78
|
+
this.visibleBtnSave = true;
|
|
79
|
+
if (value && value.currentItem && Object.keys(value.currentItem).length) {
|
|
80
|
+
this.pixAccountFormGroup.patchValue(this.convertDTOToShowWithCustomFields(Object.assign({}, value.currentItem)));
|
|
81
|
+
this.labelBtnAdd = "hcm.payroll.employees_update";
|
|
82
|
+
this.setValidatorsAccordingList(value.listData, value.currentItem["index"]);
|
|
83
|
+
if (!this.isView) {
|
|
84
|
+
this.configEnableFields(value && value["isEditMode"]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.labelBtnAdd = "hcm.payroll.employees_add";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
convertDTOToShowWithCustomFields(data) {
|
|
92
|
+
const obj = Object.assign({}, data);
|
|
93
|
+
obj["customFields"] = mountCustomToShow(obj["customFields"]);
|
|
94
|
+
return obj;
|
|
95
|
+
}
|
|
96
|
+
configEnableFields(isEditMode) {
|
|
97
|
+
this.visibleBtnSave = isEditMode;
|
|
98
|
+
if (this.pixAccountFormGroup.get("pixKeyType").value) {
|
|
99
|
+
this.pixKeyType = this.pixAccountFormGroup.get("pixKeyType").value.key;
|
|
100
|
+
this.setPixKeyValidators();
|
|
101
|
+
if (this.pixKeyType === "TELEPHONE") {
|
|
102
|
+
this.pixAccountFormGroup.get("pixKey").setValue(FormatUtilsService.getFormattedTelephoneNumber(this.pixAccountFormGroup.get("pixKey").value));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
configEnabledFields(this.pixAccountFormGroup, isEditMode, [
|
|
106
|
+
"pixKeyType",
|
|
107
|
+
"pixKey",
|
|
108
|
+
"percentage",
|
|
109
|
+
"customFields",
|
|
110
|
+
], []);
|
|
111
|
+
}
|
|
112
|
+
close() {
|
|
113
|
+
this.resetForm();
|
|
114
|
+
this.visible = false;
|
|
115
|
+
}
|
|
116
|
+
addItem() {
|
|
117
|
+
this.pixAccountFormGroup.updateValueAndValidity();
|
|
118
|
+
verifyValidationsForm.call(this.pixAccountFormGroup);
|
|
119
|
+
if (this.pixAccountFormGroup.valid) {
|
|
120
|
+
if (this.employeeId) {
|
|
121
|
+
this.pixAccountFormGroup.get("employee").setValue({
|
|
122
|
+
tableId: this.employeeId,
|
|
123
|
+
name: "",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
this.pixAccountItemToList.emit(this.pixAccountFormGroup.getRawValue());
|
|
127
|
+
this.visible = false;
|
|
128
|
+
this.resetForm();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
resetForm() {
|
|
132
|
+
this.pixAccountFormGroup.reset();
|
|
133
|
+
this.labelBtnAdd = "hcm.payroll.employees_add";
|
|
134
|
+
if (this.customFields && this.customFields.formGroup)
|
|
135
|
+
this.customFields.formGroup.reset();
|
|
136
|
+
}
|
|
137
|
+
get percentagePlaceholder() {
|
|
138
|
+
return `0${this.currency && this.currency.decimalSeparator}00`;
|
|
139
|
+
}
|
|
140
|
+
get optionsPercentage() {
|
|
141
|
+
return Object.assign({}, this.getOptions(), { precision: 2 });
|
|
142
|
+
}
|
|
143
|
+
getOptions() {
|
|
144
|
+
return {
|
|
145
|
+
prefix: "",
|
|
146
|
+
thousands: this.currency.thousandsSeparator,
|
|
147
|
+
decimal: this.currency.decimalSeparator,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* O Input que recebe a lista do component pai e chama o método de validação passando a lista recebida.
|
|
152
|
+
* @param pixAccountList
|
|
153
|
+
*/
|
|
154
|
+
set getListPixAccount(pixAccountList) {
|
|
155
|
+
if (pixAccountList) {
|
|
156
|
+
this.setValidatorsAccordingList(pixAccountList);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
this.resetForm();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Recebe a lista de registros já inseridos na tabela adiciona em uma variável os valores que serão usados para
|
|
164
|
+
* a validação dos campos "percentage" e "pixAccount".
|
|
165
|
+
* Quando tem index significa que está em uma edição, os valores na posição do registro da edição (index) não serão adicionados
|
|
166
|
+
* no array de comparação dos validators.
|
|
167
|
+
* @param pixAccountList
|
|
168
|
+
* @param index
|
|
169
|
+
*/
|
|
170
|
+
setValidatorsAccordingList(pixAccountList, index = null) {
|
|
171
|
+
this.pixAccountList = pixAccountList && pixAccountList.length ? [...pixAccountList] : [];
|
|
172
|
+
const percentageIncluded = [];
|
|
173
|
+
if (this.pixAccountList && this.pixAccountList.length) {
|
|
174
|
+
this.pixAccountList.filter((field, key) => {
|
|
175
|
+
if (field["percentage"] && key != index) {
|
|
176
|
+
percentageIncluded.push(field["percentage"]);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
this.setPixKeyValidators();
|
|
181
|
+
this.validatePercentageValid(percentageIncluded);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Antes de setar o validator prepara as variáveis necessária para que seja feita a validação do campo.
|
|
185
|
+
*/
|
|
186
|
+
setPixKeyValidators() {
|
|
187
|
+
const genericPixKey = this.pixAccountFormGroup.get("pixKey");
|
|
188
|
+
if (this.pixKeyType) {
|
|
189
|
+
switch (this.pixKeyType) {
|
|
190
|
+
case "TELEPHONE":
|
|
191
|
+
genericPixKey.setValidators(Validators.compose([
|
|
192
|
+
Validators.required, GenericValidator.isValidPhoneNumber,
|
|
193
|
+
]));
|
|
194
|
+
break;
|
|
195
|
+
case "EMAIL":
|
|
196
|
+
genericPixKey.setValidators(Validators.compose([
|
|
197
|
+
Validators.required, GenericValidator.isValidEmail,
|
|
198
|
+
]));
|
|
199
|
+
break;
|
|
200
|
+
case "CPF":
|
|
201
|
+
genericPixKey.setValidators(Validators.compose([
|
|
202
|
+
Validators.required, GenericValidator.isValidCpf,
|
|
203
|
+
]));
|
|
204
|
+
break;
|
|
205
|
+
case "CNPJ":
|
|
206
|
+
genericPixKey.setValidators(Validators.compose([
|
|
207
|
+
Validators.required, GenericValidator.isValidCnpj,
|
|
208
|
+
]));
|
|
209
|
+
break;
|
|
210
|
+
case "RANDOM_KEY":
|
|
211
|
+
genericPixKey.setValidators(Validators.required);
|
|
212
|
+
break;
|
|
213
|
+
default:
|
|
214
|
+
genericPixKey.setValidators(null);
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
genericPixKey.enable();
|
|
218
|
+
genericPixKey.updateValueAndValidity();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Este método calcula as parcentagens que já foram inseridas, e seta a diferença para chegar em
|
|
223
|
+
* 100% na validação do campo "percentage" como um novo maxValue;
|
|
224
|
+
* @param listValue
|
|
225
|
+
*/
|
|
226
|
+
validatePercentageValid(listValue) {
|
|
227
|
+
const percentage = this.pixAccountFormGroup.get("percentage");
|
|
228
|
+
this.maxValuePercentage = listValue
|
|
229
|
+
.reduce((currentValue, total) => currentValue - total, 100.00);
|
|
230
|
+
percentage
|
|
231
|
+
.setValidators(Validators.compose([
|
|
232
|
+
...this.initialValidatorOfPercentage,
|
|
233
|
+
Validators.max(this.maxValuePercentage),
|
|
234
|
+
]));
|
|
235
|
+
percentage.updateValueAndValidity();
|
|
236
|
+
}
|
|
237
|
+
set isViewMode(condition) {
|
|
238
|
+
this.isView = !!(condition && !this.withSideBar);
|
|
239
|
+
this.configEnableFields(!this.isView);
|
|
240
|
+
if (!this.isView)
|
|
241
|
+
this.resetForm();
|
|
242
|
+
}
|
|
243
|
+
phoneMask(event) {
|
|
244
|
+
FormatUtilsService.formatTelephoneInputEvent(event);
|
|
245
|
+
}
|
|
246
|
+
setDefaultCpfPixKey() {
|
|
247
|
+
const sheetDocument = this.paramsForm.get("sheetDocument");
|
|
248
|
+
if (sheetDocument) {
|
|
249
|
+
const cpf = sheetDocument.get("cpfNumber").value;
|
|
250
|
+
if (cpf) {
|
|
251
|
+
this.pixAccountFormGroup.get("pixKey").setValue(cpf);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
HistoricalPixAccountFormComponent.ctorParameters = () => [
|
|
257
|
+
{ type: FormBuilder },
|
|
258
|
+
{ type: ChangeDetectorRef }
|
|
259
|
+
];
|
|
260
|
+
tslib_1.__decorate([
|
|
261
|
+
ViewChild(CustomFieldsComponent, { static: true })
|
|
262
|
+
], HistoricalPixAccountFormComponent.prototype, "customFields", void 0);
|
|
263
|
+
tslib_1.__decorate([
|
|
264
|
+
Input()
|
|
265
|
+
], HistoricalPixAccountFormComponent.prototype, "currency", void 0);
|
|
266
|
+
tslib_1.__decorate([
|
|
267
|
+
Input()
|
|
268
|
+
], HistoricalPixAccountFormComponent.prototype, "customEntity", void 0);
|
|
269
|
+
tslib_1.__decorate([
|
|
270
|
+
Input()
|
|
271
|
+
], HistoricalPixAccountFormComponent.prototype, "customService", void 0);
|
|
272
|
+
tslib_1.__decorate([
|
|
273
|
+
Input()
|
|
274
|
+
], HistoricalPixAccountFormComponent.prototype, "withSideBar", void 0);
|
|
275
|
+
tslib_1.__decorate([
|
|
276
|
+
Input()
|
|
277
|
+
], HistoricalPixAccountFormComponent.prototype, "isEditMode", void 0);
|
|
278
|
+
tslib_1.__decorate([
|
|
279
|
+
Input()
|
|
280
|
+
], HistoricalPixAccountFormComponent.prototype, "paramsForm", void 0);
|
|
281
|
+
tslib_1.__decorate([
|
|
282
|
+
Output()
|
|
283
|
+
], HistoricalPixAccountFormComponent.prototype, "visibleChange", void 0);
|
|
284
|
+
tslib_1.__decorate([
|
|
285
|
+
Output()
|
|
286
|
+
], HistoricalPixAccountFormComponent.prototype, "pixAccountItemToList", void 0);
|
|
287
|
+
tslib_1.__decorate([
|
|
288
|
+
Input()
|
|
289
|
+
], HistoricalPixAccountFormComponent.prototype, "visible", null);
|
|
290
|
+
tslib_1.__decorate([
|
|
291
|
+
Input()
|
|
292
|
+
], HistoricalPixAccountFormComponent.prototype, "isEditAndViewValue", null);
|
|
293
|
+
tslib_1.__decorate([
|
|
294
|
+
Input()
|
|
295
|
+
], HistoricalPixAccountFormComponent.prototype, "getListPixAccount", null);
|
|
296
|
+
tslib_1.__decorate([
|
|
297
|
+
Input()
|
|
298
|
+
], HistoricalPixAccountFormComponent.prototype, "isViewMode", null);
|
|
299
|
+
HistoricalPixAccountFormComponent = tslib_1.__decorate([
|
|
300
|
+
Component({
|
|
301
|
+
selector: "pix-account",
|
|
302
|
+
template: "<div id=\"main\">\n <form [formGroup]=\"pixAccountFormGroup\" autocomplete=\"off\">\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <!-- Tipo de chave -->\n <div class=\"ui-md-6 ui-sm-12 required\">\n <label>{{'hcm.payroll.employees_addition_pix_key_type'|translate}}</label>\n <input-rest-auto-complete-enum [dropdown]=\"true\" server=\"payroll\"\n enumeration=\"PixKeyType\"\n placeholder=\"{{'hcm.payroll.select' | translate}}\"\n name=\"pixKeyType\" [form]=\"pixAccountFormGroup\"\n (onSelect)=\"onChangePixKeyType($event)\"\n (onClear)=\"onClearPixKeyType()\"\n id=\"ta-pixKeyType\"></input-rest-auto-complete-enum>\n <s-control-errors [control]=\"pixAccountFormGroup.get('pixKeyType')\"\n [errorMessages]=\"{ required: 'hcm.payroll.required' | translate }\">\n </s-control-errors>\n </div>\n <!--Chave Pix-->\n <div class=\"ui-md-6 ui-sm-12 required\">\n <label>{{'hcm.payroll.employees_addition_pix_key' | translate}}</label>\n <ng-container [ngSwitch]=\"pixKeyType\">\n <input *ngSwitchCase=\"'TELEPHONE'\" only-number\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n (keyup)=\"phoneMask($event)\" maxlength=\"15\"\n placeholder=\"(__) ____-____\">\n <p-inputMask *ngSwitchCase=\"'CPF'\"\n id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n placeholder=\"___.___.___-__\"\n mask=\"999.999.999-99\" [unmask]=\"true\"></p-inputMask>\n <p-inputMask *ngSwitchCase=\"'CNPJ'\"\n id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n placeholder=\"__.___.___/____-__\"\n mask=\"99.999.999/9999-99\" [unmask]=\"true\"></p-inputMask>\n <input *ngSwitchCase=\"'EMAIL'\"\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"\n placeholder=\"{{'hcm.payroll.employees_addition_email'|translate}}\"/>\n <input *ngSwitchCase=\"'RANDOM_KEY'\"\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"/>\n <input *ngSwitchDefault disabled\n pInputText id=\"ta-pixKey\" name=\"pixKey\" formControlName=\"pixKey\"/>\n </ng-container>\n <s-control-errors *ngIf=\"isShowPixKeyFieldValidatorMessage\" id=\"er-pix-key\"\n [control]=\"pixAccountFormGroup.get('pixKey')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n invalidPhoneNumber: 'hcm.payroll.employees_addition_invalid_phone_number' | translate: { value: pixAccountFormGroup.get('pixKey').value },\n invalidEmail: 'hcm.payroll.employees_addition_email_invalid' | translate,\n cpfNotValid: 'hcm.payroll.employees_addition_cpf_error' | translate,\n cnpjNotValid: 'hcm.payroll.employees_addition_cnpj_error' | translate\n }\">\n </s-control-errors>\n </div>\n <!--Percentual-->\n <div class=\"ui-md-6 ui-sm-12 required\">\n <label id=\"lb-percentage\"\n for=\"ff-percentage\">{{ 'hcm.payroll.historical_bank_account_label_percentage' | translate }}</label>\n <div class=\"ui-inputgroup\">\n <span class=\"ui-inputgroup-addon\">%</span>\n <input pInputText id=\"ff-percentage\" name=\"percentage\"\n formControlName=\"percentage\"\n currencyMask\n [options]=\"optionsPercentage\"\n [placeholder]=\"percentagePlaceholder\"/>\n </div>\n <s-control-errors [control]=\"pixAccountFormGroup.get('percentage')\"\n [errorMessages]=\"{\n required: 'hcm.payroll.required' | translate,\n maxlength: 'hcm.payroll.error_max_length' | translate: { value: '6' },\n max: 'hcm.payroll.error_max_value_number' | translate: { value: maxValuePercentage },\n min: 'hcm.payroll.error_min_value_number' | translate: { value: '0,01' }\n }\">\n </s-control-errors>\n </div>\n <div class=\"ui-g-12\">\n <p-fieldset\n legend=\"{{ 'hcm.payroll.custom_fields' | translate }}\"\n [attr.data-hidden]=\"!customFields || !customFields.fields.length\"\n >\n <s-custom-fields\n domain=\"hcm\"\n service=\"{{customService}}\"\n entity=\"{{customEntity}}\"\n formControlName=\"customFields\"\n [invalidErrorLabel]=\"'hcm.payroll.employees_invalid_field' | translate\"\n >\n </s-custom-fields>\n </p-fieldset>\n </div>\n </div>\n </div>\n </form>\n\n <div [ngClass]=\"withSideBar ? 'footer' : 'footer-s-border'\">\n <div class=\"form-group\">\n <s-button id=\"btn-save\" label=\"{{ labelBtnAdd | translate}}\" priority=\"primary\"\n (onClick)=\"addItem()\" *ngIf=\"visibleBtnSave && !this.isView\"></s-button>\n <s-button *ngIf=\"withSideBar\" id=\"btn-close\" label=\"{{'hcm.payroll.cancel'|translate}}\" priority=\"secondary\"\n priority=\"link\" (onClick)=\"close()\"></s-button>\n </div>\n </div>\n</div>\n",
|
|
303
|
+
styles: [".refresh{width:100%!important}#table-annuity .col-default-s{width:10%}#table-annuity .col-default-m{width:12%}#table-annuity .col-default-l{width:16%}#table-annuity .col-action{width:10%}#table-annuity .icon-warning{text-align:center!important;color:#ff6d00c7!important}@media screen and (max-width:612px){#table-annuity .col-default-1,#table-annuity .col-default-2{width:16%}#table-annuity .col-default-3{width:26%}#table-annuity .col-icon{width:10%}#table-annuity .col-action{width:27%}}#main{display:-webkit-box;display:flex;height:100%;width:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}#main form{height:100%}#main .footer{border-top:1px solid #ccc;padding-top:15px;margin-top:15px;flex-shrink:0;margin-bottom:-18px}#main .footer-s-border{padding-left:7px;flex-shrink:0;margin-bottom:-18px}"]
|
|
304
|
+
})
|
|
305
|
+
], HistoricalPixAccountFormComponent);
|
|
306
|
+
export { HistoricalPixAccountFormComponent };
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yaWNhbC1waXgtYWNjb3VudC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3ItZ2VzdGFvLXBlc3NvYXMvcGF5cm9sbC1jb3JlLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9oaXN0b3JpY2FsLXBpeC1hY2NvdW50L2hpc3RvcmljYWwtcGl4LWFjY291bnQtZm9ybS9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGFBQWEsRUFDYixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFDSCxxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLGlCQUFpQixHQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBT25GLElBQWEsaUNBQWlDLEdBQTlDLE1BQWEsaUNBQWlDO0lBcUMxQyxZQUNZLFdBQXdCLEVBQ3hCLEVBQXFCO1FBRHJCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBNUIxQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUU1QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBRTVCLGVBQVUsR0FBYyxJQUFJ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QkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzt1RUFDZjtBQUdwQztJQURDLEtBQUssRUFBRTttRUFDNkI7QUFFckM7SUFEQyxLQUFLLEVBQUU7dUVBQ29CO0FBRTVCO0lBREMsS0FBSyxFQUFFO3dFQUNxQjtBQUU3QjtJQURDLEtBQUssRUFBRTtzRUFDMkI7QUFFbkM7SUFEQyxLQUFLLEVBQUU7cUVBQzJCO0FBRW5DO0lBREMsS0FBSyxFQUFFO3FFQUN5QztBQUdqRDtJQURDLE1BQU0sRUFBRTt3RUFDaUU7QUFFMUU7SUFEQyxNQUFNLEVBQUU7K0VBQ2dFO0FBMkV6RTtJQURDLEtBQUssRUFBRTtnRUFHUDtBQVFEO0lBREMsS0FBSyxFQUFFOzJFQWVQO0FBNkVEO0lBREMsS0FBSyxFQUFFOzBFQU9QO0FBeUZEO0lBREMsS0FBSyxFQUFFO21FQUtQO0FBdlNRLGlDQUFpQztJQUw3QyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsYUFBYTtRQUN2Qiw2bU5BQTJEOztLQUU5RCxDQUFDO0dBQ1csaUNBQWlDLENBc1Q3QztTQXRUWSxpQ0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBPbkluaXQsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTnVtYmVyTG9jYWxlT3B0aW9ucywgQ3VzdG9tRmllbGRzQ29tcG9uZW50IH0gZnJvbSBcIkBzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtcbiAgICB2ZXJpZnlWYWxpZGF0aW9uc0Zvcm0sXG4gICAgY29uZmlnRW5hYmxlZEZpZWxkcyxcbiAgICBtb3VudEN1c3RvbVRvU2hvdyxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2hlbHBlcnNcIjtcbmltcG9ydCB7IEdlbmVyaWNWYWxpZGF0b3IgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZ2VuZXJpYy12YWxpZGF0b3JzXCI7XG5pbXBvcnQgeyBGb3JtYXRVdGlsc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZm9ybWF0LXV0aWxzL2Zvcm1hdC11dGlscy5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInBpeC1hY2NvdW50XCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9oaXN0b3JpY2FsLXBpeC1hY2NvdW50LWZvcm0uY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4uL2hpc3RvcmljYWwtcGl4LWFjY291bnQuY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgSGlzdG9yaWNhbFBpeEFjY291bnRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICAgIEBWaWV3Q2hpbGQoQ3VzdG9tRmllbGRzQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIGN1c3RvbUZpZWxkczogQ3VzdG9tRmllbGRzQ29tcG9uZW50O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VycmVuY3k6IE51bWJlckxvY2FsZU9wdGlvbnM7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VzdG9tRW50aXR5OiBzdHJpbmc7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VzdG9tU2VydmljZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHdpdGhTaWRlQmFyOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGFyYW1zRm9ybTogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmlzaWJsZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwaXhBY2NvdW50SXRlbVRvTGlzdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIHByaXZhdGUgX3Zpc2libGU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcbiAgICBwcml2YXRlIGVtcGxveWVlSWQ6IHN0cmluZztcbiAgICBwcml2YXRlIHBpeEFjY291bnRMaXN0OiBvYmplY3RbXTtcbiAgICBwcml2YXRlIGluaXRpYWxWYWxpZGF0b3JPZlBlcmNlbnRhZ2U6IFZhbGlkYXRvckZuW10gPSBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC4wMSldO1xuXG5cbiAgICBwdWJsaWMgbGFiZWxCdG5BZGQ6IHN0cmluZyA9IFwiaGNtLnBheXJvbGwuZW1wbG95ZWVzX2FkZFwiO1xuICAgIHB1YmxpYyBwaXhBY2NvdW50Rm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIG1heFZhbHVlUGVyY2VudGFnZTogbnVtYmVyID0gMTAwLjAwO1xuICAgIHB1YmxpYyB2aXNpYmxlQnRuU2F2ZTogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIGlzVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBwaXhLZXlUeXBlOiBzdHJpbmc7XG4gICAgcHVibGljIGlzU2hvd1BpeEtleUZpZWxkVmFsaWRhdG9yTWVzc2FnZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICApIHtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtR3JvdXAoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclN1YmplY3RzKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyU3ViamVjdHMoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVGb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgaWQ6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKSxcbiAgICAgICAgICAgIGluZGV4OiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCksXG4gICAgICAgICAgICBlbXBsb3llZTogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHsgdmFsdWU6IHsgdGFibGVJZDogbnVsbCB9LCBkaXNhYmxlZDogdHJ1ZSB9KSxcbiAgICAgICAgICAgIGRhdGVDaGFuZ2U6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKSxcbiAgICAgICAgICAgIHBpeEtleVR5cGU6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgICAgICAgIHBpeEtleTogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpLFxuICAgICAgICAgICAgcGVyY2VudGFnZTogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5pbml0aWFsVmFsaWRhdG9yT2ZQZXJjZW50YWdlLFxuICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4KHRoaXMubWF4VmFsdWVQZXJjZW50YWdlKSxcbiAgICAgICAgICAgIF0pKSxcbiAgICAgICAgICAgIGN1c3RvbUZpZWxkczogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DaGFuZ2VQaXhLZXlUeXBlKGl0ZW06IGFueSkge1xuICAgICAgICBpZiAoaXRlbS5rZXkpIHtcbiAgICAgICAgICAgIHRoaXMucGl4S2V5VHlwZSA9IGl0ZW0ua2V5O1xuICAgICAgICAgICAgdGhpcy5pc1Nob3dQaXhLZXlGaWVsZFZhbGlkYXRvck1lc3NhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLmdldChcInBpeEtleVwiKS5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zZXRQaXhLZXlWYWxpZGF0b3JzKCk7XG5cbiAgICAgICAgICAgIGlmKGl0ZW0ua2V5ID09PSBcIkNQRlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0Q3BmUGl4S2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbGVhclBpeEtleVR5cGUoKSB7XG4gICAgICAgIHRoaXMuaXNTaG93UGl4S2V5RmllbGRWYWxpZGF0b3JNZXNzYWdlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikucmVzZXQoKTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodGhpcy52aXNpYmxlKTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgaXNFZGl0QW5kVmlld1ZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgdGhpcy52aXNpYmxlQnRuU2F2ZSA9IHRydWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5jdXJyZW50SXRlbSAmJiBPYmplY3Qua2V5cyh2YWx1ZS5jdXJyZW50SXRlbSkubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmNvbnZlcnREVE9Ub1Nob3dXaXRoQ3VzdG9tRmllbGRzKHsuLi52YWx1ZS5jdXJyZW50SXRlbX0pKTtcbiAgICAgICAgICAgIHRoaXMubGFiZWxCdG5BZGQgPSBcImhjbS5wYXlyb2xsLmVtcGxveWVlc191cGRhdGVcIjtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdG9yc0FjY29yZGluZ0xpc3QodmFsdWUubGlzdERhdGEsIHZhbHVlLmN1cnJlbnRJdGVtW1wiaW5kZXhcIl0pO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnRW5hYmxlRmllbGRzKHZhbHVlICYmIHZhbHVlW1wiaXNFZGl0TW9kZVwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsQnRuQWRkID0gXCJoY20ucGF5cm9sbC5lbXBsb3llZXNfYWRkXCI7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHB1YmxpYyBjb252ZXJ0RFRPVG9TaG93V2l0aEN1c3RvbUZpZWxkcyhkYXRhOiBvYmplY3QpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCBvYmo6IGFueSA9IHsuLi4gZGF0YX07XG4gICAgICAgIG9ialtcImN1c3RvbUZpZWxkc1wiXSA9IG1vdW50Q3VzdG9tVG9TaG93KG9ialtcImN1c3RvbUZpZWxkc1wiXSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maWdFbmFibGVGaWVsZHMoaXNFZGl0TW9kZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnZpc2libGVCdG5TYXZlID0gaXNFZGl0TW9kZTtcblxuICAgICAgICBpZih0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5VHlwZVwiKS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5waXhLZXlUeXBlID0gdGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLmdldChcInBpeEtleVR5cGVcIikudmFsdWUua2V5O1xuICAgICAgICAgICAgdGhpcy5zZXRQaXhLZXlWYWxpZGF0b3JzKCk7XG5cbiAgICAgICAgICAgIGlmKHRoaXMucGl4S2V5VHlwZSA9PT0gXCJURUxFUEhPTkVcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikuc2V0VmFsdWUoRm9ybWF0VXRpbHNTZXJ2aWNlLmdldEZvcm1hdHRlZFRlbGVwaG9uZU51bWJlcih0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5XCIpLnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdFbmFibGVkRmllbGRzKHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cCwgaXNFZGl0TW9kZSwgW1xuICAgICAgICAgICAgXCJwaXhLZXlUeXBlXCIsXG4gICAgICAgICAgICBcInBpeEtleVwiLFxuICAgICAgICAgICAgXCJwZXJjZW50YWdlXCIsXG4gICAgICAgICAgICBcImN1c3RvbUZpZWxkc1wiLFxuICAgICAgICBdLCBbXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSXRlbSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgdmVyaWZ5VmFsaWRhdGlvbnNGb3JtLmNhbGwodGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwKTtcblxuICAgICAgICBpZiAodGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbXBsb3llZUlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwLmdldChcImVtcGxveWVlXCIpLnNldFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVJZDogdGhpcy5lbXBsb3llZUlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5waXhBY2NvdW50SXRlbVRvTGlzdC5lbWl0KHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpKTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5yZXNldCgpO1xuICAgICAgICB0aGlzLmxhYmVsQnRuQWRkID0gXCJoY20ucGF5cm9sbC5lbXBsb3llZXNfYWRkXCI7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUZpZWxkcyAmJiB0aGlzLmN1c3RvbUZpZWxkcy5mb3JtR3JvdXApIHRoaXMuY3VzdG9tRmllbGRzLmZvcm1Hcm91cC5yZXNldCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGVyY2VudGFnZVBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgMCR7IHRoaXMuY3VycmVuY3kgJiYgdGhpcy5jdXJyZW5jeS5kZWNpbWFsU2VwYXJhdG9yIH0wMGA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvcHRpb25zUGVyY2VudGFnZSgpOiBvYmplY3Qge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmdldE9wdGlvbnMoKSwgcHJlY2lzaW9uOiAyIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmVmaXg6IFwiXCIsXG4gICAgICAgICAgICB0aG91c2FuZHM6IHRoaXMuY3VycmVuY3kudGhvdXNhbmRzU2VwYXJhdG9yLFxuICAgICAgICAgICAgZGVjaW1hbDogdGhpcy5jdXJyZW5jeS5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE8gSW5wdXQgcXVlIHJlY2ViZSBhIGxpc3RhIGRvIGNvbXBvbmVudCBwYWkgZSBjaGFtYSBvIG3DqXRvZG8gZGUgdmFsaWRhw6fDo28gcGFzc2FuZG8gYSBsaXN0YSByZWNlYmlkYS5cbiAgICAgKiBAcGFyYW0gcGl4QWNjb3VudExpc3RcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZ2V0TGlzdFBpeEFjY291bnQocGl4QWNjb3VudExpc3Q6IG9iamVjdFtdKSB7XG4gICAgICAgIGlmIChwaXhBY2NvdW50TGlzdCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0b3JzQWNjb3JkaW5nTGlzdChwaXhBY2NvdW50TGlzdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjZWJlIGEgbGlzdGEgZGUgcmVnaXN0cm9zIGrDoSBpbnNlcmlkb3MgbmEgdGFiZWxhIGFkaWNpb25hIGVtIHVtYSB2YXJpw6F2ZWwgb3MgdmFsb3JlcyBxdWUgc2Vyw6NvIHVzYWRvcyBwYXJhXG4gICAgICogYSB2YWxpZGHDp8OjbyBkb3MgY2FtcG9zIFwicGVyY2VudGFnZVwiIGUgXCJwaXhBY2NvdW50XCIuXG4gICAgICogUXVhbmRvIHRlbSBpbmRleCBzaWduaWZpY2EgcXVlIGVzdMOhIGVtIHVtYSBlZGnDp8Ojbywgb3MgdmFsb3JlcyBuYSBwb3Npw6fDo28gZG8gcmVnaXN0cm8gZGEgZWRpw6fDo28gKGluZGV4KSBuw6NvIHNlcsOjbyBhZGljaW9uYWRvc1xuICAgICAqIG5vIGFycmF5IGRlIGNvbXBhcmHDp8OjbyBkb3MgdmFsaWRhdG9ycy5cbiAgICAgKiBAcGFyYW0gcGl4QWNjb3VudExpc3RcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFZhbGlkYXRvcnNBY2NvcmRpbmdMaXN0KHBpeEFjY291bnRMaXN0OiBvYmplY3RbXSwgaW5kZXg6IG51bWJlciA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5waXhBY2NvdW50TGlzdCA9IHBpeEFjY291bnRMaXN0ICYmIHBpeEFjY291bnRMaXN0Lmxlbmd0aCA/IFsuLi5waXhBY2NvdW50TGlzdF0gOiBbXTtcblxuICAgICAgICBjb25zdCBwZXJjZW50YWdlSW5jbHVkZWQ6IGFueSA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLnBpeEFjY291bnRMaXN0ICYmIHRoaXMucGl4QWNjb3VudExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnBpeEFjY291bnRMaXN0LmZpbHRlcigoZmllbGQ6IGFueSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkW1wicGVyY2VudGFnZVwiXSAmJiBrZXkgIT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZUluY2x1ZGVkLnB1c2goZmllbGRbXCJwZXJjZW50YWdlXCJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UGl4S2V5VmFsaWRhdG9ycygpO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGVyY2VudGFnZVZhbGlkKHBlcmNlbnRhZ2VJbmNsdWRlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW50ZXMgZGUgc2V0YXIgbyB2YWxpZGF0b3IgcHJlcGFyYSBhcyB2YXJpw6F2ZWlzIG5lY2Vzc8OhcmlhIHBhcmEgcXVlIHNlamEgZmVpdGEgYSB2YWxpZGHDp8OjbyBkbyBjYW1wby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UGl4S2V5VmFsaWRhdG9ycygpIHtcbiAgICAgICAgY29uc3QgZ2VuZXJpY1BpeEtleSA9IHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIik7XG4gICAgICAgIGlmICh0aGlzLnBpeEtleVR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5waXhLZXlUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlRFTEVQSE9ORVwiOlxuICAgICAgICAgICAgICAgICAgICBnZW5lcmljUGl4S2V5LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsIEdlbmVyaWNWYWxpZGF0b3IuaXNWYWxpZFBob25lTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJFTUFJTFwiOlxuICAgICAgICAgICAgICAgICAgICBnZW5lcmljUGl4S2V5LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsIEdlbmVyaWNWYWxpZGF0b3IuaXNWYWxpZEVtYWlsLFxuICAgICAgICAgICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDUEZcIjpcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY1BpeEtleS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLCBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRDcGYsXG4gICAgICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNOUEpcIjpcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY1BpeEtleS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLCBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRDbnBqLFxuICAgICAgICAgICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJSQU5ET01fS0VZXCI6XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNQaXhLZXkuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY1BpeEtleS5zZXRWYWxpZGF0b3JzKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2VuZXJpY1BpeEtleS5lbmFibGUoKTtcbiAgICAgICAgICAgIGdlbmVyaWNQaXhLZXkudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RlIG3DqXRvZG8gY2FsY3VsYSBhcyBwYXJjZW50YWdlbnMgcXVlIGrDoSBmb3JhbSBpbnNlcmlkYXMsIGUgc2V0YSBhIGRpZmVyZW7Dp2EgcGFyYSBjaGVnYXIgZW1cbiAgICAgKiAxMDAlIG5hIHZhbGlkYcOnw6NvIGRvIGNhbXBvIFwicGVyY2VudGFnZVwiIGNvbW8gdW0gbm92byBtYXhWYWx1ZTtcbiAgICAgKiBAcGFyYW0gbGlzdFZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVBlcmNlbnRhZ2VWYWxpZChsaXN0VmFsdWU6IG51bWJlcltdKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGVyY2VudGFnZVwiKTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZVBlcmNlbnRhZ2UgPSBsaXN0VmFsdWVcbiAgICAgICAgICAgIC5yZWR1Y2UoKGN1cnJlbnRWYWx1ZSwgdG90YWwpID0+IGN1cnJlbnRWYWx1ZSAtIHRvdGFsLFxuICAgICAgICAgICAgICAgIDEwMC4wMCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgcGVyY2VudGFnZVxuICAgICAgICAgICAgLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmluaXRpYWxWYWxpZGF0b3JPZlBlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgodGhpcy5tYXhWYWx1ZVBlcmNlbnRhZ2UpLFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICBwZXJjZW50YWdlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgaXNWaWV3TW9kZShjb25kaXRpb246IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5pc1ZpZXcgPSAhIShjb25kaXRpb24gJiYgIXRoaXMud2l0aFNpZGVCYXIpO1xuICAgICAgICB0aGlzLmNvbmZpZ0VuYWJsZUZpZWxkcyghdGhpcy5pc1ZpZXcpO1xuICAgICAgICBpZiAoIXRoaXMuaXNWaWV3KSB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwaG9uZU1hc2soZXZlbnQ6IGFueSkge1xuICAgICAgICBGb3JtYXRVdGlsc1NlcnZpY2UuZm9ybWF0VGVsZXBob25lSW5wdXRFdmVudChldmVudCk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdENwZlBpeEtleSgpIHtcbiAgICAgICAgY29uc3Qgc2hlZXREb2N1bWVudCA9IHRoaXMucGFyYW1zRm9ybS5nZXQoXCJzaGVldERvY3VtZW50XCIpO1xuICAgICAgICBpZihzaGVldERvY3VtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjcGYgPSBzaGVldERvY3VtZW50LmdldChcImNwZk51bWJlclwiKS52YWx1ZTtcbiAgICAgICAgICAgIGlmKGNwZikge1xuICAgICAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikuc2V0VmFsdWUoY3BmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|