From 8d9cd1be410f50882733b2ac3718e58abcb670e4 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:04:59 -0400 Subject: [PATCH] GP-2418 - Added a button to add instructions to the current table --- .../Search/Search_Instruction_Patterns.htm | 23 ++-- .../images/SearchInstructionPatterns.png | Bin 36190 -> 30829 bytes ...rchInstructionPatternsInstructionTable.png | Bin 12331 -> 16677 bytes ...ructionPatternsInstructionTableToolbar.png | Bin 3181 -> 3376 bytes .../InstructionSearchPlugin.java | 6 +- .../model/InstructionSearchData.java | 104 ++++++++++++++---- .../model/InstructionTableDataObject.java | 9 +- .../ui/InstructionSearchDialog.java | 47 ++++++-- .../ui/InstructionTable.java | 26 ++++- .../ui/InstructionTableCellRenderer.java | 9 +- .../ui/SelectionScopeWidget.java | 17 +-- .../InstructionSearchTest.java | 38 ++++++- 12 files changed, 208 insertions(+), 71 deletions(-) diff --git a/Ghidra/Features/Base/src/main/help/help/topics/Search/Search_Instruction_Patterns.htm b/Ghidra/Features/Base/src/main/help/help/topics/Search/Search_Instruction_Patterns.htm index f3529298f9..6c01549e03 100644 --- a/Ghidra/Features/Base/src/main/help/help/topics/Search/Search_Instruction_Patterns.htm +++ b/Ghidra/Features/Base/src/main/help/help/topics/Search/Search_Instruction_Patterns.htm @@ -46,36 +46,39 @@

Instruction Table Toolbar

-

-  

+

+

These tools provide ways to manipulate the Instruction Table and are discussed in detail below:

diff --git a/Ghidra/Features/Base/src/main/help/help/topics/Search/images/SearchInstructionPatterns.png b/Ghidra/Features/Base/src/main/help/help/topics/Search/images/SearchInstructionPatterns.png index 106bd61756b36c0018b626f8c32fedcd7d5f050a..7f2ac1a55dca5044b59995281a401fbd8a8e2147 100644 GIT binary patch literal 30829 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 literal 36190 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 RUW@+?xtmHiGG&as{vTMOXR!bP diff --git a/Ghidra/Features/Base/src/main/help/help/topics/Search/images/SearchInstructionPatternsInstructionTable.png b/Ghidra/Features/Base/src/main/help/help/topics/Search/images/SearchInstructionPatternsInstructionTable.png index 332feed0c61e6d92ffd25da193c5969f57e09180..4df41f423b649f2a3875ab15b1b2540c3fb52146 100644 GIT binary patch literal 16677 zcmeHvcUV*Fx+jW=N>`C4AfTckEr3W9H1sMpfB~d;klu+{5Rl$G(xn9{p%%&zIX5#h|5^-I*X-cA@!tT`^4g4Mqn zR!_}a<1{_|;?#TOnX-q;E7efmLoGneFqotU?8*9hJiKQE?ZwxCVaPF4GvncXnc|TE zUf}y(dPe+7*xF9#^SH*O&(W$l?M=oK3_^?o*11uC7x%7=v8kMrQpj=d(S)H_WqRqc z70mq&gOyLo!w}b;^U{JbsMDsR$5B3>hjN1)R5E+9LUJf?o7upH#I}7DLwN7$zV=5i zby9kv+pMvIW6c4Kii09GUd$nLcCv4=hc0^5@2cjf%I#t`2v*r)iH}9YQi+KvK2nFZ zbzN^@LYun%#DF9pHY<+1cF;%8wJOwYlHRoB?P4Ypi^LACZ1tn$(OjR27c%Br^XF2=AJ?yL@2m zBDXeOt`H?XWvkHf0+z-O?{q5|7DY>?d-YSQe^LFRoC7VN7&>I4JbCi_6*Z(SE5$DSMV=$(y$Wu&b?>~Jvkc24K3zVcX3eTsXj{^~__4nGIqMC>`GsAKD^)lcAg>UvOZ z)AbaNRG*z(ubpnlCWi5Gbn<%_xi=Ohvw`uDHvLl%Yk@nA-rM0(_tnVRLn)~T8X4na zj0S++PxZeClV|2rLe$qz+%pZt@JTe#aPC`>#dB|{XqTC%tt38NjZ>fiU$}SiZG3#f zkG(08+jh1bCZ9?A*Pb<^pQ$>t+52gIX_)Yc9l|)(3@tvCacH#>u@vgy)$at8iC#Bn z3G&$^`%v^;+~++5$YECI4a3n^S;0v0xU7T{mPVSy>NL^8s^Kfhu=!Gxvp1paf$g4r zPc44QdaT`rrEJ54&AD?d+i>TlDyj<|tjuFp4YOHyO3c@pX+GzDadV}L8^Th4=9Pvg zxJ0*muD(G{cffWQiZXi#9+zN$o{B&BaT;1k^V^&Lz{Nnrr1U{R0!S{7nIfZ#h42+S z*>^l&&+~2*_lHbKNK|D{5mS-Tv4!>~aSFSvg`FJfv+Wd7G1-`*1fiJ~}vt5k>WvRhHWc zUIcp?s})S62#13Z`eSQ=i4(do5iU*e~1pn)fy#y!w2m)KpK zU}-p6WxbfJDdx5RxwhWs`R!kGEsxKo@wjNN&~Fx$kdtZI#G;WC(M2A8M?NNwLaU(b zwSId~vM~PY{#b=w>V2yG(xr;DL^D3cEyKAKukj&7=eux6R8&SrCkISmIccY6CpImE zF-Et>g`h)vZWy933Id%PNW=-7ydOHYPp-ra61G0R`iV-a1a+FxD;6PjjYvwN=mvH3 zkMolp-=Br>wA<$+TROZ?VvDlYQ&LI}n!Ybn`SFNNh-X;&2`T2Wfcd{v5p-eCiH`7f z4}x?wmv7Tl-8p(bG#qO|lwGGCG zEhV`>rtLnMbsC;FMID;M#3tyf7{Xraxwj@xBX+d69?D)MWfmKN&<$JQ%6DD`8SpJT zZG{Wf-$zkfi3zCX(F;$#7{OnyZg=|`9$;@1ovQ;br*irz_#A7$E!15jfrdsdA;k9k zpX6?d`;OVR3xb4h#y`||O0&R)p- z(DJ$sWz*XhD1__|nw<-~WRknPK74!O>&+^o4*Fsz{+6%LFUr@^?-+0I8O^T2zHyMC z_@dr4h*6t2Dckclf9_Aq`{d{La$dp6wgG#*=de{M(3)nt{~gR?vhU9`pAVY1-+y_q zR&r7FGPoK{bAU%BK^6j4cet17$IMa*&>LI%`X_P@QbnRdhMv36F+;g(ACt1<71{O1Ge+X7U8=Z! zHa_TI7>FVux)B%5b=n{+fEt}^{4`PScs#Xa#X{P>EY@U={tQIJ5<BT@}}lr)l54l)oOlzG)$nYyU9>8Gu%w5qN?vW^5QR@fY$yAumTV1f=;rT1iuJ zSjeObV$$RFiu@*Koq0UNi2VW-PGJ>d6+s5SNA}Yar55v53n`HoZHgk3THa50rTOGA z_&#j>)R(RXt*Huq%$~1V7&y0FoPE$~PG6HOF$;B!RkwmAcE$04^mJ| z*XyXvS%~?El4Qqcmbu*Z9Xx`?UegvfoV+g4!C}1MNj764_9w42y4JfZ+z3|lX1-(H zXRk)wJCOhPA}8XMQ~) zF<$UZ-o(VFc0gdq9U?tGw&h6==lR+XG<ZbM3S+UKXQWnWM4|YN`RP8|Lf;v z)|vWq__xg(N5r4|?y^3%>p<^BhV#C3nRfB!v+~yXXiKeOS1SOY)PN8yw-mZBIWN?6 zCJNY*Ms3Le6=B_LJ4Ah5rS40g<1Fh8jCu8LMdV?|l6=p85{v#Qs>nzrnq>kuGI5+J zP~*cEf^4weqBEp6kc(vk2zSN2eMeaU&$hQtvEjP{XcdUGC}bjp5J$8=cPn)Fwx+^f zbjFNkxLQ~I2+vcia_qX^?mkV~9$&wAPt7F((U|1vb9dN|{LGDb@2eBF$IZn3Kg9Nw%5v|<1Nl?!Shg^VeM)ySjLV$B(aOy+fn{*&jm1=(C?Tmb@fAxZ;2eTmzMjDf4KhI+8@)s}emihHzv^~|8vLbBFDmkZXMdp|+eWAQH_W-| zUjtvj!`m13yM%}L0?2SYyweaSKtfSFY-2A1Kck$2n3$t%F%4gz-kV^ChY?vo4gA~U z7c0YvC?IX`xFu%QouF;+{Ml!pQZqZS331LoZKiZ!BBl_eq^ELVn!Zv+?&qHr7(!G< zZvPH?2`r%`iF7v1!tx2yNkWsgOdNsRwLBZU`qBx?syTL5y4*kiTE2Bieh{C8H<+{X z`}u>@qxG4Aom!uhL+v9!lLS!l%;8QEjDud-CCXv0gJygG``0%v#X-;VdVR4At{~aw z;Q);ix3N;Q&@#IzJvQ}ExA-lG!XA4cwxwc^&1$rY)ureRBkw92cgAqoV-E9&6H-=4 zz)0oz5qt0LereT09sc;o-qi;P894-S`$=2AS@!mWzxMmRMeMECnu`kZ)J0746TXcDVy>f=0)^}}ogQnGjXmspRL zWCu+ax*s-RkHl!id}@dCG~_q8wz42adYiqlQ(pLKt@~EylQ$O~mU44C-cjk9``mQG z3}mV1DABifcJkUVJob8|xzKRB++h6k`&Wln8Z()lrQvR%$c`)QCLQsop0xy*YLuBpd+ zFs$nXF*yYeoidpoku8Px?rwgILzXImNw*AjI8>WWv*4bc`FzEkSzNNzZlu z9V-;v#_*vwat<=&&?4EaVcHxmhZXn~a)b8?jg3F;O-q@E{T40-^kki9cUAVd-)NRR z)xq|lvf@vX%{CT$sXSL3h^}+=@oq&!v|Yo=$c06KHZwx>*Izz9-8WK$O*aRq)_b`F zP#Ed8+0I&Ardg=dvh>LpVKc7z7<=ppULGk_{CV_i{;I*%|bDdlbL0P(98!e{Q7%}XY z*jy3pB%hd?TYRm08D1&WZYU)TT^Drcp+d|A>cA`gD?5TJRYi|hN*#8FA>-{Ws=!?H z08pkjQpMEnG`=I6*{n0-zp6aty_ZabaTmfKZ_T|Sd+eW#{Xqr`bLlur9SUK$teR$?Uh)t0gkrcRQa#tI zOrsJmcesIvEM#;mb?ZD3?%UaSY`|r6%7X&>y(dv@8f<0OLww0nJ1{)JQ4q<>OD!l= zP|bFR=A`;~%nBbEuiHh%l?c40fAmruU1njF-B>Gx4)>6w507K>n zipxi-ks+LoOKj;~ z2!`A)k=T$;i_zv~w2Rjf)!yf4vqlqD|^uII#SF__Ers zgxCmX*IgJ2PlH7oWM2YDu?Sa~b|;w3FF40W``CahNZv;WCu9#^!6zi;`+x~#ILe_{ z9o}Qa_F|7igKi2AbR8|1{X9O{`W?!-liqu}n7*_(NiJxMi>t&yq$F2@fMm86*JbRV zaP^3so{|K{g)X;Aq&b%aq)axr|L|N@UKl{sbewUQeX3kULZbVFx^b|?J=}!we>@8U>oB0}0&3T;!xOx>abN20C2KZWXXGPN`2p-o&NECU`DCCbes@ zj|xepnzZ~j7MrM5q1$HIN;on7oeGhNg`Di3m)Jy5;P2BI(WL6a=6gzpZ7>0JH zYkN(?1ps|LAuC}=6>}C7DV-SdTk;Y6aLwm%Vn#86H8PuFc&XE}=%bgu&pk;ZG*@fl zW-#*QGTo&;(cMR4A?#aSlVsh=?cauL&hIdlUS6(L^%mc58p&Ai6R&2Ze=-k&n;J^B z7dZ%RsJ*`Qfqhk4X!2!EyvCy$X*2nTv>Bt~?1fUuYEU#i-%{~tagX)zqph2c1=%l8 zy6Y6IF^cgFM`nmJ(bbQLhK}xTMfVAAzV(!}P`RB1Gx>wS0|!M^YQn=>5wUi-)isyy z&wOG+Y(pyP$teZFCeJ6id&fCrFV*;fmiWyd7{SVKyTFktSf|AS@Wqh08xWr_{<#A` z{1|*)uE@)Q)wc$IY)2jR#+6+zg(NyE?qSntMU>&=RF$u?End1WkZ{>BktxMdK}`GF zEKEJR;6(AtTFB@n{Pg0o7v9`4*4s+unyXvgZ9jdbO$j!cJTHG>uVcc>M$VgFFLfKt zcTkxzE!I+NQq34J>K?S%=jS>_C*=#~-j8?jBo!HG&Cak{RIGC)u_?0nkZ;mnS|nL* zOPxT)uK$YRi13<$a}(Su@>5FkymTxgp`vO;A^dKFZt=KQ{mv`(m&X1k%IvJ{UW3K# zDKIr9cF5P8cHj2ssy_e70p#e>X@hczTNC}Gs@4bd%!Z;rAq z!1i&$k2{imt=hElwMR6FWg#^j|b(%H8jZY)!S!C!QA<0Z`c$GjH2Y6 zyFV|F&&IG(n!WTWn4C^tUM%wnF6~06KVGVukW%qC_7^hwsHR%2lo2|4{WX>>KTiM7 zz$KOb`w)I9Q3he}Tt0Ir?T-w`ga-7G60)~fo!@>M)T?g&xM<$r^M2*d19%yDZ%PJJ zOl4&SJ55o~*BiXKOtQad@nP=x11%5R6&kF+~E5sDK=FHl@;;lwKa zid-HGa94=Ifd?||B}wsjg6$m4gw9NMVb?}WEFW*SIqJ>It%4c3opb&C&ExAdH)QrQ zTt}nxH3eF81#~?MmIGY`+msro<)pP8HS4H_Q9TokRvt5jgVvM8(T|rdK1rV5?vS8i zI!u+0T1K0vG}P+#!h%2ZHyW?rVZRm=b7f+qNUcNCqN%rdNV(kaQx~+nyCCB+pGEya zmnYrBK}lmUaZ_p$9j%j|wrfo5Du_d7un4-pj7bhzyE-K7rHfxO{%(Z{7$GI3dPdQV zlF!FUQ7XszZnrK~O#rAyp|{XTh_@&NE^nn^kut$x%xGYrr3S0coY7C*LMBXhEkha( zPmh}BkKtd96c;?qu!Ke?w)I=}mHZNQ1}H1{1B2qkrRs+X3tUAE!m<44C?Nbj^(`=0wLrMn2kA3svhX_X|9cPEv3-5ip>SZB?W`^*}R0M@s7A zIeDhQwUx3fJt{d)Laxi#Do30J_V}h$$_8;j!miuVpX^^ft|sk)t~#7q+Q{lne2h$7 z8|-HCSX<9Z4!>UAk`G8U?E)lchyYS*()g$x=dVT|+Q#Ka60l zE4>M}F+=?7bt>Fe{sg_U0@Q`*Q4^fA-lQ!IVVMQVEj z%v<21n?0qOe?nRS9_BUh3g7{+EAOkl9k{<*MlM%@BP=*Bv7OC~7Z^DC)w5&^?+TGU z0cT(373;hW5O7iH2{|Op7N8POUUWo#f9*8AUb!Ojs`2T6d^9lH>q49_&jBC(LjLu> z6ZHG}-<%}f1~Q%d~KmDVVE9byJDMs&9rhrs2ireBqdlPxKhJv(G1Gaw8;3 zttO?w;|Ii7qzwu@&*cFMF7imJlBB;S-46qEyvdYEqlj26Cq6GT za5YY|4R7_M$^b@0;63zLmNHU1pU_~7ViG(;I-4w3vKl&XYuOE<)_uhKfW*H~Vn4bs zIM3OkpF8<3*m!@x%KqGFo~{{Y#Pj9%^A)?aw+qp(JjlUV>+l4#WcI{8*iFcMd>vzg z@QF8wL!nw1=cZV zn+RPs>32eMWrH>=R_KErTE3WKvFBHXQAX>I-_qpCXdW5rKo8EbWXrv$^T;e%W?iX9 ze)wD|x8ntnDOrzgdRm}3v&aPBU;Pku%$76A6@5#UHa#I$X-Xj;8zh^^?THXXIl=HO zbGB!zy?u$y6E4QNPW~LYvHAV2yS>T9;3U&*o|WpbgSXC5kD2YryWJ)m^AMAbY{*=C zYqw!>reBs+7BV4cP{&H|7$FF8R8<45?%s6E3|5pL?@Q!br$y@x-hgyQnCX9T!lA2X zJ)Y?9)b_h!k{Y<8mMEF7srlr*4zFZ_wR%Jcd1s2IlBTsMyG#A_fxuju17+7nt9L^< z5uF}e6GO61&yGqjzo>?;m;p*u?`?}l-a>}=(CeMAk2|EKXAzdEc2a(1A|UoKvN3=# z{gp|0d`;ZlCVY{rnq_j5(&S6D_`do-Fo}zkW$zNtJ2Pzo1aU>>W5{u>7OkL38q|K+ zd450Sw5dC)MnE@5>WAXg@~3WF@c2#-qE526_U0ZmLRWye`vZG}gV}dl1LqY0&uHkl zlyf$QR;-dC`W;b%Eyu~a)q9FUmc*V6RatT^#7g}}CqW(yo#nMm!$8R$Ap|CsF{0=) zF(au39V^N`L0gJlACZ2iQls}Kb8sjuSpp=H95|4RpRA0MwzKSDw5Ht3m!M^06Pn9w z{e(2i;flT(%tO))pFIo~ z9|R@5Obii_i|l+(xEYC{GKtDzu`JBDvP9}YF4wGWFh78+il%;Ikx0%)Ijc!Ze{gwh z%=Mcyyw7r7H8|iv>!rGp6zeWj^3fCU*`hmc>U+uZ8U?zDwvhrjKyT8my<@ln750Wb zz>q{J&A9VkKKw*iCh6p3(sU~;@jYMm@pJ}BCV zmPe32avXbD+H=sCd7xTlxii{YanCtYch8OD1|&Bn6wWm1)B72q_THg8JI`i@65T~d zoF!{+8ncFz@DRi5IYl6!;_O`h${Og)*5(IjAZSqx7mff zu_p$OKB(`-*<1Cc*f+%>fhl+WZ?x%?S{Ov_@#j%RX8=C8Vo^JGSfMPXg+mhFejsh5 z`z@-Oj7;N5wFQ1Iaw?y&y@GSxwPY!%^C1gTu2gech3|DOdQKsTP%1bOy)ON z?^bSZcF>mb_6w`jq@*)?(A$IVgiin&D>MfergyH$3E3{g-$f40$fpVvr>Qx6)O#(T zb6g9(lU!fBn=RbU7nhDa#V86t%z&b#wz@b6Y0ct=s)+_0A~hNeGt~leyV~z+(@fN6 zTV;8GUyP6w!3*gEG;LtQ26P6i@#|M7T`Jst>d@`lb@ZM5#6`iI zb^sAfRR*Yw2fm|r=kEME=#08p^A)HKCfDp-hAvkpdM2#jLu10cZ}UsMO20Z{Z*s-O zOb05c(z_+03u&LNd_7GBfN1+{$g+gXKJsaLe;7LsLfii7ovEO|j9w_lGe;>|>9U(9ozYjpBCwB&-@B==omeXxX>klJDev4E?>U@un?)4jku> zD-M+}L@y+U|G*FJx-tvieGRNM&?5(MC=w^z+$^%>qGNVENeN$Ti1V%(+Y+>Rm;K*)k9jtmy;&!SoRFNCf_vJTthg^B_Rz z=}o>Ro?P7u-zUFn;;)aOeHW#r-7llai4?eg573!pW7pG9Dtm3(5bp24G?+zYcxltckUJ`BI&XmD<1n=>AE^9Z_!H%)1Pf$cpuOQmWu;A zT9m*(0MW?{#1CM&{X20T7{_FpBZ(xy7!D0dX3sFgZza3go46X|VQ@+Loo^IxfB@js zpM^oMoX7=C0-p(Gnfl}M@7M3V@SnU+C9cvRp7yutH*^C?Kfn8GFD3s^=3at(R){4XV6>H0r_sTDt9Tq1HTgY(XY~(b-Cp!o5RG3-j^Gwd>sKCnuG(+g?x&) zqE1=e&3hb7+zHFK|coiL>PR3Jv&cjo*U_Tsv=PRj%GBXBiZ z#@ruI@=g~J=~w=}$o^}^?jlDFrq8@~;;~#}9<--`gelclmYjvOnLq7ITI*lhbQA|2 z{)r&Td&#Q2689zse*X@DF@Zz?n6&jpCKEo>;)Ab*5Z|J|@Nn4e9N{x{C(93&ubrBr z?pHFu@OSwMnBl+)Qg^&}1pgkY5cpl{0U!rZ)|Jd@Ooy=U+P}ETm0yw&hVS|6SLC)j z=L7%e81K}to6)V>*!5A}>e5l2j}pmsIHYlKUk(AepZZlkT(Nr6e(qNgth)hnA)KXZ1P3tGK?`XD3UtDkcSotREV?Mo37iVoRQ6urJG|5vRh>s`@Dy* z{TB&1`|wuHR{$gdx~W}0M*;{XF_+2TTJ4sW-73F~4r2W(u8dzX^8aPCuCZ#+g-zf> zqRp=o;5@nCc|pmiUJeuW;-4*b0Cf4IvJS3wk3+4pWpKJMj4_Mk7c|}mLpN8f2GUn| zE^-yB=MI$k^!@-o$f^m5hqhJm-H0~wrk|S-001ktZ{9=n9rml}HS#x~AN+tmi*|`nT(<#`<%Kdf;=4HZaK*;o5wZ@l@~tlAvyHWQ zg0AJSVW|Ls$$(hJHIkHu7kr~&inVv;vggbIO2798*`zLeof(kXt3)K{=h|769fClx`RCaTfRdtF+AGDwlZy-iAY1pu+v9 zT;?xPcOHDf4A>cRW&bogQ+zsoMzy2_q> zNPHW^lr6`AOXCP8Hk_!OW1mO%JVz`)nD8JYy|7$ZcTqNfSC<(V6To3Zqn!}ftgid+ zmpjSTej&&od@4CaNkg>CR{xe3KSzTD0vF(_>fj-Y^d1qX)qZ78>ruY4pr;DaXE1gf zXeP7kB2{Y3{&45NR{QK7ss1H1WMcFIizy!AU3!+%Z!A!3yVC42c^U)A+Ssmq<>?LgE)uA|AL<2x(l0rqs8tEeCi zFr7gEffZ zeqM`7O-!^h%$6Kq##uy)K7ZTk#3>zFl73;m+5-)X$wOKTcjp`}^xtO+GW`C~ zkj<+=_QdH8;Yi+lCN{vVbN)s+109l*fhwIza>(UC?+;Mj| zAqh?>kBaXsZ;1{VAT?$UAm#~@IGAHoj{q8dbcrc;0QOK$yXqmDf1E|pSj^3S6QYtqF`O8;Y}wt&yJ<`X^n|F0 z9_pPg(XV#|SL{V5n2kh$a%N?t2YbUhpSwo2Zwb6DSIKqIu$V~8FZi~r`TZ~~`EAQE zaK0g&&f^=)TnB{DoY*2km+BS;V1xs>lI77|nzbHgKd;hza&Q`A4VYBMhY=hO6WyX` zaq_b1)QFRCOi~Lu7y6DH=>Oke6>^Srx7us-t7DAYr~dnn{taVR1N&jv=mnfUelYqo z;z{Vb=Szo=oZ`%?w9|k&srUk8pL|Hw8HbE%o?~75W{VMg25>otuDM$^mzFE9w!D5H za>Y5yJm&~#DF3E@&qzxmKUe0VJ{AX^j75xAF`yb2ul~alr^A<0h$a=-=0?)#AGU2v z4(Fkwjyr~Df!_Q@_~kKWIj}V#;flp+`5Y4Xs%o8~^%Feq577I8mkW$I&Sn^W?}iB9 z{I6CveCovKmRLdX+;cJ+0^;Ik@*9xq>!pnXHt-nSGGqOjMc*RG-C^P}aLi&SPUUGk;39BpH7K*G=RH{7yZLb8@Y8}2{g3Ek;k#rc zWdp3qPQPbdix8vZg6;IYnYXP2G)k62yjqvKckG(?j8yRH<{z5ug+3#04LUe9*i2sr zGAvILu0zcz@=%XD3pkcCQas)HdqkvxW)ejupgkjK(_Nmr`bP6IVERS`lZ)D}^0zfB6rE!M4rR7>)@;0w zkO!P8sW-cRRGvd|pBx8;kJ-nk$c007NJ~Bd$3|2h+@8VEueap_y?<4@Fj2s-FX0FL z$`Tt>*9YPYxoYsNQu0f|;RqaIpk!G7Xn02pfB)uBFAG6I78 z%M!l=VJ>xTd*;7j!azXGd-_*Q*ksF6o}`rS0iDp4rMf287DPYL|EgL-Cw3LX1ty)4 zb*2|`zC?5TWHcv&6$4@ zXW;I)Y&))}ImrnZdLQkc!!y3{j~3|oIYPW=(93{>DFk|zo~}mj^5q=fb;x-?b63kV zRryNc7gfg#!}VFMjtIE5>WP{fqeH#Y^DK$^>`d=nL+!0U+a2`n--} zdsq2{8Raelf0Jo^^$hu|RynG&7Q}N=AMMS3Km%Xt*uaPRuh-$| z({jwWCFsw{zGGwD&Hx$-cpTtfM(WQw0Xh-Z=tWkeMlAm(075 zMaJ^yCqmlEk=T^I2-l8w2cNGq zn-=)YbLVge$HQcA^EKa4Tt(lf2!`(vo2q;!izjsXw1pMOqC#=`&K56ic```!lpaR6}b!rAwr|NjQCF#mr^ m{_hV4FCaC5e>iY}rRgW{pP14+)4gr4yR;4vHYsYe0GpkWeBZy{RC* zNQv|&O+pipngs3}{LVR^|G)p-J9q9($Yj6oE^Dv#thJuCXA`QWp>&awk&=vz?4pYD zV+a}9nKt0B^{;;bPxv}m+{nlTwpAX>LOsXV(-TIGO?|ty1AZ)z%;MZ!A)r^WcMrFCZn$r%Y zc{6IQs%x^st3YNEbTjs1?OO;6{y}+b(=9)xo}OzYR~QY zA*PeJn<6Ee(Kdb=(mpBU|3Dq0lEK0rb0^~kXIDpq)vF!<_i#F9Gk{*Qj4J$r1KKrFh^80xPE7PGH z88p1z&+|76p15feL$c$iOj3~0vVweBnnsD_`e$?XnT7AD@RHm<=M*BQynT9?*p}=G z9Io>;72l*X8TMLoU;^AxCyk3+GF23%M-BL^&C4jSF}jepwzgxhZyNf-ewHYVA0rOy zJpAKIg;oE!sAX~TsoY+B3v;NB`q&3M4<$purcYmq9i?6E%#9=(Yp64@RMn;Ps;>v#ywc4}uBg z7yF9YEY5J35b?j9XuL(5bgfqd#@=@c zZU_*iYD(;vR%>{r*R6cZGx_JA)5)yI)`I=>d=Q4dF5Kz_NKE%vbzH|}<}WY8LD>eZ z-ec4M=j5>9Xg-K$C533_fy=0B-qoRY=q>Iz?wa$x6H{{f{Ib9m)5Fnq0jt>F^ z6TE9@kQ3FlzKME|{z#?~PB~v+LYe)9&Ii)wx?AuUo>PGo@AkXF8ofuqVei-wxSyyMO|0YYgUzQ(5R)1FZ zrgI{iLRZQc-+g84%$&)3;o4>set09u;DU*Xn9oAb9C`|UH+=es)Mu-oYXkdijJr*5 zxBJb1sB2q9-w|GS!H!592?lJ$afZ{;(q=R)ZSk^7`+BbbvKb+7MoBPqL6othFLReEyZ-7aO@*HnMOAVPJ6EKZjYEMD6@50f-Mn{XYV^fmq)BZ?A6H^f z{h&!TuJq|{YXW3MQd8XSn?hssE?qPAy;ak}%A(9JH?Xfe;9&!AA~*7q-TGm4&-L)mIb56qY05}l{&@XDiu zqwzCt8W|^`Im^%Mn-1+pZ;J+Mk2iEEG)@@ye)ZR1^mY@}L3N?Wd2sdogaCpz^U?P& zREIMhE$1(>NL!D-{geZ3ekn_|Vg^Iu9kMgWuaCE)13Jzqnk3$Ej9EF{!yUKGVK@DB zHoB5hCb;PkN2~S|Ce201)wT-9_~Pwme^#e^#cduQeR&v2(Ma*GW!%FTQeMe&viOvawx-Z*34>vS?)5D(h-;7cM~%6pqLm}>6Zw;$8pATIepxn{!LO2zkye2QowqwR4tux5L%k>Q zP~acjC)M(g*D}1*Cz7?$-!d3kK4kcLAdd+<{oBpC(oCf{!Mp1+?|VCpa)!PAM0Qt1 zXEy^*BmkrK&WBXHm+aN}Wp`q8Q;I@_qnif^o?kXhqCrg!LkC+3U8NS=G%1mtcDBrB z{O5p$j#wbZFp1dRfwjormoQ$_H&3y~dSi%1NTydkx!GW(O8CD0$|{;MzcC|yE<^{rq&)W`?tkcxp0VXx{P z{~FTVZqAHk;JHA#eGR#{$7bBL?yQX_V4^o)Bv9%nE%#^2c>ZMP;CQ}SI-9PVwvpjd z>usXjQ(cliz@Bf)1G>8JqO>wYW6M4;N+Q8<$M&e??Wo9j3q%- zp4<1n-RCc#G6U}W4yE10F$|k-sdeh7pYlu4k z>^-LmLS(&7bg}k)$*q}&Ox}HF0=CX=b7u;z+!IrBAlQ?r3ydWM;2>GI9z?$ocBsqCGD4t_^Jn3|!%^K)Ib_qcE?P!sExxQr^D+XYrni)co=};91tv zPD_fDpvoa1`2LIZ{Q1Wr`O+-nt}!Qd$uw?@T?ma`1I}spFS)ntJKH|G0j+M>(xiN< zhS6H;-rxbhddhUuafj-Vzgl`7PY*xcOuv!0fZ(eEZq1D0dXegh_LM~$TFlhX9Nitw zA@`iC6`w6d8Gi^njTNJfR*f2tdWj)44pWVO`^Sw}PyWKr?n7qUKc6I-_^*6L5hK3N zCTDYGSI9liYHsKaINo6ckmpD6AIr?zr?+NqTo0&If3{C)#AI~5mvUGQ z+NX^4$~!Fc6S4fTAzB#0>3MWDfs*X!wCrh>K}LrB2U!-BjO?B~s^s;}@pEq~8LAR4 z%PEi3-QW_({-Tun#Z5-ma6d;U(!~0M-NmzHFFhVT28pXfaLu2(V#Azi3)#)t9eH*| z-#eQ>`d5qdiI@<(*ahfip_uA~Bf9@+T`gv2h)FzQ&y@7qp8a$-Oo9A9CosWtp=*3k z?g0^^NDqVCFs!mmUh{p&mB^=0%fN7Wd74IuJ$|zx;N*C+*2T})x6XA%$nWTvgvW;Y z+UvCYR#EBc>7R-g%7TM~cQPfpUtd#G)7kUXcZgy0 z?a@}VuhWEW6RA5E@ED_dOGifm8qEx6CnqQ9R~%^c{qq(8`B5wqRW?KU0M8Tm+BUyd zJZk`ML_`Q#bahl1g3wd9Z9J+-Qvwq<}2yDb)tctzvf z7QsN;ZnM`;e#0{*1%*(E#RG_JQPFH9ljw&Det!N&@7=CIdS6x4NE`>)eykk%*RP** zEpSZ$*NqJg=FxR`H2u76Kw4QZU%!^0Z;RAS7f0@O_i@O-`L!`M(bu;Cb>sOU(yKHZq$Ydj{nrC?X=F6vZsW<>t|4u9QZ9f#V4jqjB0#X=V@i6Ea^xcFz5PVhc%^N3INCj6 ze`5+;m71C=dBOY&2j=5MwPQ2&W(2kJRJiT8;@C3o7Bvqm(_HsRu7?kwAX)|n1lidi zb=}6ig-ikcNaGk4)_O|;)6J6oAi+1;` z?V#b-3^(c|EL=PL6vD5qAXH*_B8qRqY`Rw2a~~Xj5*lAz*_z`ue}u#8Rc~}B35@t< zsHKWT1_xM{0HiKq@^N0QMfHx4W&#Y0xOs@jckcmM!zLAOOg9<;kw`I;@k@Jqw`uFp zkj_;;iA6LR0oq*|Qkn|oqg!}fWIsi8aB$!RCjhujvKL$fuzzq3S{FdBq|rnz!ytys z;iEFYNq6~j)?FpQkVyAx$C-_p=H|x6#$rSB=CuS|2UNStq93W6^b20?wPVQ;BV-@@ ze6q&LY+Vl?fi=qDb{-9;x^B*c`~KbZC+|bbUGd(e!s4<(R#sML*qZHvw#BZ1Hs{GW z9EeK!nwk7eH`S9%f%?L@3g9IIU>Jq6%H#T~sw#+^p5DkUrKmz8q_4>jkG793zshy! z&miKg-4-oLla`hSoi|b57YI`&U!(>IdX4o!4unUaLDKW*BZDZw#lMsQY9zUW|*`-_3Tlg z2n({h_<@W1tVejf%XA@oLsF*tTu5#CxMoXmP>|h3RpgE$`CKERhE0a8o94z@`XE>Q z1$YYcSIe`7?0E*cSD!kaAGJ|_ zx9}EXpnc($G|C#}^tbOI?y;lT=^vwl&Zrc!3ziK3q&qQWAWrp-2H4UVRc~&+A@*bU z`gBex^$%fM*272dxZ(XvEdmP%SRYnYcxn?tpT9J$sh_8>@C;97JnauoT+hjHYWlW9cBkN#f)m~ei0xQn!5J&z76eFMv-(;-FR%U;FDvLzUDQ$p ztbo?m@95-1NH7br-N$>O`<8=V$yD(NTkOlS?p`tf?*zZziNpF4JG-CbN9y9jHbZ)j z1>XK)zQqufpHfe+t(i`#+(oy^ms#|Tk%~st`fh`@o(xGs2oQAZg)0a*bzjT9Yb@a` z7~w`^T@ffJSD1vY)>iCuF0$O1LqrwxO z$|GJHU*TNjNhH_zZrkpzqWnP?^8)AwZtw>h|hAJUwqd4`X`&!afww_^5B}T8^ z2g}blA0E~dmLJE;bC6mBv_ z9OWdmmG~H}es0zppv~zBo+$0AGN_EUSnH(fZhI{QCbsoPeVY!>)hPouWC7RtnEiF( ziwS(cI}7otlfCof88Pqiy*M^qElnkT%?I{F{T{<|ULx0dmU0xcQc88vM`deC>t3k> z#UQGIZ{s^? z;-Z1;$TV12xf21Rf%t-Su{!85t9X7k(N)V5u-gm1L6@J@7!7&z^1DOHLZ#TYo>5MW z9FUO5{Rw*OM#J`_8k9UtcN-~yU&iZ(RjY~bJoF~nsN*7F@BtcdXODs<=M=G^<48LL zBlNl>@owrK3)3!tFM#Xey_gHO>uXdUyw#qv^-@S5%FLvzrodYO`^0$)oZH$ zht%y4TCp_d@=FyWB2{R+On0VOLdoUr5nkA}?Q+Aon{aM{DLh5@QA=xj&4~3o2~FcI zzU84fL`p+B?UhWcp;D1UJC~)db>oV%;z{7R5tDx_-_B-ukXvs<@}{&|wCp+14hO^W zc4iDd_F^Y@3I3hus1VCHR`z(ETEqs(_#39Ao;qGEd3quXFhw+2x8?iy9u$-(A}tW^ zmeS1-i_PIXb3V#|XO&8907pknFNWCuTv%nXJ>$`8IQ9axCTT?!Q+ylDM`-VfxFII2 zmVqkoNxHez5vwC{7u!v^yCw7`MmR-`Ncw+$1Yd%NyN<<8uM7dzq)9>l^n6R+wL5lO?X-ZapUF9 zg;5vcYvXfu1f3kVgPW5DO;E(MN$_PDQIY>^69#m_*uPjS_PcTVo2$gxmPiW!dnHi) z-GC>h<*h(m(%9zg#Eu49KvvVm=QU3DDqjkvLUU%5q|rQ zi-B0SFU0N@7=hK#oO3bH%~vWiWlPY78C>xycoU*meH?F5FTYs^kr19)8TBxXHRbmW z?E)pBONyDt8q%A`#XN>Y%bBm(BlS_afz@>|$7g-92A59MjbB?~PM&5+ZeQJIxM#GU zG~%dKkb_e{pWN9+RkdMu@4y%h<}y4;;x|!%v)g`*qzFg|-|mlrhe}x$izAzQ+4VYO zx;JMZTDI{|`TW{oxYK>njW_PqS%~q8^HL8d9puo29+j1n*7Z2wp=D2KdTotrp)0*$ znwv$G&Hu_(Mo!?!zI-k2Y+lp$xtI~{J~WaC``7}RwRcE$4fIrQDMBGlm8Y^3q@$Y# zQ5S=h3ZGaww|CB5w{Nyw`sAN^x6jH}plFv8v5N9wYNf`Np|0C4(^?Gg^U;}f~2)&G?J%2kp@ElTz{Q~{%fLO>%41E2p5RiT2_6LTE^fw!&Q+O0Hngw7u-ZbUm zH0a3W7(t)cZl4bUu|P`v9%&dk=Xvss*o{@#;;paoKg|I=XF&1DIz?k!I(-1O8E*64 z({?4`P)|38wK~~;PBR2*Ya+rwbyz~JT#0^Cx3lz?$6%O7i*Yp8Ei4uO&F_DkA;p!Z)vELOOw;8zN(CZ2xSl1>3Zta%!Z=XqYA zcBTV5oBg|U?`IQTV&}-qPP{cdzCr)BEHb}JAb(|E8~#Ab;eIusqZFG2bb+dw-vgL= zGQ&N~1=j%%+a(uH4rOua9(5;gm{8~sRo<&$kYIIZ_`L3 zXivVr^quh&FF~Ggf;sOXNIXrJMAyhKfH@iHk8A<#aM0(;gNVWa5L}hXJ6wHT4h>AP zvZ!Ap=cv%^;I1_AqWzVk;}@?fpE{CjL%5)zemiLaE)p2e-v%q7&LL?5rT_^P(8Mh8 zA_4};t_>>VLw5beENG#cn-?fJVv#aCp;amgahdS;0KwN z8^vo6PG@MPy>@*1{`<9K5SMr!qh!XDKnUyyCKM9-g-3YYGX$Cdp93SCxd4Ub50_Qk z1ae}@k?r`hK%vBk|CHVKXqAVK1riD)>|P}aHAe%v5D*gv0d!4L7sf%82%ce-+gn%X=6ODI9|NxY z_wYOPB*gydWJ`Gg#(93Xv4jeW5^{71^rr6`4M ziH8W#>V{!XM1u2d4Fb0`-PqRgJUBd&L`Rt{42wE#xvhYS#q)B8tNjC?R?DLe?WQcA z+`?pxgTm$AsKm`bj{}_4Nk|)%Ee|>?w0H^S4Mu!e7epsoF(m+7Wr3(rg4L%vgli!H zQv(?_Q34nVx`b*i4sLb`8D0Rdf0rnOujiA*7tf=uNI>U^=W*%5gS&Rkw_ZU`r&S4t zRI)%S!9WS&w6jOtk$AY`FM1Z(IIx`@4AhJTBCqR@;PuF07IR*zEQ{R+C~}tZ6;5@T zUBpex{tWr4uIy*en;r*~#L-6UQ>->|XlVT(%z>f?0)`T~HZ2Qj6zKz)0#L6O=qm@} z5@`zy82ta0DaK#xJ)UNuZ*beqP`a<14)OUx!T^Aa=SarY7?575e77EYQMXZ6Jz6(7 z9MKcst~ix;33UenER;u}8wOm*XbNs?pxtR+^}L(4yknNT@V8!MQRgM{s&*Le@`l>* zYWzsK`dcS)fsl*t%0>Wxtgz8b^{oPm40p_!Cob;R-&%ILehf?+FC8I%yt<$ek_Ul& z1^AKD?KA`YsgL~m zg}YxDt?-aen5uM-Z&}{A-FGN;@5zI-D zC7D9|)E8(;nEBH^ZmVa@!Ab+-mdS#?CV>(W91#7|2B6fbG|gFmzEVJK z*I8ScJc8fmEHcIfF}Z{2S;4(nAj zF5q-SfXx6PkE2AwCGy~iI%2D%P7*T@G_Phf@%JlJD5_07&tF7J5|9qwyjIp}rPp22 z8x`NIBYUdxgH@gc@WJcT81v8Q4En9%z*D8)mX`||?$MS_00Jbi7U=`j{eT7%C|#A2 zrz$^OmCncsB&pXk>}RM9P~nr}7b$9;&Uos#DdRxU0qXcpjope!rahS?d;e(4-;twr zeHefvtCPW{7$U$I!=lnv6MHkHlmNY@!AL@eL1vCF!0$`s^-cH=eEa4PBs=#sf{|U( zL}?hnaY#X{?h*VX!|J0GmrsW7%80iUZfYgYE7o3SjJNUJz?XA*#e zWRy7pXE5dbFR`8EAPL}U+aED0VxYHizau&DZM{rE_LKDykpIa+f34`s0%V~ox}cDq z{x-uC0MXy+0^~@UnOYg7tOa`hh!*s2F@e$PsJX~P<_QBay(;|8ZGfcdD$M8+h283R z874G^;E#Zyf|l}BSV-6YWT3a{^}q~^vi6>QiiRX9O_n~b*S8r#3J&wv;#SK zu_w8^txfk$@;F1?(udb(v4l$+z+;J|JM)GOJs+KT)z`QggxMqAlo3U(*^9hb=c4H> zpk(;`1-#U0MyDQa5DvuwfKz>yQoX|_?v!rEvHUS6J?-YI@qxg&zxo@CmTOZ69t`Q@o`zXUQFFndK_QH?4>{X1$J=|AbdR2HExa}fx#Ax(Cn}f(&0-Qj0yrT z>XVn)V-XEdZRmMaNz8Y}^4Lt6LGSj9aP7rYL(!iup-5G@r0aMXU7ZmjXT{0Zi#{Rg zK{Qu7cCQCp=Dv5Syo`4v`qRALa;NQmhdzheCymD8IJeXyw>-NJ^Q!QfjZ3HZE90z?5*X%_vaGeujnV84;)2A4lRL7)A+A11=45p zi-L4>bZJ6+e?XS@iMc3k+^a=FY@Vyk;0+zhDU&kCv?KjPe4 z({`5^Oo5CGoVLYy?lZ>odayDCc>xu<#6zH<%@WrLDJFEy{u7_IU42b2{f+~J!xCc{ zw5}{e;8}z7--MczaQkDX3~z2K>F=TTt$?#5Bzmmm#Ju(gK&hbWehiP!r@zw!GNQ)| ze*G$+lV=(zEMYgHOqksEV)w~J>eosu_b)__`{}?boAV%FbD)r(I`*8!P?C(}=t)|< zjRlzVTM^tj+xx;kR8}U1JM*Ucx|eI` zy`yTzMMEygqEzN9Hs97FZ2fbpmP3pNtskIi5TBY-<++Ms6y1sdWzR7YUe;m)iiJSP z3+!0nm0gN>=6R$uz;P=^M2CnY7U^e7=sb?{3w*&$THwE`^|TBk=^1euD9pvC7`)`@O!dJ?iCkC+ z_XCb=qN?OYi;|kwa(r5-4xp3{e-+3k@logqbKh+bXE_{g7(KjVRu5b$EOJGedjCt{{A%AOpj#~aF^ zgf7h^16!`BwFn3azUaWezLp|l=46Z=UB-FigiE+e|PcbC;T1+kXN9?DH$Twa8vN%8C3>o`6=`sRv zLE$Cj44D>)?DTHJzncHL9DRCi;ooAoKMb{=RkbzZ(Wz0{{10;3D|{)ck!-{9kYXX#Tl%V5&cxe`ta<^B>JW zG(no`Kbrru5D8tOWPe{+|8GY4|FHC*M)-fV$wx!v9;H+(Ag8Ct*UVWoxRPsj*?*^bdDSv!zL0+Z`rqrzp$D!Cod`vd}^Z@`bc`Q&32GHOUsm z2*m^>Hw9lX0u$uLmt0*XMnobL6(ux$XPVh&`R@5WmvisA&pGFwdso7{_1u}y+;gAj z_xl~r6O zN+e#u@aWxrf>@V0eE6`gP0~O7lE(gK97})iQwmWc@dC_bMli<&_9YU5V*wy`*O2jg%FLOwK@TTs%rjN_07%Qd(MyXF|d-Y-R$6%>R%>+tfyV zV!XR_b#-CRoH@8}>MRV2dLKigS7PX#4BQtoAK{DAkdu>x^XJd&^4#I<*|UgRv;=Q! zh>nid#ks<2>{XiDn=rO`EZ%4iMNLl~4)z>IRZlfO?EE`|_CAHc(m>RosMqDW0~g{z zMTqf=h|+pdwyCW@g-GvHgofI2M~a^AQGEAcQW-q?yG~kTz3d~W`eF3n;hejV6DcU=(^N}X`81Zpg91udS+qLkCX6FJPm47IaES2e6oDl{v!pYV5FcNT#5b;)@Qe(2A-d^0*aI>7uNb<`1Si|zh_ zJV&f!#;_-Pg=JJ%L+t_2g?Qn@1+eF58`fU8zCagmhSk^;jVBv%>xNt5*W-sl-GgxV z+Pjfmm5q}fC(+T>fs@~#L}gPY{4@O#xFQgjE_?Q&q_wpbzP`$PWtk$Rk9)~vyp8(A zcr)BN7BlF5O8GcE+AhVu6rxs!xvx#b(vA>r-Zxzjd7%ybqawNW3%XmiARDz1*j3NArKhN=+7_pTZ4>{BblwbAe3gB8nB zQCWeyx?1J(Kc zxb-4f^g74ujGZ`k?3gac2v=i2X5kpHbVUxE6dD!U73vl86v7yCzR1z#xP$L+e7Wps z21sxjl7uoeLZoeGlcE~K@g1nEr{d~ZMvoqiHEY(GqRtM9HKDeBQ#<8}wcOn&p_O6b z@?}`}Nj`S(uEuxYo#4>d>dno~IPm%BZb?xJQ6ljIM46EcRRMA-YQ#u=gjEd{tCNZ= zArkrd`FsXukI6lP%F0Sz9W6CAH9XFqQ}mtT;u&hAK6~6phk33TX9Sy>?wDO}zsj$3 zj+_#ScM=w3*REZu+&d%mNw2`~|8T$4*Qf6;O4j8W;cDz#&$ME6iZWx` zrwF21;cJB^#wD3loMeydywr)X>KWM5q8~paxcq1V4P7&&uSscUNCI4?u(}u8rZ(!M z7>cDF7c)0k$3kK=dl=0Q=|MttwLhzUYGwH8y0s`QEWkJ4e8aEts?diag1(CXwxPjN zic*LYi5DQsO#Ql4J2TXZu|I`Ku$gI2F;!Jnx)?2Wb#+ehBsww1UR&wY#!{{rV?;pk z%eEZNSFUz8p5b4qj-U7fzaA*&x*|3?#i^F>pus3tPN1ypnqxnYKJV7z8mqByY;DB- z?<%t0&TO;81q@NyQMhvDiajP|M+heF4aVc;kGZwdluL(JlG5TCbw)_2GE~v_Q7q-S z5R|K9F%u%yGnyUJ<3@$3%CM|#8wv{78iWGL3q;_9SAxFy6_6P#i^7GjS1!WQb&#=0v+`YP;C zPfr9}`IRGIE5_dKAs#FQBG{9!IPyO`hvMR5T)uo6J|T-8wM#DWnWUI2Vm0{OH!8%&6)U*h zPMjlboB@+M2W-;FcPAQD8~L4B7M4M zv6@9Do4$8Xh$ZJ8Icts@t{~+rQI$S>+~!WVg{ZP|<3@zP6NjPG=7GJn0<7>`htP;+ zyZG!u%rl~_tjuS_!hKHT=zY;T|6r~qBQh}GDul-8DFM*0kN z{@}RYne;^xe9L?>qGtpi=y`xMw0kH+2Uinu1G6TzgJ#YE3b1I#-xtX<*3}OMKxLpYPYp$AAKc6n!VHW($r)-B*f^r zg_xfD1sCFTF{PLvy#Uv)U6VqTNW2|)gh=#<5K~f8_@bF@+qS{~sR>|fo1Ek@GI*M< zh7rGgEZC{8&wE=@R8(Z|r)_G}#!!w}#|-w|Ox*L#E6B>q!hr(^?Co?bfzQGXPIcW8 zB3*A{ksr7gp+M|{1YI31R%2h+REN;KP;^{yo;}ko7x^{$2uckC+oH&%TVWf+?Deye zSDnXi%Mfd++>F~UR3VDe6JKi|eI-Qtu?TujO<%&vOb_EioEMjjv0+7Ai1a)+CRqwm zBKd#7l@L`KQlFS-R71q-q#_EDEvo{{ss$@OCmMA%tmuy$^UZ{)K8)J?T8L>GOF8Koi?|TCm6fAnS1opaxeJw5we}BV zQiu|Xm*eUhV!sPfi)Oau^THf{3x=5QidnN~gDox7)zZ~Z*}-GQd{?kJ+2(aM1UwO> z%Qa%qOK&;l1qJEzoUVD&epem9mMvR!aVl10Pc*bPz;BwLB6Nm_mpqJdY2z?*;YhG0 z%yz>*-Hx$_Ve0!+`OmzG`BwDDPq%4>XoS(DuY`E<;zjb6)z#poA1MK@?3<6 zhvW3=)4E)D*tBUA?w#P*I;2C}O542?LU@drXT|H0vvBvMD6rT9$81xDq%|`Q z&suzl(88~I(t;WyV<#FKjDI)u)<=WEHn!X1wqC@zsWWsjDpq5!QvY>5M#YR${sx=; zSeZhdLWRO|2LHMKXgcA(ytLSb_%r^vx7nf^SC76DBCQ+^dovWPb64V{+#KY7Z2Lh2 zY8UzGr=O${B@%DPNM@?+MERMu8Py=HPAdIHOG^u1ovMY}#5hl(Rfb|+t5vW@XmefN z*k4~??-YCJ&>>xniYH^=cD4;k1xXn8)-Vi+7=Qth18~QTI}n-`ik7zjeVn)uf9C)G ziG)aq`)~)bmb?2T(lgVz;5=c~>Xo`WDpH6Ni5EaJ>kGuXgw;t!^7HXa8vC1ZEd9Mt zDMX1xB9Tb0N+C)l5{X2@kwTP6Boc|_suZF`B9TZWoc{u%3WEDPzh{jA0000~>(hnB6 z0yp7K>^*Qe91|0h1)KmeP~#@IFLv(}mD#lFs80vqUIq(XftyIFhPiKp>dip(6AtNPi}!MD>9^E{2ANJRT2=#g?r39t2UP z^bXVrQbCcB?clr<(F#)Oi63zJfzJ;7G9Nu8X#cxmPrD!(C5nX8+Q*27#3rm3r~w#mP=jfA-ENpU?0rRkYqw@!pWzMhSW3vp%z{e`S!|n6RY6ncqdwTIdXAI6-6%CZpGnnCRSx=W z$wR>Ul6akvRbO8}lMA&gSUb8n+Nxd0hW2w(d7^2srD>prInm1aw1utT(fa<{91iJ3 zOu$wy(rV2@4B@ z*`l~AxRy*NOKlEi2W!P)5#5s}qu?goDXt~fz+hQQ)$F26rKD~V5Tx4VfgTdgA!5M|kX17&W z%eE>~Dq`*q{CW4=o3rZ5{BsxnqY}K8xezo&fO}LRX#GggsnhVAdPdw9W>3`{QtGJV zJS0^V3Po!3oSdBTJd{`?YavithPRz*rh z%umXV_vff7Fmgd#DY#by1Pt(dC-{q_&S^i8lknx8T&LcSG9K^#EDrp|cbAUi)RY=n zDdiRoti-6)yLaz?_QMw7Up{$?Y;}ae4y(*HqZ7D=CIQq z_}6#VQ(LIDtu@{KUHP?n+kCfvWxtl*E3|4At%l3vULr?-W3dSr=w{~YxY}R~Mx{|>hBcf!kCcj-r_gHRs(w{! zzavy?->6cDyWSt^dgpKMx<9!)dg^q3O;YS`yEVI6YIk=xz(tCy;<&PunjjE|g*Hu^ z))&4E5ZWZJjpxf&s)*?5X#GR@k9J!DV?PkyF`l=c$Z2S3kkK$THC6cHm*}(fJc^2n zGBYzj{q$4eV}#M2AAI@E%)bkNlAo@xZhZL_RXeqcyLT9!jGlWv)CQ`Gk$QGzVfBl2 z-V5edOJj^m6SKQI6tIy5u{mq(o)oLr7LA9I9C#oHaR4gO82RALd%_Q;bb zPhh}n|1F{W4Ke5GYAq-xEB7_7Zn*_|DuhaX+Vk$yd&qFq*_oD>Zh@=;7VK< znvS=(cX4sCXwUWQ*MZ$-EK2R|?FB}sU-wR{q~L7rr#GhN@p=10_7N!|zYIrhZCd8o zsUODn3}U&%LS(szatSV61J6N|(%uqvBST7I{_B)F(Vi36u`5;fw+UT2I5-HG$30wO z@$}S(N8n*lc>6`1v(wU>jgGVrMLi~F@7 z->2(m#H=mM3hC@@=kxh9&r-pOUx9Zai0XZ5nn>TPy1H6M4=E`r!0pC({Mlx(&rMjM zlqLPR-GE_olxlcN9PgMcY_4-uxFYGnl-S3K7cM6WBXhz;dS4%h4tqIq~XI{7p@`!qS8YIF&&J|7qtrDmX)d{g?X z5w9v$s#s^9rHYhFIN=71ho^AhpGG3z$jYZ=W@TjOM@2;q4-X@yBIYUZerRrPE-5L2 z`C5eE7d5$GcTpGiRDHl@sQ1-wiS_^JN?br*ULI5)mS23zSL&<3p4w&(Z*sYv7#}x696Sr;VA`Au~-&b7#MktsSqGzC@{$m}-_PSE-_DyZuU+g`pewi{e= zNK#PW1FNv~u-DLd@eWIXixQ`|V^dy0&qM7;IoYM~d2Upnun@8;Dk>(`F8Fo}h+zq9 zlZQ6$+&8@oB_cFE>?a4ElhL6{2RAjfHukew-OL_lf1lhRp-O!(^-T=?M@B{r4E2J~ z1caO+o(UyFfsVY)^XJczQW5id><@JbQ!VJt@{;r`q0328%7xkIt155PXf&9d!Zc*s zqyAZ^si}!F0k}Dh^QF8DmR6ErsXq;XiM%ABtgLK?=SZbh? { + TaskLauncher.launch(new LoadInstructionsTask(program, addrSet)); + + modelChanged(UpdateType.RELOAD); + } + + /** + * Examines the given addresses from the given program to extract all instructions; results are + * stored in the local {@link InstructionMetadata} list. + * + * @param program the current program + * @param addresses the addresses to load instructions for + * @throws InvalidInputException if there's an error parsing the instructions + */ + public void add(Program program, AddressSetView addresses) throws InvalidInputException { + + // Do some initial checks on the program and addresses we want to load instructions + // for. If these are invalid, no need to proceed. + if (program == null || addresses == null || addresses.isEmpty()) { + return; + } + + // Do a quick check to see if we have any valid code units in the selection. If not, + // display an error message. + Listing listing = program.getListing(); + CodeUnitIterator cuIter = listing.getCodeUnits(addresses, true); + if (!cuIter.hasNext()) { + throw new InvalidInputException("No instructions found in selection."); + } + + TaskLauncher.launch(new LoadInstructionsTask(program, addresses)); + + modelChanged(UpdateType.RELOAD); + } + + private class LoadInstructionsTask extends Task { + + private Program program; + private AddressSetView addresses; + + public LoadInstructionsTask(Program program, AddressSetView addresses) { + super("Loading Instructions", true, true, true); + this.program = program; + this.addresses = addresses; + } + + @Override + public void run(TaskMonitor monitor) throws CancelledException { - SleighDebugLogger logger; monitor.setIndeterminate(true); - while (cuIter.hasNext()) { + Listing listing = program.getListing(); + CodeUnitIterator it = listing.getCodeUnits(addresses, true); + while (it.hasNext()) { if (monitor.isCancelled()) { return; } - CodeUnit cu = cuIter.next(); + CodeUnit cu = it.next(); InstructionMetadata instructionMetadata; // If this CU is an instruction, we can use the Sleigh debug logger to build the - // mask info. If not, we don't need to create anything complex for masking - it's either - // on or off. + // mask info. If not, we don't need to create anything complex for masking - it's + // either on or off. if (cu instanceof Instruction) { - logger = + SleighDebugLogger logger = new SleighDebugLogger(program, cu.getAddress(), SleighDebugMode.VERBOSE); if (logger.parseFailed()) { Msg.showError(this, null, "Parsing error", @@ -162,9 +209,7 @@ public class InstructionSearchData extends Observable { } } } - }); - - modelChanged(UpdateType.RELOAD); + } } /** @@ -349,8 +394,11 @@ public class InstructionSearchData extends Observable { return; } - instructions.get(row).getOperands().get(col).setMasked( - table.getCellData(row, col + 1).getState().equals(OperandState.MASKED)); + instructions.get(row) + .getOperands() + .get(col) + .setMasked( + table.getCellData(row, col + 1).getState().equals(OperandState.MASKED)); } /** @@ -674,10 +722,12 @@ public class InstructionSearchData extends Observable { // Do a quick check to make sure the search bounds are within the bounds of the // program. - if (searchBounds.getMinAddress().compareTo( - plugin.getCurrentProgram().getMinAddress()) < 0 || - searchBounds.getMaxAddress().compareTo( - plugin.getCurrentProgram().getMaxAddress()) > 0) { + if (searchBounds.getMinAddress() + .compareTo( + plugin.getCurrentProgram().getMinAddress()) < 0 || + searchBounds.getMaxAddress() + .compareTo( + plugin.getCurrentProgram().getMaxAddress()) > 0) { throw new IllegalArgumentException( "Search bounds are not valid; must be within the bounds of the program."); } @@ -734,8 +784,11 @@ public class InstructionSearchData extends Observable { while (currentPosition.compareTo(endAddress) < 0) { // Search program memory for the given mask and val. - currentPosition = plugin.getCurrentProgram().getMemory().findBytes(currentPosition, - endAddress, maskContainer.getValue(), maskContainer.getMask(), true, taskMonitor); + currentPosition = plugin.getCurrentProgram() + .getMemory() + .findBytes(currentPosition, + endAddress, maskContainer.getValue(), maskContainer.getMask(), true, + taskMonitor); // If no match was found, currentPosition will be null. if (currentPosition == null) { @@ -792,8 +845,11 @@ public class InstructionSearchData extends Observable { while (currentPosition.compareTo(endAddress) > 0) { // Search program memory for the given mask and val. - currentPosition = plugin.getCurrentProgram().getMemory().findBytes(currentPosition, - endAddress, maskContainer.getValue(), maskContainer.getMask(), false, taskMonitor); + currentPosition = plugin.getCurrentProgram() + .getMemory() + .findBytes(currentPosition, + endAddress, maskContainer.getValue(), maskContainer.getMask(), false, + taskMonitor); // If no match was found, currentPosition will be null. if (currentPosition == null) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/model/InstructionTableDataObject.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/model/InstructionTableDataObject.java index f81ed99f13..b1d691f843 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/model/InstructionTableDataObject.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/model/InstructionTableDataObject.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -52,7 +52,6 @@ public class InstructionTableDataObject { // Some cell attributes. private Color backgroundColor; private Color foregroundColor = Colors.FOREGROUND; - private int fontStyle; // The border style of the cell. This is used to facilitate the 3D look of the cells // (bevel-styling). @@ -172,10 +171,6 @@ public class InstructionTableDataObject { return foregroundColor; } - public int getFontStyle() { - return fontStyle; - } - public OperandState getState() { return state; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java index 2053b27477..2599bcf382 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionSearchDialog.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -133,13 +133,12 @@ public class InstructionSearchDialog extends ReusableDialogComponentProvider imp * * @param selection the current selection * @param plugin the parent plugin - * @throws InvalidInputException if there's a problem loading instructions */ - public void loadInstructions(ProgramSelection selection, InstructionSearchPlugin plugin) - throws InvalidInputException { + public void loadInstructions(ProgramSelection selection, InstructionSearchPlugin plugin) { - if (selection == null && getMessagePanel() != null) { - getMessagePanel().setMessageText( + MessagePanel msg = getMessagePanel(); + if (selection == null && msg != null) { + msg.setMessageText( "Select instructions from the listing (and hit reload) to populate the table.", Messages.NORMAL); } @@ -156,6 +155,26 @@ public class InstructionSearchDialog extends ReusableDialogComponentProvider imp } } + /** + * Adds the instructions in the given selection and displays them in the gui. + * + * @param selection the current selection + * @param plugin the parent plugin + */ + public void addToInstructions(ProgramSelection selection, InstructionSearchPlugin plugin) { + + MessagePanel msg = getMessagePanel(); + if (selection == null && msg != null) { + msg.setMessageText( + "Select instructions from the listing (and hit add) to update the table.", + Messages.NORMAL); + } + + if (selection != null && plugin.isSelectionValid(selection, this)) { + addToSearchData(plugin.getCurrentProgram(), selection); + } + } + /** * Loads instructions at the given program/selection and populates the search * data object. @@ -177,6 +196,20 @@ public class InstructionSearchDialog extends ReusableDialogComponentProvider imp } } + private void addToSearchData(Program currentProgram, ProgramSelection selection) { + + if (selection == null || currentProgram == null) { + return; + } + + try { + getSearchData().add(currentProgram, selection); + } + catch (InvalidInputException e) { + Msg.error(this, "Error adding to search data", e); + } + } + public ControlPanel getControlPanel() { return controlPanel; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java index 6499b49a69..32418ed56d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTable.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -139,6 +139,7 @@ public class InstructionTable extends AbstractInstructionTable { createMaskAddressesBtn(toolbar1); toolbar1.addSeparator(); createReloadBtn(toolbar1); + createAddBtn(toolbar1); toolbar1.addSeparator(); createManualEditBtn(toolbar1); toolbar1.addSeparator(); @@ -301,6 +302,14 @@ public class InstructionTable extends AbstractInstructionTable { createToolbarButton(buttonToolbar, icon, action, "reload"); } + private void createAddBtn(JToolBar buttonToolbar) { + Icon icon = Icons.ADD_ICON; + Icon scaledIcon = ResourceManager.getScaledIcon(icon, ICON_SIZE, ICON_SIZE); + Action action = + new AddAction("undefined", scaledIcon, "Add selected instructions from listing"); + createToolbarButton(buttonToolbar, icon, action, "add"); + } + private void createManualEditBtn(JToolBar buttonToolbar) { Icon icon = new GIcon("icon.plugin.instructiontable.manual.entry"); Icon scaledIcon = ResourceManager.getScaledIcon(icon, ICON_SIZE, ICON_SIZE); @@ -410,6 +419,19 @@ public class InstructionTable extends AbstractInstructionTable { } } + private class AddAction extends AbstractAction { + + public AddAction(String text, Icon icon, String desc) { + super(text, icon); + putValue(SHORT_DESCRIPTION, desc); + } + + @Override + public void actionPerformed(ActionEvent e) { + dialog.addToInstructions(plugin.getProgramSelection(), plugin); + } + } + private class ManualEntryAction extends AbstractAction { public ManualEntryAction(String text, Icon icon, String desc) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTableCellRenderer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTableCellRenderer.java index 6c745e4e05..874ca09384 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTableCellRenderer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/InstructionTableCellRenderer.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,7 +15,8 @@ */ package ghidra.app.plugin.core.instructionsearch.ui; -import java.awt.*; +import java.awt.Color; +import java.awt.Component; import javax.swing.JLabel; import javax.swing.SwingConstants; @@ -73,8 +74,6 @@ public class InstructionTableCellRenderer extends GhidraTableCellRenderer { private void setForegroundAttributes(InstructionTableDataObject dataObject, JLabel theRenderer) { theRenderer.setForeground(dataObject.getForegroundColor()); - Font newFont = theRenderer.getFont().deriveFont(dataObject.getFontStyle()); - theRenderer.setFont(newFont); } private void setBackgroundAttributes(boolean isSelected, boolean hasFocus, diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SelectionScopeWidget.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SelectionScopeWidget.java index 70ce48205a..951b44c34d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SelectionScopeWidget.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/SelectionScopeWidget.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -82,7 +82,10 @@ public class SelectionScopeWidget extends ControlPanelWidget { searchRanges.clear(); AddressRangeIterator iterator = - plugin.getCurrentProgram().getMemory().getLoadedAndInitializedAddressSet().getAddressRanges(); + plugin.getCurrentProgram() + .getMemory() + .getLoadedAndInitializedAddressSet() + .getAddressRanges(); while (iterator.hasNext()) { searchRanges.add(iterator.next()); } @@ -175,14 +178,6 @@ public class SelectionScopeWidget extends ControlPanelWidget { } } - /** - * Creates a radio button with the given attributes. - * - * @param action - * @param name - * @param tooltip - * @return - */ private JRadioButton createSearchRB(AbstractAction action, String name, String tooltip) { GRadioButton button = new GRadioButton(action); button.setName(name); diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchTest.java index 332c9f10a3..95d9ce4bc4 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/instructionsearch/InstructionSearchTest.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -215,6 +215,28 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest { assertEquals("EAX", obj72.getData()); } + @Test + public void testAddInstructions() throws Exception { + + // start selection + // loadSelection("0x004065e1", "0x004065f2"); + + // sanity check + assertEquals(8, instructionTable.getRowCount()); + assertInstructionValue(0, "INC EDI"); + assertInstructionValue(7, "MOV dword ptr [EBP + -0x4] EAX"); + + // Now create a selection to add an instruction and call 'add' + createSelection("0x004065e6", "0x004065e6"); + pressButtonByName(component, "add"); + waitForTasks(); + + // grab the rebuilt table + instructionTable = dialog.getTablePanel().getTable(); + assertEquals(9, instructionTable.getRowCount()); + assertInstructionValue(8, "PUSH EAX"); + } + /** * Tests that the {@link PreviewTable} is properly loaded when instructions are selected. */ @@ -768,6 +790,18 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest { * PRIVATE METHODS ********************************************************************************************/ + private void assertInstructionValue(int row, String expectedText) { + InstructionTableDataObject cell1 = + (InstructionTableDataObject) instructionTable.getModel().getValueAt(row, 0); + InstructionTableDataObject cell2 = + (InstructionTableDataObject) instructionTable.getModel().getValueAt(row, 1); + InstructionTableDataObject cell3 = + (InstructionTableDataObject) instructionTable.getModel().getValueAt(row, 2); + String actualText = cell1.getData() + " " + cell2.getData() + " " + cell3.getData(); + assertEquals("Instruction value in table was not as expected", expectedText, + actualText.trim()); + } + private void closeDialog() { runSwing(() -> dialog.close()); waitForSwing();