============================== Sample 1 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined device_added() PUSH R13 MOV RDI,RSI PUSH R12 MOV R12,RDX PUSH RBP MOV RBP,RSI CALL .plt:::nm_device_get_iface ;undefined nm_device_get_iface() LEA RSI,[.rodata:s_%s:_device_created_0019389e] ;= "%s: device created\n" LEA RDI,[.rodata:s_NetworkManager_0018910e] ;= "NetworkManager" MOV R13,RAX CALL .plt:::g_dgettext ;undefined g_dgettext() MOV RSI,R13 MOV RDI,RAX XOR EAX,EAX CALL .plt:::g_print ;undefined g_print() MOV RCX,R12 MOV RDI,RBP XOR R9D,R9D ADD dword ptr [R12 + 0x38],0x1 XOR R8D,R8D LEA RDX,[device_state] LEA RSI,[.rodata:s_notify::state_0018b29c] ;= "notify::state" CALL .plt:::g_signal_connect_data ;undefined g_signal_connect_data() MOV RCX,R12 MOV RDI,RBP XOR R9D,R9D POP RBP XOR R8D,R8D POP R12 LEA RDX,[device_ac] LEA RSI,[.rodata:s_notify::active-connection_001938b2] ;= "notify::active-connection" POP R13 JMP .plt:::g_signal_connect_data ;undefined g_signal_connect_data() ?? 90h Actual src: static void device_added(NMClient *client, NMDevice *device, NmCli *nmc) { g_print(_("%s: device created\n"), nm_device_get_iface(device)); device_watch(nmc, NM_DEVICE(device)); } Predicted src: static void on_device_notify(GObject *object, GAsyncResult *result, gpointer user_data) { g_assert(NM_IS_DEVICE(user_data)); g_assert(NM_IS_DEVICE(user_data)); g_assert(NM_IS_DEVICE(user_data)); g_assert(NM_IS_DEVICE(user_data)); g_assert(NM_IS_DEVICE(result)); g_assert(NM_IS_DEVICE(result)); g_assert(NM_IS_DEVICE(result)); g_assert(NM_IS_DEVICE(result)); g_assert(NM_IS_DEVICE(result)); g_assert(NM_IS_DEVICE(result)); g_assert(NM_DEVICE(result)); g_assert(NM_IS_DEVICE(result)); g_assert(NM_DEVICE(result)); g_assert(NM_DEVICE(result)); } ============================== Sample 2 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined gfal2_bring_online_poll_list() PUSH R14 MOV R14,RCX PUSH R13 MOV R13D,ESI MOV RSI,R8 PUSH R12 MOV R12,RDX PUSH RBP MOV RBP,RDI PUSH RBX MOV RBX,R8 CALL .plt:gfal2_start_scope_cancel ;undefined gfal2_start_scope_cancel() TEST EAX,EAX JS LAB_0011121e TEST R12,R12 JZ LAB_001111c8 CMP qword ptr [R12],0x0 JZ LAB_001111c8 TEST RBP,RBP JZ LAB_001111c8 MOV RDX,R12 MOV R8,RBX MOV RCX,R14 MOV ESI,R13D MOV RDI,RBP CALL .plt:gfal_plugin_bring_online_poll_listG ;undefined gfal_plugin_bring_online_p... MOV R12D,EAX JMP LAB_0011120a ?? 0Fh ?? 1Fh ?? 80h ?? 00h ?? 00h ?? 00h ?? 00h LAB_001111c8: TEST R13D,R13D JLE LAB_00111204 LEA EAX,[R13 + -0x1] LEA R12,[.rodata:s_context_or/and_urls_are_incorrec_00117e00] ;= "context or/and urls are incorrect... LEA R13,[RBX + RAX*0x8 + 0x8] NOP dword ptr [RAX] LAB_001111e0: XOR EAX,EAX CALL .plt:gfal2_get_core_quark ;undefined gfal2_get_core_quark() MOV RDI,RBX MOV RCX=>.rodata:s_context_or/and_urls_are_incorrec_00117e00,R12 ;= "context or/and urls are incorrect... MOV EDX,0xe MOV ESI,EAX ADD RBX,0x8 XOR EAX,EAX CALL .plt:::g_set_error ;undefined g_set_error() CMP RBX,R13 JNZ LAB_001111e0 LAB_00111204: MOV R12D,0xffffffff LAB_0011120a: MOV RDI,RBP CALL .plt:gfal2_end_scope_cancel ;undefined gfal2_end_scope_cancel() LAB_00111212: POP RBX MOV EAX,R12D POP RBP POP R12 POP R13 POP R14 RET LAB_0011121e: MOV R12D,0xffffffff JMP LAB_00111212 ?? 66h f Actual src: int gfal2_bring_online_poll_list(gfal2_context_t context, int nbfiles, const char *const *urls, const char *token, GError **errors) { int res = -1; GFAL2_BEGIN_SCOPE_CANCEL(context, -1, errors); if (urls == NULL || *urls == NULL || context == NULL) { int i; for (i = 0; i < nbfiles; ++i) { g_set_error(&errors[i], gfal2_get_core_quark(), EFAULT, "context or/and urls are incorrect arguments"); } res = -1; } else { res = gfal_plugin_bring_online_poll_listG(context, nbfiles, urls, token, errors); } GFAL2_END_SCOPE_CANCEL(context); return res; } Predicted src: int g_list_start_func (G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSEDUNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSEDUNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSEDUNUSED G_GNUC_UNUSEDUNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_UNUSED G_GNUC_UNUSEDUNUSEDUNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSED G_GNUC_UNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSED G_GNUC_UNUSEDUNUSED G_GNUC_UNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSED G_GNUC_UNUSEDUNUSED G_UNUSED G_GNUC_UNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSED G_UNUSEDUNUSED G_GNUC_UNUSEDUNUSEDUNUSED G_GNUC_UNUSED G_GNUC_UNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_UNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSED G_UNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSED G_GNUC_GNUC_UNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSEDUNUSE ============================== Sample 3 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined op_edc0_22_ff() PUSH RBX MOV EBX,EDI MOV EDI,0x2 MOV dword ptr [.bss:OpcodeFamily],0x5d AND EBX,0x7 MOV dword ptr [.bss:CurrentInstrCycles],0x8 CALL get_word_030_prefetch ;undefined get_word_030_prefetch() MOV ESI,EAX TEST AH,0x8 JZ LAB_009bbe18 SAR AX,0x6 LEA R9,[.bss:regs] AND EAX,0x7 MOV EDX,dword ptr [R9 + RAX*0x4]=>.bss:regs MOV ECX,EDX AND ECX,0x1f LAB_009bbd46: TEST SIL,0x20 JZ LAB_009bbe00 MOV EAX,ESI AND EAX,0x7 MOV R8D,dword ptr [R9 + RAX*0x4]=>.bss:regs SUB R8D,0x1 AND R8D,0x1f ADD R8D,0x1 LAB_009bbd65: MOV EAX,dword ptr [R9 + RBX*0x4]=>.bss:regs ROL EAX,CL MOV ECX,0x20 MOV EDI,EAX SHR EAX,0x1f SUB ECX,R8D SHL EAX,0xf SHR EDI,CL MOV ECX,EAX MOV EAX,dword ptr [.bss:regflags] AND AH,0x3f OR EAX,ECX XOR ECX,ECX TEST EDI,EDI SETZ CL SHL ECX,0xe OR EAX,ECX LEA ECX,[R8 + -0x1] AND EAX,0xfffffefe MOV dword ptr [.bss:regflags],EAX MOV EAX,0x1 SHL EAX,CL TEST EAX,EAX JNZ LAB_009bbdbf JMP LAB_009bbdc3 ?? 66h f ?? 0Fh ?? 1Fh ?? 44h D ?? 00h ?? 00h LAB_009bbdb8: ADD EDX,0x1 SHR EAX,1 JZ LAB_009bbdc3 LAB_009bbdbf: TEST EDI,EAX JZ LAB_009bbdb8 LAB_009bbdc3: SAR SI,0xc MOV EAX,dword ptr [.bss:regs[188]] MOV EDI,0x4 AND ESI,0x7 MOV dword ptr [R9 + RSI*0x4]=>.bss:regs,EDX MOV dword ptr [.bss:regs[184]],EAX CALL get_word_030_prefetch ;undefined get_word_030_prefetch() ADD dword ptr [.bss:regs[64]],0x4 POP RBX MOV word ptr [.bss:regs[104]],AX MOV EAX,0x1000 RET ?? 0Fh ?? 1Fh ?? 80h ?? 00h ?? 00h ?? 00h ?? 00h LAB_009bbe00: LEA R8D,[RSI + 0x1f] AND R8D,0x1f ADD R8D,0x1 JMP LAB_009bbd65 ?? 0Fh ?? 1Fh ?? 80h ?? 00h ?? 00h ?? 00h ?? 00h LAB_009bbe18: MOV ECX,EAX LEA R9,[.bss:regs] SAR CX,0x6 AND ECX,0x1f MOV EDX,ECX JMP LAB_009bbd46 ?? 90h Actual src: uae_u32 REGPARAM2 op_edc0_22_ff(uae_u32 opcode) { int count_cycles = 0; uae_u32 real_opcode = opcode; uae_u32 dstreg = real_opcode & 7; OpcodeFamily = 93; CurrentInstrCycles = 8; uae_s16 extra = get_word_030_prefetch(2); uae_u32 bdata[2]; uae_s32 offset = extra & 0x800? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f; int width = (((extra & 0x20? m68k_dreg(regs, extra & 7) : extra) - 1) & 0x1f) + 1; uae_u32 offset2 = offset; uae_u32 tmp = m68k_dreg(regs, dstreg); offset &= 0x1f; tmp = (tmp << offset) | (tmp >> (32 - offset)); bdata[0] = tmp & ((1 << (32 - width)) - 1); SET_ALWAYS_NFLG(((uae_s32)tmp) < 0? 1 : 0); tmp >>= (32 - width); SET_ZFLG(tmp == 0); SET_VFLG(0); SET_CFLG(0); { uae_u32 mask = 1 << (width - 1); while (mask) { if (tmp & mask) break; mask >>= 1; offset2++; }} m68k_dreg(regs, (extra >> 12) & 7) = offset2; ipl_fetch(); regs.irc = get_word_030_prefetch(4); m68k_incpci(4); return (1 * 4 * CYCLE_UNIT / 2 + count_cycles) * 4; } Predicted src: uae_u32 REGPARAM2 op_e1f0_31_ff(uae_u32 opcode) { int count_cycles = 0; uae_u32 real_opcode = opcode; uae_u32 srcreg = (real_opcode & 7); uae_u32 dstreg = (real_opcode >> 9) & 7; OpcodeFamily = 30; CurrentInstrCycles = 12; uaecptr srca; m68k_incpci(2); srca = x_get_disp_ea_020(m68k_areg(regs, srcreg), 0); uae_s16 src = x_get_word(srca); uae_s16 dst = m68k_dreg(regs, dstreg); uae_u32 newv = ((uae_u16)(dst)) - ((uae_u16)(src)); int flgs = ((uae_s16)(src)) < 0; int flgo = ((uae_s16)(dst)) < 0; int flgn = ((uae_s16)(newv)) < 0; SET_ZFLG(((uae_s16)(newv)) == 0); SET_VFLG((flgs ^ flgo) & (flgn ^ flgo)); SET_CFLG(((uae_u16)(src)) > ((uae_u16)(dst))); COPY_CARRY(); SET_NFLG(flgn!= 0); ipl_fetch(); regs.irc = get_word_020_prefetch(0); return (1 * 4 * CYCLE_UNIT / 2 + count_cycles) * 4; } ============================== Sample 4 ============================== ASM: ;************************************************************************************************************************************************************ ;* HistogramDockerDock::startUpdateCanvasProjection() * ;************************************************************************************************************************************************************ ;undefined startUpdateCanvasProjection(HistogramDockerDock * this) ;this HistogramDo... RDI MOV RAX,qword ptr [this + 0x28] TEST byte ptr [RAX + 0x9],0x80 JNZ LAB_0010b110 RET ?? 0Fh ?? 1Fh ?? 44h D ?? 00h ?? 00h LAB_0010b110: MOV this,qword ptr [this + 0x48] JMP .plt:LAB_00108030 ?? 90h Actual src: void HistogramDockerDock::startUpdateCanvasProjection() { if (isVisible()) { m_imageIdleWatcher->startCountdown(); } } Predicted src: void SUpdateUpdate::startUpdate() { if (m_pUpdate) m_pUpdate->startUpdate(); } ============================== Sample 5 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined newtScrollbarSet() PUSH R12 MOV ECX,EDX PUSH RBP MOV RBP,RDI PUSH RBX MOV R12,qword ptr [RDI + 0x40] MOV EBX,dword ptr [RDI] MOV EAX,dword ptr [R12 + 0xc] TEST EAX,EAX JZ LAB_00109170 SUB EBX,0x3 IMUL EBX,ESI TEST EDX,EDX JNZ LAB_001091b0 LAB_00109162: ADD EBX,0x1 LAB_00109165: CMP dword ptr [R12],EBX JNZ LAB_00109187 LAB_0010916b: POP RBX POP RBP POP R12 RET LAB_00109170: SUB EBX,0x1 IMUL EBX,ESI TEST EDX,EDX JZ LAB_00109165 MOV EAX,EBX CDQ IDIV ECX MOV EBX,EAX CMP dword ptr [R12],EBX JZ LAB_0010916b LAB_00109187: MOV RDI,RBP XOR ESI,ESI CALL sbDrawThumb ;undefined sbDrawThumb() MOV dword ptr [R12],EBX MOV RDI,RBP POP RBX MOV ESI,0x1 POP RBP POP R12 JMP sbDrawThumb ;undefined sbDrawThumb() ?? 66h f ?? 2Eh . ?? 0Fh ?? 1Fh ?? 84h ?? 00h ?? 00h ?? 00h ?? 00h ?? 00h LAB_001091b0: MOV EAX,EBX CDQ IDIV ECX MOV EBX,EAX JMP LAB_00109162 ?? 0Fh Actual src: void newtScrollbarSet(newtComponent co, int where, int total) { struct scrollbar * sb = co->data; int new; if (sb->arrows) new = (where * (co->height - 3)) / (total? total : 1) + 1; else new = (where * (co->height - 1)) / (total? total : 1); if (new!= sb->curr) { sbDrawThumb(co, 0); sb->curr = new; sbDrawThumb(co, 1); } } Predicted src: void SetDrawDrawDrawDrawDrawDraw(DrawDraw *DrawDraw, int x, int y) { int i; for (i=0; iDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDrawDra