// File: hyp1231[P]FMSS/main.cpp
// Function: exec_opt(FileSystem&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>&)
bool exec_opt(FileSystem& S, vector<string>& opt) {
	if(opt.empty()) { return true; }
	bool flag = true; string str;
	switch(string_to_enum[opt[0]]) {
		case _help:			// help
			S.Help(); break;
		case _exit:			// exit
			flag = false; break;
        case _create:       // touch
            S.CreateFile(opt[1]); break;
        case _delete:       // rm
        	if((int)opt.size() > 2) {
        		S.DeleteFile(opt[2], opt[1]);
        	} else {
        		S.DeleteFile(opt[1]);
        	}
            break;
        case _list:         // ls
            if ((int)opt.size() > 2) {
                cout << "[Error] Too many parameters in command \"ls\"" << endl;
                S.Help();
            } else if((int)opt.size() == 2) {	// -a or -l
            	S.ListFile(opt[1]);
            } else {					// none
            	S.ListFile();
            } 
            break;
        case _move:			// mv
        	S.MoveFile(opt[1], opt[2]); break;
        case _print:		// cat
        	S.PrintFile(opt[1]); break;
        case _write:		// echo
        	if(opt.size() != 4 || opt[2] != ">") {
        		cout << "[Error] Illegal param" << endl;
        		break;
        	}
        	S.WriteFile(opt[1], opt[3]); break;
        case _mkdir:        // mkdir
            S.CreateDir(opt[1]); break;
        case _cd:           // cd
            if ((int)opt.size() < 2) {
                cout << "[Error] Directory path should be provided" << endl;
                cout << "cd [dirpath]" << endl;
                break;
            }
            S.OpenDir(opt[1]); break;
        case _copy:			// cp
        	S.CopyFile(opt[1], opt[2]); break;
		case undefined_opt:	// unknowned
			cout << "[Error] Unknown option" << endl; break;
		default: break;
	}
	return flag;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1b0, %rsp            # imm = 0x1B0
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x18(%rbp), %rdi
callq 0x92e0
testb $0x1, %al
jne 0xbbe2
jmp 0xbbeb
movb $0x1, -0x1(%rbp)
jmp 0xc20a
movb $0x1, -0x19(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x33e0
movq -0x18(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x9350
movq %rax, %rsi
leaq 0x96a1(%rip), %rdi      # 0x152b0
callq 0xcab0
movq %rax, -0xe8(%rbp)
jmp 0xbc1d
movq -0xe8(%rbp), %rax
movl (%rax), %eax
movq %rax, -0xf0(%rbp)
subq $0xb, %rax
ja 0xc1ea
movq -0xf0(%rbp), %rax
leaq 0x3b03(%rip), %rcx      # 0xf748
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0xc1ff
movq -0x10(%rbp), %rdi
callq 0x4980
jmp 0xbc6a
jmp 0xc1ec
movb $0x0, -0x19(%rbp)
jmp 0xc1ec
movq -0x10(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq -0xf8(%rbp), %rdi
movq %rax, %rsi
callq 0x5bf0
jmp 0xbca2
jmp 0xc1ec
movq -0x18(%rbp), %rdi
callq 0x9370
cmpl $0x2, %eax
jle 0xbd32
movq -0x10(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x18(%rbp), %rdi
movl $0x2, %esi
callq 0x9350
movq %rax, -0x100(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq %rax, %rsi
leaq -0x70(%rbp), %rdi
callq 0x30f0
jmp 0xbcf1
movq -0x100(%rbp), %rsi
movq -0x108(%rbp), %rdi
leaq -0x70(%rbp), %rdx
callq 0x5f50
jmp 0xbd0a
leaq -0x70(%rbp), %rdi
callq 0x3160
jmp 0xbdee
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x3160
jmp 0xc1ff
movq -0x10(%rbp), %rax
movq %rax, -0x120(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq %rax, -0x118(%rbp)
leaq -0x91(%rbp), %rdi
movq %rdi, -0x110(%rbp)
callq 0x34a0
movq -0x110(%rbp), %rdx
leaq 0x38d9(%rip), %rsi      # 0xf64c
leaq -0x90(%rbp), %rdi
callq 0x3c50
jmp 0xbd81
movq -0x118(%rbp), %rsi
movq -0x120(%rbp), %rdi
leaq -0x90(%rbp), %rdx
callq 0x5f50
jmp 0xbd9d
leaq -0x90(%rbp), %rdi
callq 0x3160
leaq -0x91(%rbp), %rdi
callq 0x32d0
jmp 0xbdee
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0xbddd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x90(%rbp), %rdi
callq 0x3160
leaq -0x91(%rbp), %rdi
callq 0x32d0
jmp 0xc1ff
jmp 0xc1ec
movq -0x18(%rbp), %rdi
callq 0x9370
cmpl $0x2, %eax
jle 0xbe42
movq 0x91c8(%rip), %rdi      # 0x14fd0
leaq 0x396c(%rip), %rsi      # 0xf77b
callq 0x3250
movq %rax, -0x128(%rbp)
jmp 0xbe1d
movq -0x128(%rbp), %rdi
movq 0x9195(%rip), %rsi      # 0x14fc0
callq 0x32a0
jmp 0xbe32
movq -0x10(%rbp), %rdi
callq 0x4980
jmp 0xbe3d
jmp 0xbf5f
movq -0x18(%rbp), %rdi
callq 0x9370
cmpl $0x2, %eax
jne 0xbebd
movq -0x10(%rbp), %rax
movq %rax, -0x130(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq %rax, %rsi
leaq -0xb8(%rbp), %rdi
callq 0x30f0
jmp 0xbe7a
movq -0x130(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
callq 0x6840
jmp 0xbe8f
leaq -0xb8(%rbp), %rdi
callq 0x3160
jmp 0xbf5d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0x3160
jmp 0xc1ff
movq -0x10(%rbp), %rax
movq %rax, -0x140(%rbp)
leaq -0xd9(%rbp), %rdi
movq %rdi, -0x138(%rbp)
callq 0x34a0
movq -0x138(%rbp), %rdx
leaq 0x3763(%rip), %rsi      # 0xf64c
leaq -0xd8(%rbp), %rdi
callq 0x3c50
jmp 0xbef7
movq -0x140(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
callq 0x6840
jmp 0xbf0c
leaq -0xd8(%rbp), %rdi
callq 0x3160
leaq -0xd9(%rbp), %rdi
callq 0x32d0
jmp 0xbf5d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0xbf4c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0x3160
leaq -0xd9(%rbp), %rdi
callq 0x32d0
jmp 0xc1ff
jmp 0xbf5f
jmp 0xc1ec
movq -0x10(%rbp), %rax
movq %rax, -0x150(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq %rax, -0x148(%rbp)
movq -0x18(%rbp), %rdi
movl $0x2, %esi
callq 0x9350
movq -0x150(%rbp), %rdi
movq -0x148(%rbp), %rsi
movq %rax, %rdx
callq 0x8b30
jmp 0xbfaa
jmp 0xc1ec
movq -0x10(%rbp), %rax
movq %rax, -0x158(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq -0x158(%rbp), %rdi
movq %rax, %rsi
callq 0x8dc0
jmp 0xbfd9
jmp 0xc1ec
movq -0x18(%rbp), %rdi
callq 0x9370
cmpq $0x4, %rax
jne 0xc01e
movq -0x18(%rbp), %rdi
movl $0x2, %esi
callq 0x9350
movq %rax, %rdi
leaq 0x35d5(%rip), %rsi      # 0xf5da
callq 0x94b0
movb %al, -0x159(%rbp)
jmp 0xc012
movb -0x159(%rbp), %al
testb $0x1, %al
jne 0xc01e
jmp 0xc054
movq 0x8fab(%rip), %rdi      # 0x14fd0
leaq 0x377b(%rip), %rsi      # 0xf7a7
callq 0x3250
movq %rax, -0x168(%rbp)
jmp 0xc03a
movq -0x168(%rbp), %rdi
movq 0x8f78(%rip), %rsi      # 0x14fc0
callq 0x32a0
jmp 0xc04f
jmp 0xc1ec
movq -0x10(%rbp), %rax
movq %rax, -0x178(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq %rax, -0x170(%rbp)
movq -0x18(%rbp), %rdi
movl $0x3, %esi
callq 0x9350
movq -0x178(%rbp), %rdi
movq -0x170(%rbp), %rsi
movq %rax, %rdx
callq 0x8fb0
jmp 0xc09a
jmp 0xc1ec
movq -0x10(%rbp), %rax
movq %rax, -0x180(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq -0x180(%rbp), %rdi
movq %rax, %rsi
callq 0x7000
jmp 0xc0c9
jmp 0xc1ec
movq -0x18(%rbp), %rdi
callq 0x9370
cmpl $0x2, %eax
jge 0xc143
movq 0x8eed(%rip), %rdi      # 0x14fd0
leaq 0x36d3(%rip), %rsi      # 0xf7bd
callq 0x3250
movq %rax, -0x188(%rbp)
jmp 0xc0f8
movq -0x188(%rbp), %rdi
movq 0x8eba(%rip), %rsi      # 0x14fc0
callq 0x32a0
jmp 0xc10d
movq 0x8ebc(%rip), %rdi      # 0x14fd0
leaq 0x36cc(%rip), %rsi      # 0xf7e7
callq 0x3250
movq %rax, -0x190(%rbp)
jmp 0xc129
movq -0x190(%rbp), %rdi
movq 0x8e89(%rip), %rsi      # 0x14fc0
callq 0x32a0
jmp 0xc13e
jmp 0xc1ec
movq -0x10(%rbp), %rax
movq %rax, -0x198(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq -0x198(%rbp), %rdi
movq %rax, %rsi
callq 0x7360
jmp 0xc16d
jmp 0xc1ec
movq -0x10(%rbp), %rax
movq %rax, -0x1a8(%rbp)
movq -0x18(%rbp), %rdi
movl $0x1, %esi
callq 0x9350
movq %rax, -0x1a0(%rbp)
movq -0x18(%rbp), %rdi
movl $0x2, %esi
callq 0x9350
movq -0x1a8(%rbp), %rdi
movq -0x1a0(%rbp), %rsi
movq %rax, %rdx
callq 0x8210
jmp 0xc1b5
jmp 0xc1ec
movq 0x8e12(%rip), %rdi      # 0x14fd0
leaq 0x362f(%rip), %rsi      # 0xf7f4
callq 0x3250
movq %rax, -0x1b0(%rbp)
jmp 0xc1d3
movq -0x1b0(%rbp), %rdi
movq 0x8ddf(%rip), %rsi      # 0x14fc0
callq 0x32a0
jmp 0xc1e8
jmp 0xc1ec
jmp 0xc1ec
movb -0x19(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x3160
jmp 0xc20a
leaq -0x40(%rbp), %rdi
callq 0x3160
jmp 0xc218
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x1b0, %rsp            # imm = 0x1B0
popq %rbp
retq
movq -0x48(%rbp), %rdi
callq 0x3490
nopw %cs:(%rax,%rax)