// File: /workspace/github_cpp_makefile_star2_O2/nataly-enne[P]pet-fera/pet_fera_cadastrar.cpp
// Function: cadastrar(std::map<int, TRATADOR, std::less<int>, std::allocator<std::pair<int const, TRATADOR>>>&)
void cadastrar(map <int, TRATADOR>  &tratadores){ 
	int id, idade, nivel_seg;
	unsigned int old_size;
	long int cpf;
	string nome, especialidade, tipo_sang, id_string, idade_string, tipo_sang_string, nivel_seg_string, cpf_string, fator_rh_string;
	char fator_rh, continuar, sucesso;
	bool check;
	old_size = tratadores.size();
	ofstream tratador;
	
	do{
		// Recebe o ID e verifica se é valido.
		do{
			cout << "Digite o id:" << endl;
			cin >> id_string;
			if(!verifica_ID(tratadores, id_string, sucesso)){
				cout << "O ID deve conter apenas inteiros ou ID já cadastrado!" << endl << endl;
			}
			else{
				stringstream ss(id_string); // Converte string para int.
				ss >> id;
			}

		}while(sucesso == 'n');

		// Recebe o nome e verifica se é valido.
		do{
			cout << "Digite o nome:" << endl;
			cin.ignore();
			getline(cin, nome);
			if(!verifica_nome(nome, sucesso)){
				cout << "ERRO: só pode ser inserido letra ou espaço!" << endl << endl;
			}
		}while(sucesso == 'n'); 
		
		// Recebe o CPF e verifica se é valido.
		do{
			cout << "Digite o CPF: " << endl;
			getline(cin, cpf_string);
			if(!verifica_CPF(cpf_string, sucesso)){
				cout << "CPF deve conter apenas numeros" << endl << endl;
			}
			else{
				cpf = stoll(cpf_string); //Transforma a string em long int.
				check = check_CPF(tratadores, cpf); // Checa se o CPF existe.
				if(check){
					cout << "CPF já cadastrado!" << endl;
					sucesso = 'n';
				}
			}
		}while(sucesso == 'n');

		
		// Recebe a idade e verifica se é valida.
		do{
			cout << "Digite a idade: " << endl;
			getline(cin, idade_string);
			if(!verifica_idade(idade_string, sucesso)){
				cout << "Idade deve conter apenas inteiros positivos!" << endl << endl;
			}
			else{
				stringstream ss(idade_string);
				ss >> idade;
			}

		}while(sucesso == 'n');

		// Recebe o tipo sanguineo e verifica se é valido.
		do{
			cout << "Insira o tipo sanguineo: " << endl;
			getline(cin, tipo_sang_string);
			if(!verifica_tipo_sang(tipo_sang_string, sucesso)){
				cout << "ERRO: O tipo sanguineo deve ser: A, B, AB ou O!" << endl << endl;
			}
			else{
				tipo_sang = tipo_sang_string;
			}

		}while(sucesso == 'n');

		// Recebe o fator RH e verifica se é valido.
		do{
			cout << "Insira o fator RH: " << endl;
			getline(cin, fator_rh_string);
			if(!verifica_fator(fator_rh_string, sucesso)){
				cout << "ERRO: O fator RH deve ser: + ou -" << endl << endl;
			}
			else{
				fator_rh = (char)fator_rh_string[0];
			}

		}while(sucesso == 'n');

		// Recebe a especialidade e verifica se é valida.
		do{
			cout << "Digite a especialidade: " << endl;
			getline(cin, especialidade);
			if(!verifica_especialidade(especialidade, sucesso)){
				cout << "ERRO: A especialidade deve conter apenas letras!" << endl << endl;
			}
			else{
				transform(especialidade.begin(), especialidade.end(), especialidade.begin(), ::tolower);
				especialidade = especialidade;
			}

		}while(sucesso == 'n');

		// Recebe o nível de segurança e verifica se é valida.
		do{
			cout << "Digite o nivel de seguranca: 0 ou 1 ou 2"<< endl;
			getline(cin, nivel_seg_string);
			if(!verifica_seguranca(nivel_seg_string, sucesso)){
				cout << "ERRO: O nivel de seguranca só pode ser 0, 1 ou 2!" << endl << endl;
			}
			else{
				stringstream ss(nivel_seg_string);
				ss >> nivel_seg;
			}
		}while(sucesso == 'n');

		
		// Armazenando os valores recebidos pelo usuário no map.
		tratadores.insert(pair <int, TRATADOR> (id, TRATADOR(id, nome, cpf, idade, tipo_sang, fator_rh, especialidade, nivel_seg)));
		
		cout << "Deseja cadastrar um novo funcionário? s/n" << endl;
		cin >> continuar;
	}while(continuar == 's');

	if (tratadores.size() == old_size){ 
		cout << "Falha no cadastro do funcionario!" << endl;
	}
	else{
		if(!tratadores.empty()){
			tratador.open("tratadores.txt");
			for(auto it = tratadores.begin(); it != tratadores.end(); it++){
				tratador << (*it).second;
			}
			tratador.close();
		}
		cout << "Cadastro efetuado com sucesso!!" << endl;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x688, %rsp            # imm = 0x688
leaq -0x140(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
movq %rdi, %r14
xorl %eax, %eax
leaq -0x120(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
leaq -0x160(%rbp), %rsi
movq %rsi, -0x10(%rsi)
andq $0x0, -0x8(%rsi)
movb %al, (%rcx)
movb %al, (%rdx)
leaq -0x100(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0xe0(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
movb %al, (%rsi)
movb %al, (%rcx)
leaq -0xc0(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0xa0(%rbp), %rsi
movq %rsi, -0x10(%rsi)
andq $0x0, -0x8(%rsi)
movb %al, (%rdx)
movb %al, (%rcx)
leaq -0x80(%rbp), %rcx
movq %rcx, -0x10(%rcx)
andq $0x0, -0x8(%rcx)
leaq -0x60(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
movb %al, (%rsi)
movb %al, (%rcx)
movb %al, (%rdx)
movl 0x28(%rdi), %eax
movq %rax, -0x50(%rbp)
leaq -0x6a8(%rbp), %rdi
callq 0x3350
leaq -0x410(%rbp), %rbx
leaq -0x130(%rbp), %r13
movq 0x24c24(%rip), %rdi     # 0x30fc8
leaq 0x17354(%rip), %rsi     # 0x236ff
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x24c21(%rip), %rdi     # 0x30fe0
leaq -0x110(%rbp), %rsi
callq 0x3260
leaq -0x290(%rbp), %rdi
leaq -0x110(%rbp), %rsi
callq 0x3290
movq %r14, %rdi
leaq -0x290(%rbp), %r15
movq %r15, %rsi
leaq -0x29(%rbp), %rdx
callq 0x211c6
movl %eax, %r12d
movq %r15, %rdi
callq 0x3100
testb %r12b, %r12b
je 0xc433
leaq -0x418(%rbp), %r15
movq %r15, %rdi
leaq -0x110(%rbp), %rsi
pushq $0x18
popq %rdx
callq 0x3300
movq %r15, %rdi
leaq -0x30(%rbp), %rsi
callq 0x3150
movq %r15, %rdi
callq 0x3170
jmp 0xc456
movq 0x24b8e(%rip), %rdi     # 0x30fc8
leaq 0x172cb(%rip), %rsi     # 0x2370c
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xc39d
movq 0x24b61(%rip), %rdi     # 0x30fc8
leaq 0x172d5(%rip), %rsi     # 0x23743
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x24b5e(%rip), %rdi     # 0x30fe0
callq 0x3380
movq 0x24b52(%rip), %rdi     # 0x30fe0
leaq -0x150(%rbp), %rsi
callq 0x3060
leaq -0x150(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x21b16
testb %al, %al
jne 0xc4d1
movq 0x24b13(%rip), %rdi     # 0x30fc8
leaq 0x17296(%rip), %rsi     # 0x23752
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xc460
movq 0x24aea(%rip), %rdi     # 0x30fc8
leaq 0x1729b(%rip), %rsi     # 0x23780
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x24ae7(%rip), %rdi     # 0x30fe0
leaq -0x90(%rbp), %rsi
callq 0x3060
leaq -0x270(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x3290
leaq -0x270(%rbp), %r15
movq %r15, %rdi
leaq -0x29(%rbp), %rsi
callq 0x21cb0
movl %eax, %r12d
movq %r15, %rdi
callq 0x3100
testb %r12b, %r12b
je 0xc584
leaq -0x90(%rbp), %rdi
xorl %esi, %esi
pushq $0xa
popq %rdx
callq 0x11df6
movq %rax, -0x48(%rbp)
movq %r14, %rdi
movq -0x48(%rbp), %rsi
callq 0x20df5
testb %al, %al
je 0xc5a7
movq 0x24a61(%rip), %rdi     # 0x30fc8
leaq 0x17240(%rip), %rsi     # 0x237ae
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movb $0x6e, -0x29(%rbp)
jmp 0xc4d7
movq 0x24a3d(%rip), %rdi     # 0x30fc8
leaq 0x171fd(%rip), %rsi     # 0x2378f
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xc4d7
movq 0x24a10(%rip), %rdi     # 0x30fc8
leaq 0x17203(%rip), %rsi     # 0x237c2
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x24a0d(%rip), %rdi     # 0x30fe0
leaq -0xf0(%rbp), %rsi
callq 0x3060
leaq -0x250(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
callq 0x3290
leaq -0x250(%rbp), %r15
movq %r15, %rdi
leaq -0x29(%rbp), %rsi
callq 0x21d14
movl %eax, %r12d
movq %r15, %rdi
callq 0x3100
testb %r12b, %r12b
je 0xc644
leaq -0x418(%rbp), %r15
movq %r15, %rdi
leaq -0xf0(%rbp), %rsi
pushq $0x18
popq %rdx
callq 0x3300
movq %r15, %rdi
leaq -0x3c(%rbp), %rsi
callq 0x3150
movq %r15, %rdi
callq 0x3170
jmp 0xc667
movq 0x2497d(%rip), %rdi     # 0x30fc8
leaq 0x17181(%rip), %rsi     # 0x237d3
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xc5b1
movq 0x24950(%rip), %rdi     # 0x30fc8
leaq 0x17181(%rip), %rsi     # 0x23800
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x2494d(%rip), %rdi     # 0x30fe0
leaq -0xd0(%rbp), %rsi
callq 0x3060
leaq -0xd0(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x21ddc
testb %al, %al
je 0xc6c8
leaq -0x170(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0x3120
jmp 0xc6eb
movq 0x248f9(%rip), %rdi     # 0x30fc8
leaq 0x17144(%rip), %rsi     # 0x2381a
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xc671
movq 0x248d0(%rip), %rdi     # 0x30fc8
leaq 0x1714b(%rip), %rsi     # 0x2384a
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x248cd(%rip), %rdi     # 0x30fe0
leaq -0x70(%rbp), %rsi
callq 0x3060
leaq -0x230(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x3290
leaq -0x230(%rbp), %r15
movq %r15, %rdi
leaq -0x29(%rbp), %rsi
callq 0x21ee3
movl %eax, %r12d
movq %r15, %rdi
callq 0x3100
testb %r12b, %r12b
je 0xc75a
movq -0x70(%rbp), %rax
movb (%rax), %al
movb %al, -0x2a(%rbp)
jmp 0xc77d
movq 0x24867(%rip), %rdi     # 0x30fc8
leaq 0x170f6(%rip), %rsi     # 0x2385e
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xc6f1
movq 0x2483a(%rip), %rdi     # 0x30fc8
leaq 0x170eb(%rip), %rsi     # 0x23880
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x24837(%rip), %rdi     # 0x30fe0
movq %r13, %rsi
callq 0x3060
leaq -0x210(%rbp), %rdi
movq %r13, %rsi
callq 0x3290
leaq -0x210(%rbp), %r15
movq %r15, %rdi
leaq -0x29(%rbp), %rsi
callq 0x21f3a
movl %eax, %r12d
movq %r15, %rdi
callq 0x3100
testb %r12b, %r12b
je 0xc80f
movq %r14, %r15
movq -0x130(%rbp), %r12
movq -0x128(%rbp), %rbx
xorl %r14d, %r14d
cmpq %r14, %rbx
je 0xc834
movsbl (%r12,%r14), %edi
callq 0x32c0
movb %al, (%r12,%r14)
incq %r14
jmp 0xc7f7
movq 0x247b2(%rip), %rdi     # 0x30fc8
leaq 0x1707c(%rip), %rsi     # 0x23899
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
jmp 0xc849
movq %r13, %rdi
movq %r13, %rsi
callq 0x3120
movq %r15, %r14
leaq -0x410(%rbp), %rbx
cmpb $0x6e, -0x29(%rbp)
je 0xc787
movq 0x2476e(%rip), %rdi     # 0x30fc8
leaq 0x17120(%rip), %rsi     # 0x23981
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x2476b(%rip), %rdi     # 0x30fe0
leaq -0xb0(%rbp), %rsi
callq 0x3060
leaq -0x1f0(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0x3290
leaq -0x1f0(%rbp), %r15
movq %r15, %rdi
leaq -0x29(%rbp), %rsi
callq 0x21a24
movl %eax, %r12d
movq %r15, %rdi
callq 0x3100
testb %r12b, %r12b
je 0xc8e6
leaq -0x418(%rbp), %r15
movq %r15, %rdi
leaq -0xb0(%rbp), %rsi
pushq $0x18
popq %rdx
callq 0x3300
movq %r15, %rdi
leaq -0x38(%rbp), %rsi
callq 0x3150
movq %r15, %rdi
callq 0x3170
jmp 0xc909
movq 0x246db(%rip), %rdi     # 0x30fc8
leaq 0x170b6(%rip), %rsi     # 0x239aa
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq %rax, %rdi
callq 0x3110
cmpb $0x6e, -0x29(%rbp)
je 0xc853
movl -0x30(%rbp), %eax
movl %eax, -0x34(%rbp)
leaq -0x1b0(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x3290
movl -0x3c(%rbp), %r12d
leaq -0x190(%rbp), %rdi
leaq -0x170(%rbp), %rsi
callq 0x3290
leaq -0x1d0(%rbp), %r15
movq %r15, %rdi
movq %r13, %rsi
callq 0x3290
movl -0x38(%rbp), %eax
subq $0x8, %rsp
movsbl -0x2a(%rbp), %r10d
leaq -0x4a8(%rbp), %rdi
movl -0x34(%rbp), %esi
leaq -0x1b0(%rbp), %rdx
movq -0x48(%rbp), %rcx
movl %r12d, %r8d
leaq -0x190(%rbp), %r9
pushq %rax
pushq %r15
pushq %r10
callq 0xaf6e
addq $0x20, %rsp
movl -0x30(%rbp), %eax
movl %eax, -0x418(%rbp)
movq %rbx, %rdi
leaq -0x4a8(%rbp), %r15
movq %r15, %rsi
callq 0x11fa0
movq %r14, %rdi
leaq -0x418(%rbp), %rsi
callq 0x1274e
movq %rbx, %rdi
callq 0x463e
movq %r15, %rdi
callq 0x463e
leaq -0x1d0(%rbp), %rdi
callq 0x3100
leaq -0x190(%rbp), %rdi
callq 0x3100
leaq -0x1b0(%rbp), %rdi
callq 0x3100
movq 0x245d5(%rip), %rdi     # 0x30fc8
leaq 0x16fe3(%rip), %rsi     # 0x239dd
callq 0x31f0
movq %rax, %rdi
callq 0x3110
movq 0x245d2(%rip), %rdi     # 0x30fe0
leaq -0x2b(%rbp), %rsi
callq 0x3280
cmpb $0x73, -0x2b(%rbp)
je 0xc39d
movq 0x28(%r14), %rax
cmpq -0x50(%rbp), %rax
jne 0xca34
leaq 0x16efc(%rip), %rbx     # 0x2392e
jmp 0xca92
leaq 0x16f26(%rip), %rbx     # 0x23961
testq %rax, %rax
je 0xca92
leaq 0x16fc1(%rip), %rsi     # 0x23a08
leaq -0x6a8(%rbp), %rdi
pushq $0x10
popq %rdx
callq 0x3040
movq 0x18(%r14), %r15
addq $0x8, %r14
movq %r14, %r12
leaq -0x6a8(%rbp), %r14
cmpq %r12, %r15
je 0xca86
leaq 0x28(%r15), %rsi
movq %r14, %rdi
callq 0xb1e6
movq %r15, %rdi
callq 0x3160
movq %rax, %r15
jmp 0xca68
leaq -0x6a8(%rbp), %rdi
callq 0x32a0
movq 0x2452f(%rip), %rdi     # 0x30fc8
movq %rbx, %rsi
callq 0x31f0
movq %rax, %rdi
callq 0x3110
leaq -0x6a8(%rbp), %rdi
callq 0x32e0
leaq -0x70(%rbp), %rdi
callq 0x3100
leaq -0x90(%rbp), %rdi
callq 0x3100
leaq -0xb0(%rbp), %rdi
callq 0x3100
leaq -0xd0(%rbp), %rdi
callq 0x3100
leaq -0xf0(%rbp), %rdi
callq 0x3100
leaq -0x110(%rbp), %rdi
callq 0x3100
leaq -0x170(%rbp), %rdi
callq 0x3100
leaq -0x130(%rbp), %rdi
callq 0x3100
leaq -0x150(%rbp), %rdi
callq 0x3100
addq $0x688, %rsp            # imm = 0x688
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
jmp 0xcc15
jmp 0xcc06
jmp 0xcc06
jmp 0xcc06
movq %rax, %rbx
jmp 0xcb85
movq %rax, %rbx
jmp 0xcb79
movq %rax, %rbx
jmp 0xcb6d
movq %rbx, %rdi
movq %rax, %rbx
callq 0x463e
leaq -0x4a8(%rbp), %rdi
callq 0x463e
leaq -0x1d0(%rbp), %rdi
callq 0x3100
leaq -0x190(%rbp), %rdi
callq 0x3100
leaq -0x1b0(%rbp), %rdi
jmp 0xcbf1
jmp 0xcc06
jmp 0xcc06
jmp 0xcb98
jmp 0xcc06
jmp 0xcb98
movq %rax, %rbx
leaq -0x418(%rbp), %rdi
callq 0x3170
jmp 0xcc09
jmp 0xcc06
movq %rax, %rbx
leaq -0x1f0(%rbp), %rdi
jmp 0xcbf1
movq %rax, %rbx
leaq -0x210(%rbp), %rdi
jmp 0xcbf1
movq %rax, %rbx
leaq -0x230(%rbp), %rdi
jmp 0xcbf1
movq %rax, %rbx
leaq -0x250(%rbp), %rdi
jmp 0xcbf1
movq %rax, %rbx
leaq -0x290(%rbp), %rdi
jmp 0xcbf1
movq %rax, %rbx
leaq -0x270(%rbp), %rdi
callq 0x3100
jmp 0xcc09
jmp 0xcc06
jmp 0xcc06
jmp 0xcc06
jmp 0xcc06
jmp 0xcc06
jmp 0xcc06
jmp 0xcc06
movq %rax, %rbx
leaq -0x6a8(%rbp), %rdi
callq 0x32e0
leaq -0x70(%rbp), %rdi
callq 0x3100
leaq -0x90(%rbp), %rdi
callq 0x3100
leaq -0xb0(%rbp), %rdi
callq 0x3100
leaq -0xd0(%rbp), %rdi
callq 0x3100
leaq -0xf0(%rbp), %rdi
callq 0x3100
leaq -0x110(%rbp), %rdi
callq 0x3100
leaq -0x170(%rbp), %rdi
callq 0x3100
leaq -0x130(%rbp), %rdi
callq 0x3100
leaq -0x150(%rbp), %rdi
callq 0x3100
movq %rbx, %rdi
callq 0x3370