// File: Ciaxur[P]yagb-emu/include/imgui/imgui.cpp
// Function: ImGui::UpdateMouseWheel()
void ImGui::UpdateMouseWheel()
{
    ImGuiContext& g = *GImGui;

    // Reset the locked window if we move the mouse or after the timer elapses
    if (g.WheelingWindow != NULL)
    {
        g.WheelingWindowTimer -= g.IO.DeltaTime;
        if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold)
            g.WheelingWindowTimer = 0.0f;
        if (g.WheelingWindowTimer <= 0.0f)
        {
            g.WheelingWindow = NULL;
            g.WheelingWindowTimer = 0.0f;
        }
    }

    if (g.IO.MouseWheel == 0.0f && g.IO.MouseWheelH == 0.0f)
        return;

    if ((g.ActiveId != 0 && g.ActiveIdUsingMouseWheel) || (g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrameUsingMouseWheel))
        return;

    ImGuiWindow* window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow;
    if (!window || window->Collapsed)
        return;

    // Zoom / Scale window
    // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned.
    if (g.IO.MouseWheel != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling)
    {
        StartLockWheelingWindow(window);
        const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
        const float scale = new_font_scale / window->FontWindowScale;
        window->FontWindowScale = new_font_scale;
        if (!(window->Flags & ImGuiWindowFlags_ChildWindow))
        {
            const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;
            SetWindowPos(window, window->Pos + offset, 0);
            window->Size = ImFloor(window->Size * scale);
            window->SizeFull = ImFloor(window->SizeFull * scale);
        }
        return;
    }

    // Mouse wheel scrolling
    // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent

    // Vertical Mouse Wheel scrolling
    const float wheel_y = (g.IO.MouseWheel != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f;
    if (wheel_y != 0.0f && !g.IO.KeyCtrl)
    {
        StartLockWheelingWindow(window);
        while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))))
            window = window->ParentWindow;
        if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))
        {
            float max_step = window->InnerRect.GetHeight() * 0.67f;
            float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step));
            SetScrollY(window, window->Scroll.y - wheel_y * scroll_step);
        }
    }

    // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held
    const float wheel_x = (g.IO.MouseWheelH != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheelH : (g.IO.MouseWheel != 0.0f && g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f;
    if (wheel_x != 0.0f && !g.IO.KeyCtrl)
    {
        StartLockWheelingWindow(window);
        while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.x == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))))
            window = window->ParentWindow;
        if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))
        {
            float max_step = window->InnerRect.GetWidth() * 0.67f;
            float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step));
            SetScrollX(window, window->Scroll.x - wheel_x * scroll_step);
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq 0x143a2e(%rip), %rax    # 0x212f40
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
cmpq $0x0, 0x1b08(%rax)
je 0xcf5f4
movq -0x8(%rbp), %rax
movss 0x18(%rax), %xmm1
movq -0x8(%rbp), %rax
movss 0x1b18(%rax), %xmm0
subss %xmm1, %xmm0
movss %xmm0, 0x1b18(%rax)
xorl %eax, %eax
movl %eax, %edi
callq 0xcb710
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x81(%rbp)
jne 0xcf563
jmp 0xcf5a9
movq -0x8(%rbp), %rsi
movq %rsi, %rdi
addq $0x128, %rdi            # imm = 0x128
addq $0x1b10, %rsi           # imm = 0x1B10
callq 0xc3c00
movlpd %xmm0, -0x10(%rbp)
leaq -0x10(%rbp), %rdi
callq 0xc3bc0
movq -0x8(%rbp), %rax
movss 0x38(%rax), %xmm1
movq -0x8(%rbp), %rax
mulss 0x38(%rax), %xmm1
ucomiss %xmm1, %xmm0
seta %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
testb $0x1, %al
jne 0xcf5b5
jmp 0xcf5c4
movq -0x8(%rbp), %rax
xorps %xmm0, %xmm0
movss %xmm0, 0x1b18(%rax)
movq -0x8(%rbp), %rax
xorps %xmm0, %xmm0
ucomiss 0x1b18(%rax), %xmm0
jb 0xcf5f2
movq -0x8(%rbp), %rax
movq $0x0, 0x1b08(%rax)
movq -0x8(%rbp), %rax
xorps %xmm0, %xmm0
movss %xmm0, 0x1b18(%rax)
jmp 0xcf5f4
movq -0x8(%rbp), %rax
movss 0x138(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcf625
jp 0xcf625
movq -0x8(%rbp), %rax
movss 0x13c(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcf625
jp 0xcf625
jmp 0xcfc51
movq -0x8(%rbp), %rax
cmpl $0x0, 0x1b30(%rax)
je 0xcf63f
movq -0x8(%rbp), %rax
testb $0x1, 0x1b42(%rax)
jne 0xcf659
movq -0x8(%rbp), %rax
cmpl $0x0, 0x1b20(%rax)
je 0xcf65e
movq -0x8(%rbp), %rax
testb $0x1, 0x1b26(%rax)
je 0xcf65e
jmp 0xcfc51
movq -0x8(%rbp), %rax
cmpq $0x0, 0x1b08(%rax)
je 0xcf680
movq -0x8(%rbp), %rax
movq 0x1b08(%rax), %rax
movq %rax, -0x90(%rbp)
jmp 0xcf692
movq -0x8(%rbp), %rax
movq 0x1ae8(%rax), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0xcf6b1
movq -0x18(%rbp), %rax
testb $0x1, 0x91(%rax)
je 0xcf6b6
jmp 0xcfc51
movq -0x8(%rbp), %rax
movss 0x138(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcf6d1
jp 0xcf6d1
jmp 0xcf878
movq -0x8(%rbp), %rax
testb $0x1, 0x140(%rax)
je 0xcf878
movq -0x8(%rbp), %rax
testb $0x1, 0xb4(%rax)
je 0xcf878
movq -0x18(%rbp), %rdi
callq 0xe5320
movq -0x18(%rbp), %rax
movss 0x2b0(%rax), %xmm1
movq -0x8(%rbp), %rax
movss 0x138(%rax), %xmm0
movss 0xa3060(%rip), %xmm2    # 0x17277c
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss 0xa28ac(%rip), %xmm1    # 0x171fd8
movss 0xa2888(%rip), %xmm2    # 0x171fbc
callq 0xe5390
movss %xmm0, -0x1c(%rbp)
movss -0x1c(%rbp), %xmm0
movq -0x18(%rbp), %rax
divss 0x2b0(%rax), %xmm0
movss %xmm0, -0x20(%rbp)
movss -0x1c(%rbp), %xmm0
movq -0x18(%rbp), %rax
movss %xmm0, 0x2b0(%rax)
movq -0x18(%rbp), %rax
movl 0xc(%rax), %eax
andl $0x1000000, %eax        # imm = 0x1000000
cmpl $0x0, %eax
jne 0xcf873
movq -0x18(%rbp), %rdi
addq $0x18, %rdi
movss -0x20(%rbp), %xmm1
movss 0xa14ad(%rip), %xmm0    # 0x170c3c
subss %xmm1, %xmm0
callq 0xc2f50
movlpd %xmm0, -0x38(%rbp)
movq -0x8(%rbp), %rdi
addq $0x128, %rdi            # imm = 0x128
movq -0x18(%rbp), %rsi
addq $0x10, %rsi
callq 0xc3c00
movlpd %xmm0, -0x40(%rbp)
leaq -0x38(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0xd7510
movlpd %xmm0, -0x30(%rbp)
movq -0x18(%rbp), %rsi
addq $0x18, %rsi
leaq -0x30(%rbp), %rdi
callq 0xe53f0
movlpd %xmm0, -0x28(%rbp)
movq -0x18(%rbp), %rdi
movq %rdi, -0x98(%rbp)
addq $0x10, %rdi
leaq -0x28(%rbp), %rsi
callq 0xc41b0
movq -0x98(%rbp), %rdi
movlpd %xmm0, -0x48(%rbp)
leaq -0x48(%rbp), %rsi
xorl %edx, %edx
callq 0xcb810
movq -0x18(%rbp), %rdi
addq $0x18, %rdi
movss -0x20(%rbp), %xmm0
callq 0xc2f50
movlpd %xmm0, -0x58(%rbp)
leaq -0x58(%rbp), %rdi
callq 0xc2f10
movlpd %xmm0, -0x50(%rbp)
movq -0x18(%rbp), %rax
movq -0x50(%rbp), %rcx
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rdi
addq $0x20, %rdi
movss -0x20(%rbp), %xmm0
callq 0xc2f50
movlpd %xmm0, -0x68(%rbp)
leaq -0x68(%rbp), %rdi
callq 0xc2f10
movlpd %xmm0, -0x60(%rbp)
movq -0x18(%rbp), %rax
movq -0x60(%rbp), %rcx
movq %rcx, 0x20(%rax)
jmp 0xcfc51
movq -0x8(%rbp), %rax
movss 0x138(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcf890
jp 0xcf890
jmp 0xcf8b3
movq -0x8(%rbp), %rax
testb $0x1, 0x141(%rax)
jne 0xcf8b3
movq -0x8(%rbp), %rax
movss 0x138(%rax), %xmm0
movss %xmm0, -0x9c(%rbp)
jmp 0xcf8c0
xorps %xmm0, %xmm0
movss %xmm0, -0x9c(%rbp)
jmp 0xcf8c0
movss -0x9c(%rbp), %xmm0
movss %xmm0, -0x6c(%rbp)
movss -0x6c(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcf8e1
jp 0xcf8e1
jmp 0xcfa3f
movq -0x8(%rbp), %rax
testb $0x1, 0x140(%rax)
jne 0xcfa3f
movq -0x18(%rbp), %rdi
callq 0xe5320
movq -0x18(%rbp), %rax
movl 0xc(%rax), %ecx
andl $0x1000000, %ecx        # imm = 0x1000000
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0x9d(%rbp)
je 0xcf97b
movq -0x18(%rbp), %rax
movss 0x68(%rax), %xmm0
movb $0x1, %al
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
movb %al, -0x9e(%rbp)
jne 0xcf932
jp 0xcf932
jmp 0xcf96f
movq -0x18(%rbp), %rax
movl 0xc(%rax), %ecx
andl $0x10, %ecx
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0x9f(%rbp)
je 0xcf963
movq -0x18(%rbp), %rax
movl 0xc(%rax), %eax
andl $0x200, %eax            # imm = 0x200
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x9f(%rbp)
movb -0x9f(%rbp), %al
movb %al, -0x9e(%rbp)
movb -0x9e(%rbp), %al
movb %al, -0x9d(%rbp)
movb -0x9d(%rbp), %al
testb $0x1, %al
jne 0xcf987
jmp 0xcf99b
movq -0x18(%rbp), %rax
movq 0x388(%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0xcf8fb
movq -0x18(%rbp), %rax
movl 0xc(%rax), %eax
andl $0x10, %eax
cmpl $0x0, %eax
jne 0xcfa3d
movq -0x18(%rbp), %rax
movl 0xc(%rax), %eax
andl $0x200, %eax            # imm = 0x200
cmpl $0x0, %eax
jne 0xcfa3d
movq -0x18(%rbp), %rdi
addq $0x218, %rdi            # imm = 0x218
callq 0xeb860
movss 0xa2da9(%rip), %xmm1    # 0x172780
mulss %xmm1, %xmm0
movss %xmm0, -0x70(%rbp)
movq -0x18(%rbp), %rdi
callq 0xebbf0
movaps %xmm0, %xmm1
movss 0xa2d5c(%rip), %xmm0    # 0x172750
mulss %xmm1, %xmm0
movss -0x70(%rbp), %xmm1
callq 0xc4620
callq 0xc2f90
movss %xmm0, -0x74(%rbp)
movq -0x18(%rbp), %rdi
movq -0x18(%rbp), %rax
movss 0x60(%rax), %xmm1
movss -0x6c(%rbp), %xmm0
movss -0x74(%rbp), %xmm2
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
callq 0xdd920
jmp 0xcfa3f
movq -0x8(%rbp), %rax
movss 0x13c(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcfa57
jp 0xcfa57
jmp 0xcfa7a
movq -0x8(%rbp), %rax
testb $0x1, 0x141(%rax)
jne 0xcfa7a
movq -0x8(%rbp), %rax
movss 0x13c(%rax), %xmm0
movss %xmm0, -0xa4(%rbp)
jmp 0xcfad2
movq -0x8(%rbp), %rax
movss 0x138(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcfa92
jp 0xcfa92
jmp 0xcfab5
movq -0x8(%rbp), %rax
testb $0x1, 0x141(%rax)
je 0xcfab5
movq -0x8(%rbp), %rax
movss 0x138(%rax), %xmm0
movss %xmm0, -0xa8(%rbp)
jmp 0xcfac2
xorps %xmm0, %xmm0
movss %xmm0, -0xa8(%rbp)
jmp 0xcfac2
movss -0xa8(%rbp), %xmm0
movss %xmm0, -0xa4(%rbp)
movss -0xa4(%rbp), %xmm0
movss %xmm0, -0x78(%rbp)
movss -0x78(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0xcfaf3
jp 0xcfaf3
jmp 0xcfc51
movq -0x8(%rbp), %rax
testb $0x1, 0x140(%rax)
jne 0xcfc51
movq -0x18(%rbp), %rdi
callq 0xe5320
movq -0x18(%rbp), %rax
movl 0xc(%rax), %ecx
andl $0x1000000, %ecx        # imm = 0x1000000
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0xa9(%rbp)
je 0xcfb8d
movq -0x18(%rbp), %rax
movss 0x64(%rax), %xmm0
movb $0x1, %al
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
movb %al, -0xaa(%rbp)
jne 0xcfb44
jp 0xcfb44
jmp 0xcfb81
movq -0x18(%rbp), %rax
movl 0xc(%rax), %ecx
andl $0x10, %ecx
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, -0xab(%rbp)
je 0xcfb75
movq -0x18(%rbp), %rax
movl 0xc(%rax), %eax
andl $0x200, %eax            # imm = 0x200
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0xab(%rbp)
movb -0xab(%rbp), %al
movb %al, -0xaa(%rbp)
movb -0xaa(%rbp), %al
movb %al, -0xa9(%rbp)
movb -0xa9(%rbp), %al
testb $0x1, %al
jne 0xcfb99
jmp 0xcfbad
movq -0x18(%rbp), %rax
movq 0x388(%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0xcfb0d
movq -0x18(%rbp), %rax
movl 0xc(%rax), %eax
andl $0x10, %eax
cmpl $0x0, %eax
jne 0xcfc4f
movq -0x18(%rbp), %rax
movl 0xc(%rax), %eax
andl $0x200, %eax            # imm = 0x200
cmpl $0x0, %eax
jne 0xcfc4f
movq -0x18(%rbp), %rdi
addq $0x218, %rdi            # imm = 0x218
callq 0xeb840
movss 0xa2b97(%rip), %xmm1    # 0x172780
mulss %xmm1, %xmm0
movss %xmm0, -0x7c(%rbp)
movq -0x18(%rbp), %rdi
callq 0xebbf0
movaps %xmm0, %xmm1
movss 0xa23c6(%rip), %xmm0    # 0x171fcc
mulss %xmm1, %xmm0
movss -0x7c(%rbp), %xmm1
callq 0xc4620
callq 0xc2f90
movss %xmm0, -0x80(%rbp)
movq -0x18(%rbp), %rdi
movq -0x18(%rbp), %rax
movss 0x5c(%rax), %xmm1
movss -0x78(%rbp), %xmm0
movss -0x80(%rbp), %xmm2
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
callq 0xdd8e0
jmp 0xcfc51
addq $0xb0, %rsp
popq %rbp
retq
nopw (%rax,%rax)