From 1c5edb913c63e6247ac5bf3407cb18cde1978fdb Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Fri, 27 Mar 2026 11:49:57 +0000 Subject: [PATCH 01/73] new reference images: FireRed Image 1.0/1.1 --- data/reference-community.json | 2 +- .../FireRedTeam--FireRed-Image-Edit-1.0.jpg | Bin 81990 -> 74869 bytes .../FireRedTeam--FireRed-Image-Edit-1.1.jpg | Bin 0 -> 91067 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 models/Reference/FireRedTeam--FireRed-Image-Edit-1.1.jpg diff --git a/data/reference-community.json b/data/reference-community.json index 1161648f3..927c38c1c 100644 --- a/data/reference-community.json +++ b/data/reference-community.json @@ -158,7 +158,7 @@ }, "FireRed Image Edit 1.1": { "path": "FireRedTeam/FireRed-Image-Edit-1.1", - "preview": "FireRedTeam--FireRed-Image-Edit-1.0.jpg", + "preview": "FireRedTeam--FireRed-Image-Edit-1.1.jpg", "desc": "FireRed-Image-Edit is a general-purpose image editing model that delivers high-fidelity and consistent editing across a wide range of scenarios. FireRed is a fine-tune of Qwen-Image-Edit.", "tags": "community", "date": "2026 February", diff --git a/models/Reference/FireRedTeam--FireRed-Image-Edit-1.0.jpg b/models/Reference/FireRedTeam--FireRed-Image-Edit-1.0.jpg index 6e6d37793dca55818bedbf7fb8be3a31e3f864f7..bbc65a73896d8b1c3b62edf48e10bf40711f645d 100644 GIT binary patch delta 73888 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 kIW~}u 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�L8OSon~gFW6kG&z+W9CdL!HU8^LrcR)M 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

g0*Hq?q z>R|#X{w#0#j5ru;D^v!mq{|}gv{b;i`P+Y%5RMw8o!Uy4o~}ecdZJRq{4o*OI0}DJ zy#8bIPdR58<_dyB)nJ7J|^Y{K^{+E4N7I}D$eye zrB9DL6}^OOU?T^;u1MPWh{aDGIJ7DwQQ1HkRpGSANWZDOAKe`nZGZH}e=AROaMgOAYRJx3>ov6dr%%bQ|Eo2`qhMe`&%_iSV?_!K7DEPp+L0UB^wa zgHIBnJClDtxKK$=8!VmoJA1m|LNt+?wCE(j7nCum-M%!*|PrCwOe+!Q? zM%X!#66&p}TK>R(d*Hua>@?oqL#6>ZSdBt@#njl?pldfyzU%;}hjNxAiyME7{BSd1 z51smh{7#o!ZzoH;z%eHr=q2LiLN-+TVY>+X@m^xMJkn zVSE#Fd+OV;BKR;!{{X|J_5)?YNhmWQB%N39ryg?>#BR;MbNOL1$aR2L;B>*>8?@TI zU{A1NB##UVhO;<5)LR%?7=jdB`>+E_Th=S<9rnTBXVL>3vF-`O!f9Dq4xpyRhkM~t zYkq~SJJ{hWmqsQ%h5CP5*gM6LNCcfa-sFrjbU5NkU5Q{y_0`h{fu(nHP<{bxV6+J0 z(lY{g)H`4d%MdzbF4yT|Ho}Am;WNhn0DE2cwe4(s#b?w>vG?Gms16kX1Oe3Td>5@9 zh;<}+1B8-OHKmAn>XWBXj-i0|?}A{YShY1VdNx1)PTEJsdVPN|VlieqTqqqi9-hnz zstOAsH}_i!I9aLtSwPItPwlsa=i)9tg9$1t(gz=FS)hu>#pBf(>-g6H09#>Xa!Dn; zC(v!ap^O;kLQ7f3`zW>WktFoODxF3NBb|3QiGvT%1JMx;VWbYMHu_;6VZ&KM+R5aQiGe$j`9 z!0w(B+Lc!E7GIReQntF9p4YrjCEdNsH~L{4@s(9Vla_zwQ)v7%)!GQpxHZ_1hCDJ{ zwk(zj4fvn3K$#x&Q}(e zJ$CV5e~`jlzk{;4XEF$kwIKfhZ&xRcA@<#l$J_=8s^d()j1ozAHyRKG1Fz!iY(jHx zXnl$0`yzj9*7qY*5pOH)^T0^zj04eIpQ~i2Qq5NqCBNUkn|0~FBH5=C(PYvyOI9S0 zRh+d;GTP^L9q~=(e0!PZbxkLXB2#-HQDy7W_c)K%*S$=o8}!?Ac|)>lZiOX`SHGS?Q{*1fQjJ7vt_1nLnOgTkPCESa#>TS8hlo@)n#tp+?eP48YZ{>pwlqJxcsj1*r1!=8) z?oI85J`kCh$aT5gmKP`EhY2VIY~;$NuWc)Hap#N*SqL^?ySTZ;n?OCxY-~0i z{{XHO2#6rtuJ*y`2`pWlyKYzTcKHq^<3CJ@s_LPLtZi3-ld4uxLSTTDB(J9sVQB280EG8()8^ zJpsT-EX0;KZum)|WD*}$m5)#eAC@xmJePSc#kLOJSb1X!>Kh+eFG4my6YRjGE2V81 z8bywheQ#;sZ-yEZqR|4lCPfMkAfms+=1#rP!#j?3TZs_rYxmDy1x} zI-Bl&_)wlu!v4-ePRK5F+WyV2)7yWHPvMdsb;gWuq3*;FcdjFc#Dq;(i*NnvK+U5f>6 zBE+uO9^Y;;>g-ZQC$5$oeRjv0LMgO|TQA)MZTf<6QmZIC+Q!;_o?{9VN-!zAD-jv$ w6ppyZthWK|$6~kKj9|K`(7}p>dxK&+?d6Y4Bj^Ci?PIXmt+(ml0+3(-**esx9{>OV diff --git a/models/Reference/FireRedTeam--FireRed-Image-Edit-1.1.jpg b/models/Reference/FireRedTeam--FireRed-Image-Edit-1.1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25dbd6300c337501e6226428dbb7a628495673ce GIT binary patch literal 91067 zcmb5Vby!s0_cwePhVE_{7(hwsZt3nuVQA?t>24T0M7jiIkXE|OAY_zLIz&#ha?X_2Y*4q2jo)7ln!LCjKprZqD0|0;vU?jQ%U^In+ z-ssUAnt~?)H~@fkhNkbD=xW^8Q&s^0CBPSO1)KpFz#o91_r8D~;Dr9VqK{qC9ACf@ z&2a$y&@>yMiss#N4AGkdnj;ACqc=7*B_-e{k1QM&c# ze^9)&>wuQ}2f^E3w~_vX(EmLu544tlqOkvK-wSQ!Hfy&Y-+Ff&m&ae~Uq3zm%Kzh? z_Fp;YzwIzIeVaeNzkU9xjeqhD0|L-}Ze#lw6;CwBM5R{l8;jht_@D<6jK^ z^~(;;4fu=4eGwZ{l7T6qOov9^KMc5-*xPU=K7-BZ>#Q~ z`2EqG+v>Qj7B6(H|5T&bU(T)OTe;g&@=vCm&_}m9|0nmiqu~E5&RaBYrT%UIpHX{@ z00iy57h2+W4E!7GfBX7B70(730A_#+po^AN0h9p^bj)l3KKj@Zow-{ZuKz*Y`>$^v z=nVM-QfO&>zz9t_qL2Ol9*dxJ%8TY3p?id)`L{Bn=-EIBJ+}VY|I_*pIu2;uZ*%PX zS5EaWIzfQWUyHXAD*vZl`EQNbqa_{x+B5nOzW<})AH9y~c89;(gwZx{dH2zIR73Cm z&^>NP)IUDm&Qbq(`fvN~+!OGhR*}Cw75`S^Z3ISWO!)tzaXUlYYBfbm-i{>KznQv~ z5kr4P0ZFt~CqVeGj6S;cwvzvyJ8q>6&|}vTom-8+wR1bNRQ`?|f8c*h-&)c8+yAyU zZZmLO6aS#>|97SmLi0S(`MH(ULATz{4DSCy^1o+fzW=hu_kZm1{WDMhSwSO&g$V|O zF|p7;SXfxtIE1)3=nn}20UjY42{}0#2^kp$H6slLB|Q}x87(UF_0hkzU0Ei3&lMLg}D8Ph1G2vif zVBDUp{`r6~!Dt_GF#tStvpy*R!T@1`(5{0)*tlR20S3CA48X!>6(m>0p)jyx^NFs& zrOZY^g@)cyDNzd>`mTSYVZRTHfwv8F+Q(L&a2U*bMB1d?=yO*%gQ(Dq$tVcfRbf z%Jpx5J_3Z8XhAYeGC&@vZoH}cO^9gsrMPJ$hU?x?AO>@0q9@Jce5vHg35aof9+1eS z!gLp3&>~IVg=DP+TB#?NDWJktDU2K`sfdU3HP~2nqCDF{Ti!t|Je#s@F*J&tg4j7s z?DwdII+P0Z`F2#L;=81yyML~Lo>ygrMl?VyATs0_IAyW|dqwvk zjI|rYt_#n8bQTUxw=KTt*l+8wwGNAR5E~Y0Mcv)vd_R68Gf|${-h|$#6<<$>ufp$_ zI*vvrI}Uq`Q7oh~-#o|pni!fZf|!DMiK^q9#FzN_z+`_R#^BubcuIJ-YFh4}u7j@Z zQ1=ry76f{QbwqMq(=}8~;f89K@#X}IvMst7yE1PPJLXC&S53Rs$Ci)|$dvOp*q7wEX84RahUOR{v zA7Mi42xfmnmH`Xw0t?_QcVDeDgtQ;D87qo#10a2=oIijRill)yVUl~w<$2tUO5Vcz z;SLcKKO-dO_SB8BzG64ji5ilj%UG!0r^QE7L}@*ztDVG4yz}1SD*ANzKrSJLK2Jr6 zxza}6aHRg@76DVA;-EaM{txmF-g0B|2Lcln$*3&ckG~7pZtQ-5T&n3UF-s==%QTa? z^@@0#beeY>m;%r4*p48Nj|6POmd8(UD=iNc1~G|dMsYh*K5s62t5rzwtJKZ1<I#QNxmb*;RHJ| zR=F|m!GrKXXr#H2zyAQdbSe~mdU@c+QIO`el!kN$e9*kaIyHKniX9gxx3VY^n8cKC2Ir-|#%Wa*(!deiwzHiG(MIHjSPK}|nFV2ii_sPgK+ zZrDYx<<_a!309|*=aSe5>1(i^bFO(HS5`=rT5`z4&vhg{?B}eAi2QYQ*jT9{Rfl-p z&?nb1-X}%{^u-R$ZYI1qvv{nRQ`qM?F@Z;N-J26e_>)V*WvOFHMQ9%EUIP!l%o3a~v3IdFPN~$zkrY1N8@t;vZpqRWVG8RaxI+i&6UDExu%0ONrDsBadnG)6 zqdV`UZfg1}Mg6{KB0!K4a=oD^E2$(ePF@&|r7 z7EVX=6!PZ$YHjFTzvra^io3Ip?~TZ8vzUec92umS3QS5gwumA-PA1Mg;d~;jrv1Cn zki9}NAEL=akeVkBVe0N{PG-1IIWJ=Sp{q?3SN!uij<1{`rF?64ri8idS2tC}%|L&E*+lyvwAtHb?60};ch5Ws zvS?04%2Uk+dXyrM17*8MXpaL+bWt%xG6p(tw?hY5%X+@!@2Z=(&460Dr!`uGk)&ZC zH#?Ep`(&i!H8FD!chKwkTv#J9DoKw9r^R1KY}Pu3%(()LpO zk_qMpZgsM8RM4KAz|SbPo?-k?90k1a$<+->N9(9qBNbNVh#-i&o*OCNk1@wae;v~Y z_RZ7mHz+WU0?`wqxs+BEQ|o&5E91HE$&n)+d@>(uxZN%F<%tBY zCJ!c5U5B(G3jrU*beJp`TGcc4TWUG3#s;1wp7LFzNQo{wiE7jvH>mK}w-mJf?mkS* z>6_dcwPw^l$Oakhl}-B<*VSc&!V#SMOP8V1 zoI^({9(1VjOJKX!KEeFCf&N~Xm`Rsh_Z{*16!8eBgSS&q9t|Y~OzM4{+_~4uWMCI+UY=mV#my$ZZ|@zd2WCp5=@?5-8hqxE#zXj4g-Hs) z6x-7n@aq;|!Ig-~c7Xa*?&2{-9F2+)g6I4!L#nE&JaISfIhpUWrjq)fejmVn%s~Rw5;UN#hPwW^-*M6|Q za){$Rm&wTgok;cI>-%cH+Ug$lzy^KVhQ4N>ZtRKq(T8Ol$aP2)BekK z8s?yD#c=S4U10-C!<1Jq1fPmDRwO`%-cF_r4@JqQAH^|6uWj(I=hswZ(@QRXh$Ub+ zc8hJ5=SxR$O^N3A$_v%f%?j;ETBKKq-X)mRu8z6)`(tVlD(ocL)H%yBG-=|gV&CToaa5OeZC`%q9G-t^0Sd=F73|paEPVMvAzq)JFY58Kl|0&*P zgn-X4MY;RYNm;d@nehX^U2{f>Zj-&t<3vrmdxgb@KOgMBWO__aSIi?mIvNieZS5O8 zlYVk3#$bn?m7b74mBbr=H!T1~; z>Pu~;&c;4H{Z9USw-`A=pls%I`?wEf7L>VPWqAT{?)V`3cSaxDe_aJJA#00)uM^y3 zWr_T=LVKsplE!%<9-291*h6~$_LI=J$W&4v{P%P$m)n$nSOhXO1`z51whQpX%uBMQ z^O9LV50;`Ci+oHIH3`lxKKpORb>Q+p08jMl{y4JDcY3x&X39!_%8lCmiL$S?#bWA5 zNz-dmF`NOIH&&b{rFL#OIrn^Wfmm(*)U!f92hf75J7GCdNrV_OJHb6|tgi71~m_(`b$A}UEueo;#6|+!TgIO`|Aa?P336F-U1%qu01I@;wYAof( z(Hjm8+%Dj`v&wZALLteL~_*c8`-w}*a*n=?bL)Z)T;WBH=|kSdL#)x(0S)GSsD0w$>fPBjQ&3U0J}=mv9#tm!`FEjb3Izjq zoQng#RE!O-+~&X{qxLdL(u9ejI9#cqUihn4K9`V;WSTPEVnR95%~N&sI?IQBM)drF zeTJl^b$|J!)T_4&kj_5QYJF#+N_Q;7N1tQM=CEG%{$d?&atE_e%E_`y*( z215ppVaP8XC1|+dD7;WmoD!NM4*68!TflH?-#yYy9ogX9b;`YwDw0Hyk5j2H8&0yH zWP``ZU}jOgU>P5&8CLvWgOPNJyUABlFj=O1GFxZLP=PfH5+rs$XQm8iTtJDdwm<<)XubJqv-d zr!rKCGlYuvA;{=MjM`}yin=x6oh}-Q0@WFzX5gn%0w+0sFoviI)k}i62D(G_4=gok zQwfSlOG0~Cx++uOMEn!s!3ybu^{M;z4e1H7UPuqVo2oaXmTTE1DgW1c@uvK zBpM;FO_asUHqUqf^*7;Ol+_%4v&dWr{2<~++a1sS5Mt7|_efNW3kwZS`Pea5FF(TR%e*I zQ3i&Jq7G?|i)+;8)G!AnJZko6?})@wCd;C9KIt(&sH_C|EPH1(e2C$B_*e#6Ukqn- z4`cP)kk5~8rzle@Qs9p}dmzk#{UhBYrFjNLBs&dDMaK)fT!cDZ`#uAnqnY~NZ*&B( z=s1FhQSn|IkiKLDX1&j9{W^?8*+&mLK8`I8%ZGDP{{aLT&99?K5AZQp_7O;sY8Q|xzEHRp@>tjofF8# zKEr%VXQ>CpkmbW)46g)z;`^B=E(YPrh*0<*F4s*+w!n}Q=&}VmtZ-M8pG~}ImAkY( zTF1+b)HhL4RVm#1khA0vU?TFpb`4}Oh+27@-aYcW_(U$$bxf|N+!cGhkt>(y0^G)c z`Nl2WN2FeV?0qF=Htk9S2HVbNfH-tdm+j|xadqkBNoBh`uI!}rw-B7&WXvJTwerVU z3CKtluF9tAQ%kH_p_IMaZ0M&dF&{hMmN-wztw7`&-I0-Ev60Tt16*VSH%F2uR&rkt zj?a)huUTg0v%P2b#VH*PwAM|ddHC+?;Ea0{wb$!!xR)iz4I{bg>(lllf9zE_Fp&95 zc-3USAyAjs&}LMf2QPCzc_Z>w{dIe%+g&@~Og&Z&Kzzj`X~pM!bX7HYx8$ABJ2%2s z(@~=0#v*V4-qBRsz(VzPDZ$+aw4bmKj@r8FFR`|m{s2X~n~cw=gbtS;;D6MA0U6Lo zu7r_(n&@(u%+0Ka1VTbOsr(#@@=KO13>v1taQV>(QD=JuYOOlo?|oYM^C20N)%w+x z$9)6-{;wp0iZML4#dq1RH1sIE{4)c8{?6C3tVXOnlkE zm~g;sJM)g(@FP2g7k7UI&&56->sP~G28nT(X3Gg5P?i^OYCd92>Cd-B^{dwKbZA3f zDPK`Dve?_l(Gkut;%i!?j>D|z6Lp;Fbi;vXlYY3|4at}9bOy06%#3=UTxZs_4wYU$ z%r-HZ;-J(~WRGjb#n3uZ=Njzl=rAnMrXa&eh9oyYN#M@Ge425MTCQVqoKx?idWvMtLnSlOSA z`gTr%pWS&_VE?V*^U60}9@iJW%Wi`n?G5d#*>AXD&2>c_cRiViigc17v7H-(v2j$c zqB5M+24?Rd67q#2Jl$>Bbl0l7_6w6%}EOTj-iq6 zR#zK%l^H2`>adRW5ln9dLq+TxSk3giUb~1I0D&S^m)oSVL*FXcJ7vDX4=JzkI)ig+ z7>nm$7^?pPxJJ*(U$?19?lXyDq%S_T`rZ9pMB8`jNqh!XnCeyu@=4N4M9}Cqb!e!g z$ZQiHMrDcZh>v{)$#IGoL$gcLLaVNbcJ>=eEebpZpaCL4Bb_lTXSI>KwCyzKX3oX> ztVa3|(C-skqijeY*pNAc$CkZ#Z(c+8C(hRtdGUStqavKp54>J~fZ&bCc0I;d$>ncL z+hG_D4RDT}hSF${X78{o*zyc}7ABSv5UQsk#@a-TIz8S`c{6g*rDK3`;0A1UsT@k_ zq90FL+|AbEn|<;K=)nm%B6?}HOr|xBNC_87srQl`u2XmW13-^(d)6+%fx}Xo2Vd_L z;(wJCNOojjd^_z0e!oR3pVx=Gx+Bn5$--twrIe^Dt|TGzB-8%u6^v!$+*Qn~ZoV=_ zEyd3?h55Z0{=@-Ml!P|87*Cg>x`3E!F5fwXzXg3!WzyhB`~Gx(8pxOJVR{mTOz-m; z=XyHo`M_1Ev|oLbfWbt7o$2|!N0%otT|4zaT}xv^s#w~*=?}}|7Le)d;0r^&@S(L- zyM=L^`@cD=p))U77YY?kGcqctq%5Lsu?JIAGo;fy$vdiLKrhPHx8VzI5%c7T`486N zKHZc_GHvdPkn91sRr@cUls$6xbOteSPvWukUtwflR*9wDbc)&^7#LA-zjmqOHn%1< zCZ~NEAp1*_R;Of$UBJA-l(2zK`msUTVABfy7vXGgR_BaRe8JJ`ZJg4FDhJTVd-m(Vi_%L6IR zPZmKA+|@Div!Nj!KMjUZFb)^beADf-4$3(LU2|cE{H-d2Y@f(K09ijI;JC=u`sa(A zsH6`QIsvRS2^C&_gNKp&LDZwaGaM~d)1$R8JgXM*SL}Tz&!9diyO$yvbZd6(fxI5R zDpRX{*Ix%7Q`o577Xc}LFZ*tN%D+UX98zZJt{>l6>leb6Ja9_XQhP1_V>onL5zES% zG=O(;qE`8iF9}Wwsp-?z0I-Z&yaq04@@?Bm1Zev>Qiv=mCJzN zgl7AcmgHAxboytW*uV$dcx&ft$8icT@v$d&j99Llrs|q^wZ60Tv*eVd3An~Cv2SHi zddfMIV+^=^e8P$X(Ic=ghTe6{jh1+H5||vX;@if-#YSk@h*Z?aG`=6E|DKN`xryiw zn0di=cPqs*ik)-a(NO;|*sl940vxu^FyC=RS&GqsB*q;jCW;v4Dt@qF$A5$3VuPO= zq2TQ4HZ!{AGE1O6zQwzy~Az(sBGNHS?higH{W51oGSF?&nn*QJE|a)>M(W zIt;=|1!>RwkB^5&Y^aR0e~xRw_2<0tX8MCFFtww6u)hRd7y0z8H!hiL+R(l}^W~L^Y)}K8Mk%`%CAX{baDyrn+nA zL;D?9I!~S`S$>;yqzp;1{p0(apWQ{YA@+?&lu^>=CCt)xhZ*{$%LI>HG;Ie6edoyf zn&9Mp*9@7p)Qb&SlV#QpsSQA0KPqG8%9bLD+ggP}ZHM*p9m)NRL-zP8n~t^~X08k=6`Kexd%E-$O>H>v^H2 zcv+Z8if$HYqD*7oD55wickm<|(q-+yV&IlpKWwL`N|k>1kr~uBVK3w`kVRY2BjxVM zj5?o4zR@F@P5v0Q=87*IQ4|K`q3%H(c-<>+OYbF`zIB2;)6z2>O>KJiPCWdoGwd3* z-p>INXv_B-p+s~eK96R4;tgYJ6ud95Ys?VKCBVw^9|*HNmn(%qDZ(2pJ&nFBdT2jT zm{(&n7Ur_T;KqiK__#$!Z2aEEZ(ym77~p##7t=(siSw2U!r&gpsF3imWV=IF#G*76 zBeMb4@K6wga}+Zyy33uXX3@l-Bf~9UljhY~;;iD_)C09uvO@LE0GLcCbKrGDDUXWC zbo*F&1j3HO{J{;SG_eHraB+q4XX|ghle|Gmd3L^dAO8Syc%xywuYFNdqpc=JOTB?l*1mq95RPdgJAn4D2+CyYqo=HgwRm+m?Put@3*M$) zO|vgl?r7H+&5Z#L&GKG5Oh~`spj`5A5VSmqd=8d zD$z87RFb40jPwBO9G{;!-puf}uaPa{<_md-oLxmnD{(au@s5)R@5}m>tRlo&?t8hD zLhjBz$p$5eU@N;eU|Mrw?|BjrUobLH;4Ho|Bgf$7kwWFX<<%4KE%S;PUHd3;u&Ih$ zs{)#}lT}C!vU;#8=uVsm%MT%RG%?1Q$9kL7(|dkJme{`3!D&f2hp|sC<6cgkKIF)` zlFBre*~5%{+)$@hYu>njGeU+rmvTf&(F1<0t{^+OiP1d0@0=?%{Mi=OJOh$77(`Do zkCTVo2=_%gT%nrgFUaX%_ytG;0$qt%hWsK~0NJ<{Pos{=Es>9I;B@4*0(zt6?D?NBaMtCu9wV6Nd_%Q| zQ~dR7q99cS0=vF=I0u4k&+Lc<%xgssXN^Zy76~YNpG?T4`mN$NYCQ68CWXM!FEcRw z2I|j#cXPr?HOHUCJUb=2XQF1s*e5Vp=)u^{rHg6zFQn<@sI3AH0a zh5_X(iy&FDWY*NIc~(hb*ho}_$Ex0c!I0S^4L|s$Qdfs5o}fLS2C6ji+PFI)emsHm zV;EpU25HQb?Pr-^C_L4EWFuIZHlyQYBwZoqQoUD*fjsx=!g;E#cczw+PWi0Bt+Zn! z8~5SsAu=#C|B0`h+m$W7z5bR|al4wDR7kvrz`zizcwb6R4}xvuQeJLe;Qhj+V+!4p zMUy$Hu{H8xc1ITtGg4k4y_6~lCb((rXx-!K13w_Ff1_cdQMCO%m5wx-ChTw%aSmZ| zSLt9$__nCNWPznLUoc?9TU}`F6#?hh|6PTIrAj%=F9hrg&4<+JP^qKF+4o@lfqwwU z@lPjW?;@o13Km;zn!oSVWijViXwd=ZFUMAPUWVC5fz7#lPTAzjb4oj3vOlk{p8Ep` z=Fdg0w*dx&{aZw(9*Irx&|YQn6uk26D-A{4wF}HBwK^PXE5aP(Z2~h5S$;>135mDAY z=XNKG9~=8cgm~!sfxuWX_?-rO7FGhUJWIv1luZ7FN}LP>C>(n&3h0Ky^{^^53t+DDDRqYos~zTqeSsP^xwukF3@aK}eM8e-7wYgk6!_D$T~ za~}?^Hn>;E;E#(@1yb(s~=Hu4{o}n67Y38|9q;CwHwWX3WFO$UJ z&?D*e?oo!3!CfOIqAEawooQk?c=c>7zUXbAG>1Q!K8{)_3iIQH6XwsvRnk|-n&%R% z`8_hJe8Wjw@yS?LKWS0Fj58NV?=eyQ0pja(1I*0`a9HSXh!8Sldp<&Z@3p5Z@srhs zu*A)fNaU%H&zEu5-{J@<(>QBVxA-Wxs8ITArtx2`hsd}#KoDLo#Sf>R+bb$hYpvH} z@OsUBV-G(&n^~G;>1FN>N1IrX$ zLGe#SaRc#}-dX0=3pFzKOVT&2RYcd8^J2Eq=KdHC%Oc(j=NEJ|aQwjBGiCamw?RWQ zhFS&Cz?0wdm(BDJl!;xXJo^cz>mz>1%TeB#l2OWjQX-U1PJm*5KgyqD?kokhF^M)4 zF%i&mE@mLT0B&3YZM}SD&sRa~^~Kx7C+*UoETl5Inx5Nt@xNVHNj#TpXKnF2FZ zpu$oaMV&)+$`77$@oiVg8V{oC`+tGY{{Y<)g-J1zX0}r}FnGB!zSm+kT&k1%)7QOK z`xV?r2DL>NER6#4Suwci>%R-8Oj?278IbDuAy#fQ4EOLJisgHmv~5D+bSJB+!p1C7 zEc5mGofr~Y&~u{U2lbhF`cf|mp6+zHokN!iE!u^*PZxH7@-}M~Eg(RS)M`xgihIGU z_KA%`v(^F-WP+hMgSVQ`o|-!yTda-=t0P3|zB{fMj(vn$-}3~wq`MqRlFwva#a`v4 z{sD3$cF7%RQ}!ub5AIDU{5s*Fz~~o$$*)h@U&fg|%njE70Dg_LvAXrHc=|-+_l1yZ zvI#O!$hNHDu=;?87<)(hl>)m*7>r`Qdf-RztJN6``rHuzl;O46K%5;s>Ytn8d)oO- zvNb}7wUB#+&^gazR+^wYJ-ixMYwWeH%-f8f&$w%=Z^XAM3;7;|8!lM+5#l$JOu{2B zGY+1Pg!}8a_fR|QSu5O`DbnT-kM05Ad`%b5NM$r`{;Dm++#mkvE7gQ` zrVy`T#(3L={r3Z3ah$Tm&cW!RwdjaZJo*hWWda9A1LIdI3S!hlK_2gSCbE(1!?mDl zlxxV_DPIx5;pN*0ve??)zBn!W0ObIWTDp%wg`n(wo)$;+j|#+@%~(b+8o6Q!v%S;8h3xw%9Vw&GdOW!mk$*7=#G|Im zvBh6yA<2Wbydx@qUy{M~$3pF$7*Nb`Pif54A0x$gvC?zYF6GQDe~@$M7O}HyVfst- z{~D+td2;W{ByTiT#fI1sK#&<{B;!cqFkb93!`0aXHIzN>im{HBdW08}2A@e7&ugB2 zVGMAOCR)_SjQ+aF>v7soMlG&9K^pkMrvpA{S2tJxsI4I{a}2^M9D%+LlS4kPe9AMc z|C&lAesr-35F3C7+}XkyVeIf#ua)YKiBe>L?33*mS+GdRN+&9nV^%Q3M_A{>$Nq%1 zXFJH~dnZ&7#OvNH&NbrfN!i1ipN|J7Z@wSW)rPLW3uFm1iXvuS%Aygc2%M!WCuB^! zYClDdxQb2sFzZ)LtI=4e{hIX;;HC}s!|2~8o;!oA>ppC9a*4}( z4>@Gla~5ZDb3Q=y1_^D9&eY$3NxAYCnOQg>!Ek~1@trBYoR0|ybbd^KPIqJ8oZOfq zd^x;Dl6I{&h5Jr+DmMrtxak0o-Lq~NnVFBNu|<=;&*3t6NHt~47yf+mY84;-@`G)! z*)%;h$~=_-r2Znk2h;w_u9=j1pV(f+>51|Q-WvF$@tw6hsMMBE8565uMW!tx9et+9 zFC2Zz#<#M25Lb+nbBfR(qU@EX9Wf<1(C|K@Ut$Bb^mBZ7itVX<4Rz+hNhbj+zT)5q zUwWW!HwdVD4MnkH$H6;NTaFm>vJ2<9Gjj25;)#9x%v+XH@xxk z10Ff`v?u$PAEP|wDnDOtWsBYqxSLTcsqq3tG?)A#F}!ueV?Iprx^YH!KC7%@T9!$( zq#D5zpZaA4 zB8D(0GFo@Wn5VQm;VHBNhq&0Akt^gsZkdi|pvjj8XLS@tsYw!wJo|re-qFmoQOhTEydPCFD4dLDm!I zuJiO3uLJV$`~j-jdx`!4bCb}|oA}XkIU0}rRMdIH%C|p6)V^DqccORdtR*Fxz?Ie9 z3{QDd`grWbexHQScY2pns<(7o)U35JT}w%4@-kstZgV@SwrnXx)m5683RGOFB!BRO zmwe|OB8V*U89E<153AYxa?E7H_QD*MMV2UrIF5Uu`r05Za8gv&ZQcATN87P@fGe%N z^}XZwVN0&^EU6z4bG>!aGtVUII^@wO&buv^uR7$%xD3>}qj;yqw}a&cuk3m=QY~Fl zejc<(xJpEcZq=|0^)J6r^&A~)II`j8PIs5_{dqtljx&xq*bO* za`6{R{03fKyDp+%OMc~#4)%Y@dO%F-3MV|1hwgi;j$g;7QaTx_Ss195ZqKVwDv)vC zJi_QJ-t^`VVT29Oot>90E{-==!t-lvyoij6@p$ZeC+i~fCPz3-i{`%9S3lBV5Uo~F zOm5yC=M6F%NhL${3dG zQ?Q=Dam*;szmEq{*!d0OL`4L*`f)w_-t9CqBWl9h>XM9p43IMc?Lv$Sbp=E+Uhxr6 zN#ZZV1z)dDx`(hlR($1#z9mxoj+|usF^Vk7c98wu{lrK!L#lq)j6-EeI@=z>T$Q>p zaMHZ|T~fxjgl-FlhcXA$R*6^^$s91O&L&7E>ixx_lHQCx&~f<4XJeply7tQ=L*Z+Jwq&J*Dx|i}vx^)>q|Pk6tI7 zBvS-~I`!{`9SIt_H9Y*CeY%`{rQYCx0}}&+K=;*wZkIpG7s@?CKcp z9Q4$h8Ib(4!^AdPBGN=Z5$=}T^g+Q0tkjIOj6`K^WLniRAS_8_2PDKKI0K8YJ8Stb zU$4(O%*>20!dU}rvsk#0zA9a+(C(|))YtHr9E;zy)NM>FjElIop|gr#x=!y^)oymv zvQ3LrB?O6pf=&9U)Uk}S6u^A1-=kMfy~j!8YjSdLY*8QjLPn|w#{7ZuivRE%-ZbSU zV~7XK%EANksKuBQes%ZLJ#rE$qEeuM{%rH7JjB?_Si6SF%GJ2f61Y<-@5jg-q(-*N z`z3NWSQwvO*>!0(Z`F5QLoX!!o`kkYZ+f0vcQe$`8(Her&GD+n-!bQ&uXtC@&4It( z>`nCC&EECW?XvvawP9g{aE@GYa~Ods>064gcaf1Bn6!qKS>o>4W$*wu)|I!ZX^O0z z(K1{g-x(`iA>`bYibQ&PjmP*Xy^C&;rBZEx1|-(Lb=)L!47(=NboTA`&j3~3wygFs z-0Upo`G+MzkW6=dODl=Ro&YLUi-KLccs?RS+5;|Fy$@wd2-ZE1-{v6;mTF?Jh3~Fa zR^_`gHKn9z+<8lA=2JCYcDKa(UPY*$Z297qXRQ46mXN`+5=UA#`uPkLfxU))CH~aL z^}xoU=2@F&jg_(L<4!j8m3x!y5U~DYs83KV^V=@hB=^I{N=oPa@pT(i4f#0X*lb?(QEB@d;AQN?xq&+^M^@mTZ4xc3fBax)ZhyuGK` zwV79L5S@=hzHK};ae(i9@Q_N|$R;4px~CtTD_2c4bQQG1^aj61`y#Vmh0YhR^P&}p zTy@hwMEA;jksP-oA{C=ce1e&xV=QUBc=86TX3oFNqS(->vF*K~ie!q5I=&4iDJ@0o zKrQRXXG2VSc|T-A!WKvQL-+pxNhEJQ<*JAstCa7!>v*3%SrX7vS3{qw#E3l^NiO0u zS8>#M5tFkWcuLVG;@6WGqUXi*5?e@<+G_kzNG!0)u-gktP-N*!LM@}5|%W{?ltBu^U4YX zGO^wf`Er*A(ARD4*{a_YQM5^SQa$fQe2N}aT98tAtkV;)hGQiEgoauE0rY)vk)AbM zhp936*<8U6DOGM*I5QD?F!zYK8^p*@r_$=iv(ucui^g9u&2@Da5j8#$CocX3{OvA0Gq^Dz((7lL4LH6v85cY&UmD2Ih_%2if z;+j#mmQSRlfcN<{ax8a8h#gGv^HImCJ@C~wkX!uFyVZFqw~cGocYlrN58$Qw`4Q+| zUwmOiB2(<7TZgoW1Nl8V2yq~{N$Sn-NNSy|(NcTs8uCf_tZuc=o>-Y9I`Q6|A35h4g-;Ochy zti;2rKVrMxq`sPnJ+Y;?fNgYNKSvYMHiHS0dax{4{uL&EzDdUW!qCWIDfhXn?*}IQ zxMv322x+7`fA!<9$+RuC0u#KCSc&=JgPRpS-JJ&!Fl78Y(qPjSX-4h~O}AO&#bhQn zQQi&Rd>VE#nBK77Od7CctX=M8@yLnH{A`Bwi#OJ>&kN!eg0-GUqX*;~Y{eVvHlcbE zk~osh$1Rl9giM2vXQpx%=os~2Y*Jb|n(XLLkzcO==SaArl9s+^+RVT#??fk zA`NB?safi3h@PL!!D547s#PKDbChoiOqK(x^8{6-rdZ5_-P63>P!#rO=)W?sGV!?v zq&z56=mA>{uI9;PM!sFI>@34|+qcYnkPwtxokUSi#XXL`%kUOwX`!0IQqC%JNRd?5 z8_36XBbov(5HgHx43iqY^|5_yr@VzKw5)k}ZtfaNK{8B3SEZs!TU0uj050`q#;ndE z`ppgUII(-%V&fry^`dG9%ZzVmZfbT9$~|m#H)gF2{^)0eLCWkPb&BH6N?`wl*Zmk* z=r(5I{M}-1iZWNi&bo#H-o@_)JuYLNJw07G`?0p+cC}S$j(M*2ZS6R}n+4?@?8D;4 zySvKS!(fhP%Bd7|d1;uwSd$Ney3osgDBfs;SsSVj^he^Tzr=vEP&gJ&f zrJsH0Q~ItzyZxbrK$On_R|`-Z4))56UP&VnUa$ys&R3-NDtNxrD`hkEA_4ezO%djf zdu5kt=z924G;K=6c9Fm)%YPb!b9^F;SH7Pi_TZPWcAJ42;V%FEK3N5hERah4+*mXE zpDpOcKDuLS%_GjKxL5d0Zsm;*&*np#+TN`;YN|20Y9X}u$x6CCV(qbh+Tw)SVFjcr7+GP0INQ9n(|Hy z2iAs9-^gh2){*o#AE&)la*>_-%o}k*m%T?QN)eM;LQkC|Xzo?c&GQLh!>O2>N<0x$ zkCFRyc$=hTaqhl}h-Mb~eL$h7Bk71Qxz9bXnHO$KCZB(vq5M%9`y7G358Soy=V)hU z-YyDvR8iG-sDXRtaLB}+Md68IX5sdAL09o!^wLyU)hG0l+-ue;EO}-Q=k;<+rFipL z>D1|cneaz*tfQ*uY8r)DWn}>w6>6swh>zEKTULuO%uORL?rqX;=EqJ3te|CiT%6rb z-n(r{HOj8e>~N4aRw2cp*cNHX589?13wZhB_6*Mp|LStyls37x_SQAq9u@JP5feRs2}PU z#9@`UNKZ9Z?ci7C+s-6LIlSIw9tlxc%^A|ek5_ycre^>j1l z{f6unTPQ7U&mx5H2Ga}StG~?R7nAl@vrn-a;g;MFAT%;sY7+)El^?34zdRBf8_01o zay;f>nsMAvaI9fyayW8Gip*W{t+MYQJWlWd=36E|Th;Tf){usDn4;fcMYb?MU?^E3 zl9Jo0ZPw_^i}Xt-(+?c)a?FxchnF-ryG!ajdO-mMT(6VS|F`*%B{xR(*;xe)l__>4 zAPo<*w+p_r_6hq*UEOQHtKb7+L(BIKD$2c+L*SI#6BipA9&q)f9EbKmj0tCTrkR!5dZD%yQb1_1l6QCq-+ zV9RHv?ZRF3QRz{t?iN+iTv&WevC!^PrXzE82_UOW`{OvN*I7+rM4*ZMJw`xvRATOx z^@C~IDdy#I^OK-4>s5;-Uf*b~g3-|t&A2QQChfojx1d(cFbotEWX-os!usnQyf1?v zRwPfX`0DFfYZ~UbxwkskS~VD--i+Emv~ss68E*RQoYDi>d)qh5KfL$*4#R!&C7{^I z(Qq~8*TaXkXC6%0R{D#lJ3_75OG#c_06R#WhC{K-E#tCD9{)G1(@aa{LdTMyPJxr% zdx`3-))W)N!RD!sLG;q#?z55So8idiEwY$U6`3ZSo`8WvL6cy>@*Y|H?BJ2GOTpf< z(e(zvhfbFRz{I&HOJU@7&1jTQf(@v`UrxCyy1*#& z4-nYxb@I?)$(0GO@Bm)|RvfAjZ)kPa@yR$AMgl&L(*bFwiS&F_<2n|Z`u^&@FtcO9 zg2_FWu_V!c<e5j1oRXkaMGUocwOA51Y^U=`k2o z0T6mcF2T28d28l867(h3i3Wo|#kMv-U&Q|d{Xhc0K|j*iH4wk>)srk$tXr2LplTXqxguZlnWZm-_BL z_$HE58XPXe9VD`znEbg(*v3q6efa}p^#=o%o-nTvsv(WR6Ceiro>YHK6(vNg9p#1k zdlmtc^%oy}76enfF`7u2-1P(2r0>W({)Z1%fSO7wBx-mGsf}JRPfL;3z4&l;-`pG) zj2v}CKbL*Lmh6X~7z>ZB@BvL$pTvQdU@vxo?A`eW$M?V(Kv1-bQcZ(0A1&^7-qr`d zAmPTzjh)h|-hV3fbga<>exRaA`}Y?E>tlkJpcnoGghl`$5?y#biMaX^gDI(`3QaXj zOxx^FOZWO8rvBJfRMe6=TBwvv1&OhaP7dUY6ZHoSN-zpf=cJuc%?;Fpa-ce%c^1Fe z{P2ccwg}^CvU%E#%Ygp?m0)8e+74I(X3DT1S|Kp-r(3^(k+Sp7i2>LOMl zs^VlMfR4ba9+q+a@cbq;LMjUE`k9ZL1ukJ3JBXXfkbMatpOF}M%Qa;SOlhQ%pp={b zTCF-8y}$=!^9KkeibQge%w@3)X{=BFU@!F`;Hu_|SWGo^w^49a&`5`#``h#w7ce`J zjgv^hv9PBeWJVx~EYX5C40^?^dmaA(Lyu21;aM6lHZVV$G1k5LQ@H&t?}!aL)WZRf zD$FIPKmb_D6GBNOTcxg7=tnqk%e6LRNg-_0E%W2GjMN0N8=cH-LH!BEcR=858w%?) z81MlUebeN%k~8^fDQN6TLVAEV{YN};gI2y&C682FfLTq!7a-h$Zaqd1$@83>G-jTT zrkbU~kji$IMeacc&Nv+4*QZBvV3kvGaKnLfeaAark$|e?DM7vN!Zu3vsE^C5jw-0E zcd*}cy^hD}hVxfXO4CPASoG%Ph^8HA;@1`i#CljB++k$dZ8!}hMDg-WknQWp7YFJv zH_PCboOLvHDZPtW8}Hn0f71d09HMY8`cCPRnsjqcD`}Q!%7u=22`sxEh!$XW>`oL* zLbV2Y=_iJ{4V1?t0N{bOn%vve1GhLFxj|qShN8_A2N6mQ#joFxJ@*($@qtuDY!3{e zk>;r)+a4TnIOf=pRohC0hgCd&scu=A)4?2+l?F(pa%~+`5O)@`lW<1eiNln_im3T@ zEYz}rVBxxVu@??DKO_2KJalrk1b6AoVh{X9YZoiM$UHaL{P0yGQ>)CBQnUq04GV%$ z4aVqq1LQ!!n!6~P2oyL?`{{Slu?diz&#O6Ah zsyc}xnVO&jyQSETk09@BdXKI>m{DcZz}0Y{Ex*hZ5x(bf_3eq8;sqVTruGZA>{C9U z)fr}WF;!-!t=t$TAT{^k@Z9mv6la=GCe#rzc!U*dJ}D4%Fz0eR;;+{NB-FhTg;63a z3m)ga@3Gqx%&I+GlVr5j%55D9B z>)cr2b${3-=l~j{Kccd8T@NiRMqG-mytep-JkE9?k}Tgo$MwY}<3try*`8jtut@~H z5|&m{1^R~I@Imz$ndN>W>n$Z$6)vx(Y}+ay0IP%nDhxN$#6@Ss1c*B_4>riuXaISBO9-mnw$>^gX z^$KXNr)&HI-T3#!Z^fb}$};sGN=0G1w#0k~-*JlU`qjxrMM)2Z5rxg_6{UhkT6Q*0J5t688}TzLS&4UGXNAHP;LRgz433z>Ch+XF_)4wWpiQydtaYJil;%) ziM0&@60rhONmIB1NgI1x78ZK75L8h{4^qigi*R`Ouj|GhL1hdU7)ew%kZV-c-18Ve zbBF0_QXpBHzzdv5G{FlsLx0=@?r^U&Eh;jCY(=)l!PqWwyR8TKQ;M54@k1tpNCPZX z^41XB{7QqQpOIjGU}J2LOnk}kpTykn!>vmWeV5ZxR!to{Q<&;h^s*kC?xYZY00H0R zai+9~;|ohyG;r!YIhf^g8v`vYi&Gdq$re@v0)~6`B#VLaAp7B$NqDp2=Bepin^t9#%-lgNzD&O^hX9|T#MLB6P|CoA!3SfA zO*m0b(&if+tm~=#0MBH3CChWFI?kd=6RX7J`=5vt?nuQ^t$ZWbnJjNS*#%V4pd`I8 z695N)gpvo$3~o$ug~hM}7LTP_IgfYLEnyGCE@-q~D`}%6bdT`~X^sB?`LMVH>OdIY ze2je7sIQkJ@dGibqF|HJW~QP54ToG)k_Xriu0DxrEbfO=X{^6K%cKuWT~3q6dw@mA zKH%IRaB(wDfK*eqjjaCw_}QW_{*Kjww?y$1@9+`*aa4E(OkczuI-qa%)SGqeLnuC^9lgNCIrwtX8KgcSQ&m=F)im(sW?80bVkiWK z3L*kV=i?`C0QVRMig_oxkUHV}ElzhB&EJf+3no-MnkoMP^{4m7k^cZLGSA~KwOdnA zQK`9yD=tT;T&Mp4)WIIeF~_ZGEgHQVM<-887)SpAV8U&Grm6LQldaSB6%td$R1_Hy z0#t?!2nS=h7+C_H1UYpCm!ZiL}mGyQ0QkpnAy?Rs& z{jf$ssWKe?BQ8su(O0M!Zzf>Heq#3@QHOp;1&nKV3R$Lnf}hz!yl|2TyeZTsVgPDF zqW=Kx5(53m#u=#SYR2;ysYoD>j-W@l-x{0oRac+KlhaZxNVz1=3(A-4GK-Lp*bd^{ zk?p=(21LyPje3X&ZmS!66SfCcmwW|0P14r)vWTRLB=cJ?t7zA(l8Qs1HXNzFzCer{ zJ#J$f74o5|Eh z-0%0rVl3LzYqq3B^3*~Z}`}QLT z)XPskpPrskb`Ff6!@8R|xaVVQ@-6RytW*ygMHC;EdyBL#QvU!oB#*WqRdR&KXJi_B zccYO{nk7OkN?bj!z0}zLm%=y*n6Z*DSOQq5z~i25E&7ZvuBDt9{HnE>0Bo}kk~r=z zKEocSs4x~8l_Lm(kQvZOpZSICKBEpDwS*; zjrRND!+}8HLMZg2lM1?USS}9Fk8Y%qkPji=YKo0o2%b8{2c+d=*zyEi|Op zP_RKtTrSHMiL9ak2V=gmy$MuOt+xBxseXowgxKW#pgb zCgbRSm>MLJp>HxNI^STeYk|$dw)^1qjiO77v}bU#jrzeo9qq90aN4&;r)1sbg>q`3mJ5qPm*r7cQ-?7;Ifx;E&kV)qw!6FV+ zSlp5~7-3~Op|VGqQ03JUDpf#IVY0~Jq1yY07WVIi^=DA!KsH^RO(KJ|HGoP8H{tmM zp7?kZR4S06YLo&9026Kb9N{ucOE3x%pd#m_52w>q~VrpNGa(e8SN!i z1h%u!&}4v}_YSuso(S9561qyPw=#?KG__GotZXKRKtbn{Hai{;A(2MKf}mIG*Z^!z z@3oG{4fQ!iEESDCBF~mp?|CW7h@N=^Vm@OLIxu+Ht1QWTIovA_NMw>AS|2?va8!Ik z_csFIkD>ZuBnvN_F;`|Fo2!CYY&jrb^&ebBsdN2FmH@J>8KgsCSNJmb`Kjdg7?R~$ z-zKjDlQV^>Y6&1mSsy{Z{{YJTcN`IjT^pOdTDcxW9BSz)gQlKlW$J;Q?rb`5>#^AE z59@^a+DTD3mNF!fMYcT-2q$oFzdTC7YH-1X zmMaT~1f9jykZf)@0|L?tCyln@HPhy^(=m>zT2Q+X!==IBy{vY(Aal+R2Pv9WdRg9* zcacLSxKyIr z4;=boT=3?Q7Hqbln1qXZc`Vx&wSgw%VZm92n9QlsHn0gge>3=NOaoDl33 zPpu@XLs`_Uy3VbKP>Cf90XHB30sgqZ^wn?X^oX7BWS!d@5Z%-8Jqtl#`B$kneC%?8D`8ihESj%}L^YR$rB$$jI}gDk2>r zdVmLSLvn5JiQ#ZAHWeJ0v@{l*-Ci2MNamS%mR!C$Ga7PBg;G4!=VC8r9+uzR6sl5r zFHsbcG&Ks}5;Bw^+=2?7$F467lU-*TW|l0oUFEV>)5M}U^LiBP1wgR#W9Hy@AEDFPXG3q6_z>U*U}iYc5u_Wv~5ViNETpA0605~n_(T^ ziJL)x3K`*`3#)1RUf{;fvD{uJ+ni1_xl3l5Txv-F0IkMPy^qfo?}lP^))X$SWq97( z?Qbmm;?rnFMtzq@GOtjmLI^#<`Qb~mkV0-Hnl$qsx$Ju{^~0;J!M-7?^>pvo8ImG9 zi;LlGS?zjQKbI)~0KB$8sJ1nHz*js03I0lOdti}B19bo|d*2Bn)KPTWYH1Yz0Nr3m z=xv46`My~&0MvPB(ZL^nKKKFw;G=7+lwt``->5gS0OCcb_1>`4tUtlE7HLAGaFEqH zr~X@!_QM%?B5R79ga(zTTAM(;;Zl8>FAppVq!9ke3%whf3CI6;TqF)clk{dHdzW~j`w zN)E9FMP$=Pt}NXS98$7w6#b#!76Kr~L`kHESMQSt)7?i5kmKF+0Y@@UC|U zfJyb+In*bZ2smyq$qc3AB~N>BN4^nl4U?B@*srY@1Og4g^vAJ+JR7=J&!AQlfJ&7dzh{Wf`{{X~4 z_|{WVlj+(ysHvt>vrj9JG1T&)17!!k7V^I=x~#uU&|($G?^H5EKm@Sw8C z8ii5v0}-+^)5@_l?R#psOkO7B(C7LaHp^u|#p#)&+i>a$Qa+$#2G8cEWBe|F#ZU8t zYi;R|pt_o}9KTQI71azDC@G|o$?O$LKej%6nY`Neb#9UeU=P!LDK;dd#IgYSLIQS{ zK_n~!fC)lfO~E~d$0L!BGSe~zXwk^z#>H44r}Y@>nGEutq;qk|={#VTcS1#6YydkM zP%`^ioxekhpzTXijoJl75fRe0G68XQlma$4wZI4Mg%mXMsxgu_Xn-~#b*1im_Q7>) z6v!GCXpQ+sET^8#PuPq(Q&KZ!k+mzKosb>wgp+;^$oq^UcBFtL-?B(vE}|l5P%bX7 zao@4O*o-NPNfP4AAv=Pnq=8~MCf|G@kj#?*0M_XmKn)YuMPE9{#vC zDQcD8NERuTE`>w%lk_`%@Dfy^^XMjokz(oy_3pcVxNt~L=Ct-oYhkMycT5PiC?pO- zZbg9`q2Iq?N4^lz$w=Yjl9`~CZFMCZzhiOs!>tsuksp^(lc^wo6#*jP_gf#-V0nc^ z?;{B!QwRdVM_Tc}Ja2*y94NfE4Z?1M8DdxbtwObh!nx=tdvkjqsTd7snj(#>sHKkg zvw_k*x7;51Iwg)exgIwvq;!*?h7+;;TAwGm4is@Bl4lX6)BjMyEHz=O{=!BErFPb{w;TT{p`-^K>q z+xeFM-G&?$8-;L!@Y8uqQRdA6G87vJ0D*hZ8p(q175@5Gg+rfiMQf_akwz9N6Qtr6oHCiZ_Xkx{5I%8(i#7`98REP=n8auD ztt~u=Nh;fcW9V!~70(RQ0^qFb0kBhhbK9I5Cz&~tQRP;&agkwuyI+DfKE9)DAeE`5 z1ys#W} z92GE)(nSqDDMlluw-?^V*Z1v!EC;fbO!oIvS}gvDGe(9gq;q4{1A?x+@{9o=ra4tg zJfdJ!Ywhrkhwt1F57&QuKUFI?GBfUzxi^EPpGQ zg6rS;WFHXv-wowg1s~#p5xoSi(X9DK7RPk~TIrxb?#ih_uz&hFl|RSX>fF zWISH>*zkV1=3lF0Sh{oS38)7iX&!V0@BVcL!+zjl_M7s#ojI2+t4ZR$!Hz*9_xIZo z8)@N817v9z%A)CX#$l9Zkkv#Zl0>|LW*c+1EEqK{9Y_aJLHQ}77FpsqBc9`Z{SGD7 znS4{UqOP9p5Ef)MHYAOK?TG$mrRb}oC=^Pj_Er{Q&vCvCyt|bE#xV~{U6*DQQap2I zHNWC(qe~}90N65+ExpCBirS|@%97tLu9lWz!nroS_OlJg z)M3xVT+cPhGdj34>UpyYd4GbXh>#-!ZfX-y`#bUC=dR-3uFgLyJ zY*dtuRY~F>oYGI2O-)ng^+@ErqA}C~CigZLzAmiJqFOB_GY*pz*-XqxP%e4&Bi9uc zmMdA}T!b>U+ENHN2FOLhz9+}M?NrVJn_QBvJdai6x`jeRRpr(Z@ln){i9xa01G5eL zU+IEp(e$(C2Q-q0GUDG-rsyP>TNAeQ4y9%RFW=^0J@(-aSO_P zL(ek0x5{IbW(uxiSZYaT8`{Yr+ZHU4#%6PN2+VJu2)xwQm$ z7Z=`G#lECi`y4uEx_3=$`XN0%YDi-win=!hf^YoFKqp`}ARl~JS$3hNtDM7B(q*;J z%oT^G=YAOMLHD*DS5Gq4t!7P`%adjRk|c-_uX~-qHa{WyV6MLEGa0L4+u1G4^p1I> zYwD6&Bdp7(1Iw$4NeV$bIOR=`%ikRFDnh;=X68jwOlSe>vEEe|=W&S!Pp{_5rjIYz z5hNkUOnJ2`nJM3qX;cfL^)|P#=Mp_{rKmNAhpnQ@>M5dH=)r=j1`D60X98d#i1bK=ylx4$$G5GB#lxc}{PuVaL#s3oa7R0EdG$DtA=KqIFa{rG zmZZv@L>ZxV9=5psMiVwlu6P6A68M@`jDb%yZEjY~KHu954Ma;63n($j>2uVDK|FGH z!E12g58>E(RrO9pEnv1jpy33$ETZLi`Qp#4qDd85kT7#@1^)n1gpHR#+jJ3cLPiO* zkfL@ITy|Bf<@I#usa1jORPXk{N6AaKI>`iwWrl(8nr zt$#u>D{@t5;Si#Us3uYbl*rcSq>=mI4ix$RT;K^ru%7o@kJNu`ESoBU@7D_a!2Z~6 zsnhVXGe%eu#f`=#83Ve3*smNXIBRHU7mlhXC$V4;=x}jBMeT9xh_tyIf$&Xp=tdKo ze8P>d9Im$Rj7B9Aw5ZHaZy`*QH5WKl1jPr!aR-k$%_7<54{pw&{rSSUH7tU{YE?d^ z7>}{O5e;%+=QT>IW@ZO|aLXv2T$FYIn~(_r{P)Kq&$9VNnn@xjv!S=@FNG0HPe1yZ z;*$N9fj_4>eFC;m=99{sX#W5id`iAhG6@`G!>~ z`WkzzUI2R*)C$P3MPbz$O11nlMPZZ|vQ6yjqunq|WbKGzCI6i1A z79#OU3yX##IV?{-mnku zwnWb;i3?Oxsy`h~8BbmAEI#-hJxrWU=pkjj#8@ zS&|o(yy`fM6K<}P8y~8WPuBQvvJYlPjV`tRdytv zuw!C(;DRsuoB>f(u!>rkz$67M9C!5q{qg4WSs6r#$~FP6pz~pE#u|u52z4XBD-)}= zJd;FMdlDT!kS{D zAm5mgh(GqWYaRQ559@}ac}@twWTK$NY|Rq}y~$-LM?J^)!DUz!k|||di-O0f5x;T2 zt_LiWgg#hPb6`=fcs+>sz!IUn*yE8@n_9#bVZFO;-_s7!@P)>^r8N>%MHG`&QPWQt zU-gIq-uAI%AcMbgj>la@XyaCjXn-sM3?u^9zcxMo*hw#!Ba;-(69y*i4*d5U{jhvV zSugtKhN1un1lh06>_G%}#GnEc4h{#DV1a5XeELenW-JQ;-6Vmvh&vuTUkN1_mO(u* zLP_00jN5;w+XHyvj4(*%fsWQEs145G8y^0r94%E8{ZP#us@GD5fE(YC+jE3Hf_=v1 zAk#Fk^)wYOqjA$H+k2itw{Jm%l!}?&^o^ig9|}sz?K0_^}dz z^Yc^mz$8j#c;|wxqYmVJYC-qhAABVC2;3(uw=bYH@<$x<##&ChmJC4vk77pu06cRv zK}hQq-8E4#ED2I=xddO3ez;8}lZ%$}ssI~wkWYV+!BSN~U1O3LMmz)5r+baJ!ru2n zLrB>Lsi|d^o++LZNgyAH4tt9c-?kM?4NIyMBvmR91J(m>0q%Dnt`k;7#H&Q@a7YU& zxHrFhTwrj!Ax4%rh>Km6n|HamxWm~)pdLaUMKviZ9Uh#P05YDm4DTll2XVLMPgTUVR8=q52tJxVPZVgc&8WS8y-&BDH0|jXJ$rQfz@z9 z--Crd>C-WJMQ-qc!s)(Q>#NOXq?}vG*>R6Tj1yp<3 zFai7R=x{-%r&H9)Ejiq5O}qTY3>6V=A_Yx50wPv|Q*cqi0Q1~o4PH=Slx7sM)aBI# z+*HxY&`#%@Y)8yt;xzK*4or1%ZVE8mgMYpXi6ismN?ON(O~{ICl)nA>7)fpdK7&+h zI#lVahLb&t)+_+0r~`g&@So6O;)7G^`soBuG?{f-+sLjSQ73(ae<}JOrWmJ*o*_K6 z?HdabEGMWCNxkju>ws3!!BI@)RHV? zVPHo*9^%+%tjeQ~K`bKV5Ns2vl-%6f_8{U7l{RgX5&i|8OHT>h($0L?4?9?!kEO9B zhgr(XuxHsc^pae3RnlHqufF7R2e$YE)50+zcH}A_TU0dK_cWSC>a}BntSzuMu^qU@ zso~X5bCl)qR8q3fNh*T$(;J}%_qF#N@-a^5wGvlq8v56Dc_yiMEDpq$Cga;02Oy=W z%Jk(VbHp8^r$TN>0FmlDVrk6)spB_OoRwDU9Jer~o}2tSqK=`#jK=HL6CLgeQVos! zf-y|^V2vKPm7CxYMLQ6?+R8-??!t_VK+AADy#l?VD-k+JEuK>(9` z9H5%5$ANDgOWmm1<~iZ$nl|P&fWZ z&8s4#tTJU;fFq_F)&U&c?2>Rn;>O=BDW50Ia*Wv4>5RgBiniTSBp@1j&i3nw z{3hUX2YcWd{RItWF-d9GRVL1izY^a2kazlwHq%pTES3=2Mq;&eKy5`^@t_vrANiMW zr?w0{*RqZA1ISa{lf=I<7MEGjN0i9_007MCL6VWp$oRpzj_20n++tBlmC(}W@n+Ob z6U8_-ng$IUf^U6^A5d{rW%`pPtB6q7Q=GcAix?_w75Uj;`B)q9Y)(4)esz$uR_QwT zqc`e$C*BE0iPy)g#?NarPwPbXA5(0=$d_YCsakM&6r_KfV!VD_&)g6PM)!-I|#W z`w#)Q)L@09Ubhg`RK!&71ND#4gKQ;P>Cw=C2J$yZ=r%Xsn-PW7@GNZ119d&g_{q56 z-wLR1oSj5aMAXyH3KpqC0UymBzfuqMz{@mX6^KYj1~~yEp2o)pI!F0}rmAo)aI6D? zrO2Ej?^7igx1N}B@F6~ELIfHV;RPh`m|F(kD-!20=j{jueeoR*E505;i$jqUG; z(* zsC6;D$QH2faPT6g^H<6-+=G6TWAy_bkxXP<+yi?Zh~L)^EFdwoi&1KV1d|&Na;FoKGO;`XW3j=|FH~J#Ss?I6_Q8o9-c(6W-Q4#~U1Yw%5DUn6|u)v#K97^1aT^`nloWNAzyTR z{fPd!a-`34*=!8vB6~=reZ|M$5xFwf3_(Xz^1%&5ASa~X=e8zn!B#N5c2n5uBb;6- zRzd2l2>W5*O-mw8IE*1Ipk0X`yb*uf5M3RUEly+RRu@Pju_0Teu{>|sV#=eTk_-M) z#x2d7%xo{*SpN74r4DY9%CU(FYs1`>!1YFXJlN#|+jN5WcYrdZ$+%94fdB#f2s>IlYtZ)7d4K#ht_f+vkw zPb!1YPz`I}(%4#*wUIG2ldPkW2vu2w z5Jv2*0R099z@8B`)Hg$Sk}!WWPZKdamxRV|zjP~qt?&tanPP62mIhJQI$Ss;9xO%s z`r$2KRYH=LPNhk(AfN}H#EcY+R_IlnFt+_A8vg)70sG*9*#+;ya!F)HA!Jq~zUq7S zAdkKkS}9Rlq9Dvk_=qY;rI;HY_-+WjYK=N0oq%|4etii0VS6mJ^iec&!bxH-tXHTJ zeZlm9mS9Nl;FtcrddZsb0}mWgCHalZMDF|iyWbG4&fTAB4BGMKnMKGc+JiC1YCWw z=+=sMg&~$`cQz8Jak)Lkk8eyI%vJ)ll^1J|gr0+8e|sO-1_n4`bU1QnoPVW=Dm{4ciAh1=(QlUU9(gVGZ`Ci_*AO#^ZxDKeFtd-g?&81?d;5poV56{;Lre=)VdKXo( zHwbOtxWnv(Um&H1C}u{ISY?cji^ea${Mz95=Lteto+ztSkVzdti-0e`>ue65Rcc~s zWh%szW;YvLbI8ESnc*#2LFOqW2T&hxnB0DtV0WZtqJi#-o+*5y&W?b#(#A!J1os;s zt~|oDi5dx3RXg-bEOLkqUx1ns8SD6QF1x- z++p<#qL{J3Y*Gh#BaKT$@DeUc@xkrJ4uWaCu&EnOx!yCl=aJ9pfyFYo5hSdqa08G* z=WXyOrf`A$ut?vkG64sFOg)Q2L93*d%{xv^iPGEO{ERv012IW7%^JrHk$?lsB>8(BaCAbGjs_kXcyE69KR$$G_?@ zBT)e*BqIGBum{%nBL-Bo@&%BUmKznbC?t2j*hbXqW->y?B1MXm)~BAwafbyng>aTp z(o#t9FflJvi?Wfn-k0x(qet;iNg{NpTM6Ra5JBX2BKVIaEgY-W0 zsGc-H!*T%@xb^zu*+ZJjMoFg$A-G_~62ixjet2I`Lp3!ZfGl!G81$4S7z2LB;Nm%6 zTmU_h#Ry>~z0@;Xy(7|tOFBu?I0tda++Y4qAifEqmsnIAulkq0z$0=!aX0Y-hB)QA z#-x=j7z+_={=DM4@VV;Jw=tfEUn-#?42@tw_{PL~9x*&$?Uhd;kuz`IT$+O{dctUx zTts0djAU3H`4{dxgNS7om|Tv$=6Pu|$W(%kz^j9Ot~fkl@im4~QE0Pxs`859I!wq( zL(g&B=03PlNb4e$r=4bs#H^!rVROL-#})0(+p^IOjzedZmn+p7T$MgWVXDchFSncV z!pDC7zMy>ZAewe`1(G@AChH_D2s@p}{0Pu0rVT~olU zNia&cjk)Z0`imSe0o-z#&UAc>3f6X~%qa?aYa^l9-=&oA!Q>ydIag0QP&r9Ud1^X( zhU5$ENayQ{^CR&NiCjgV&`U)n?dQNtCHLHpN8c7MRhU7T(Hg9>rYyo17B3S5!<~r! zgkKEixx9pN%*i-AqU&-zw>`;`D=1+sP!q5OA5cN#5hy8j9-FH)xn!p>qC!vPs#~hS z9l}2YD5!3 z3=$APJpf#T?lC3Gw3E~)nvu&9KkUfE`r<~y=j;?S=f?omApj^~pbYFqbjVdn1%NlV zZN?0win=-3BdCR$Z+@uAByZ?(Wz%T68a9pM^9kXaM!4tS3g*xyi%zjvh|hDe9FB1@ z!IX`H#~v!_>~%TnwI7&NJ#j?Doyxfv{YD6iN{*9yS<04cGT7g9=x>STR*J7ki$xTs z!s5g?uh$WJ*s3U4QiBsZU#VD>Ad*du$MwZoab$~k1-XgU@iS;b`}j=xgwfqrRFOdj z;#f_u+mVEZI30q*E=VTIZS=PvY&|^nB-&bew%l~t#kcGY{@5a>qL``t%me{_aAe-fAs&-qB%S5IOprCt79fL!!D-fZ5~o6y<&c04&wM() zHAJK`%?sGvb*V%8i~iUmRH#{6H;GFHy^>IN-+LP$wipD7BXWv*IAn#ICSWbfuwmcU z_(MKeNr_ft@soSTE-VT4!Qvv-NMwPMGD$4akS$|toGO-{=F-WLVs)fC&U!ZpQd} zq^+D%!6;QCQDUnh1$pNCcKhL>X`*b}WlVJMmsUWd$JK?S1^waxbzJYfPyLnNg6azsLsL~|881K8Ysuxgrwlm%#- z_af|2pKb0w_&ikCT1A$UQy)RI+_c%G1FOYPIkzUrcauh$HHv3=@Q^eguDP{pl1T~xk_C5V@`hgp# z&_VR2?JNNRm-%`AA`mwDc}>)ykz>WjY!aSiPO4;5rr;I2kaz4& zkL!+AQnQ<^4I>apD;XpYn7_At2mv0m+$GSVWCA*c1xfy3K|fJ{+X|Vg)qm>{wDE+v zWnVc>?`_5H^4k&DcZiYa$r%Lf?Q%Kn+u>ac)XNBQECi`4I*CJJe&XZ5wj2V4xO*W< zUk9AXVDin)g1H9U@(suBhp1!onIxmHRX5xgF|fVwxFjFf4O7jSGnADinE*QyCKunf z_QCWoNC6EWks-hOx3?Gn04cxP*iIBS37BlrDP46Gv$^wPS%|p>R0i+8(__Hg-w0u$ zi_eu>qG$q}08lx-k2`~JrURS7JB2j!sUVYfx*jYy7x%%rMNV@Xm6n`V#&-eAO<*s; zCgS^X>4yhvwAJdWN~EQ#fB{2W9HXEU(!~io?PIs!2%b8r8bzzi*pYk4g2%r18y~1R zSw3l&`K+_$-p#THb4EQ-n@($HlZzZM##*_%}D}1 zT>y1re~1Oge&YmFOC3yL#VpZ)Na-vbap-sN>xD5&vBXv?>X^;V)xcrj(%-fUmZhU0 zymYgvBol6i9Pir%08p1WZj>bG*NR#tsOThhA^5xY}fRJZGd!Yu|pyar8K60b8Stl5GZ9BAkQf z!yzZA5^Q!S>w?{BZt?ZBPDvY$f#2(dxr#^mbTY*yJ4Yc?&&4eYP+0ndI$J4yg)8RZcG3ArSL^}%MJ;3W*PH)|W)p2rHzvISKJ zCMn2dwfXOXDp1flNs>r}taA!gsHJ1lvMIfe{E>+UPS7OEC~8_*3~kj+?{Y=Wh`!?y z`uJJlW~YgvkjM$>JwS`^x37FGlP;QfT8c`xkRaQk6p>(g1OhM)7MvX=A@LGrnuxl_ z@e~pQt;pEz&$cV?0+Aar%^pMWtvU<(UH<^#iH5tZktj?vqO-hjc`Q+Zu^Wr;^TcDo zaFM=gDVCi{5g=KZ0N|D+T>P;-Vxu8Zn1ef2g_vczbyzV-u(4~{HrMBi;exM9W;7DD zUP)Cn3PB}ddxOs-f<9vpTB4SA5Y$S7o;VeVRW}StHaG3YFW3l}gNdw(UGlMrFW?CIlU6-MQGopDMKgBE{0!7X4him(SK3I7* z8BV09DM>UH5&?4&y2!l$0F>B|n7GD>)}8`onUImPim~PZNQ$5iq4IIh)O~SAYd-}u z?3!~dlvApqC1pT%=WxS}JEH*IQAZw4iU!BAQ2MPmPau+>bXNeI2}SMC1Xz!r7~#{E zxjlT9xm9&$Sn0YvPjx)(ZQE`Q@bc4Ytfrx(oGxVon+2!@NCx~k-2HEbRJwyIo>!)+ zGi7xK;HiovGo{jq01f|vL$v&lHFZM0OtFPbA=R?vCYQ^i876ktQnn7dwoN7Y>d7xK2)Ov$4Aul6f zl<8e5O;Hqe5z#}`qT$s5H{ZC$m6POtMIr+%pxWdc5I<0GMp>28)1vuNpeK_Vwf_J^ zhk@4`d^1d-b}e!DzBZtMMmXJg*IMxexw4uhH`#e9WRCqW6I=bL?fVh?VA#CG1tfwt z3<$bOWBL*Oa9njW1^~*83AezuM69AaToA(Gp5Wn{bf|_P(Rq=A z)?y0)2L6{Ay!FkUOLGsht!Mk8=W19!g*4n zYOwxnOyLOWU{h1N}`C;!)Y3VafOG%Z|%ot8bTZFMuz0I$^ zfW>gqO#!;sl6FTPx0(Q1Ou?!nOUpwj1N_mlxbN-{+Z;1f^@frrQUN!3h&}t;+t(KU zZ{Y=CrYA4XqLIM3Nuwwa)D!z+x6X3R-z=?{FRZ0;EPE1#SP((62K$0NuyR27#keRi zy0#{1A{hma$%`gO5_mRv_T{X5A6yEqD8e$&55g`;Xh{Q~ zKyX);NU)h9Wj5eNDgCc+wj-+xL>eZ_GpX5_^+rii$Rn{GiS)-}l4z_vvc!{qhaUd6 z!2bX)syhDwF(Q%x0iq5&`Vs4nBr_K!W`v9X0Gc*mUqW!jHweU9QsrcYywh|3sewH2 za6Vn}(dB>_s#RbBHjwXY-)0A#7bu=LHi|h28<^(Y4ts(7;Y-$5{#n0;Pyt0B#6q$^FIxmBGr!e=b;%0I*YY ze?kv@8x*SIN_G-2P#~3<8(80h3H#w!x*m8+Y1X2s12r$0);kiC5zhkT{jds}0~|qy zT_r1)yRt;llg;-Q!g&%nY=1K-2I9>SKE1*Im|aa$tpb(I7pMXXlIll2?QgyiXyhj^ zB+*Esh9;1Y&dL}Yg=qmG@4bk>bB@kx>4|Q&nLxFN!26%5KWraSGRY}P*<4#Y?Lgvtq~e(h zmP&`c?tI9>+~2rA(+lA;NdSsjVU#LcrP||z*}xbke=#CvsG#zZHs9X2IIdZ5wJt~u=;U+Rw-^LebqqtxmCO_ZL5LB({jNKD zV2WX~G3$dle8(#iCg9X7Ys)}qW=JVDN#_!dL(GK zBc?-RwfpVs>4GIjmHJvGos`^_D%=zG!U$Yx8CWV(0%dA?rAwcUO0~D|z7ab@Nb@0{ z1tAw?AGR0NP!e22e#J-j^iB5sH-9T z$L490M37$S2Il9u;|n@!ynw!SJfv8BWCCq}_JIBHRL;>mHANiJ*pcQ!ZoU0(KI0A? zctBZ3(NR1REQ=hnKwO=e+zx#=`y6piL{43!S>p&uXo$Yx^KLorFs4Bq;d*MLmf#Sx z3pXDB0MOty5vo*ws(3&G-8bNJMg51a3ABOsLL!=>T}sB!8Q2wlyB|;OgDcXWWayHG zC6Hg^LuMTCM)(?vz)4z!s*d*x;4!zQj{g9r3`0vJNbgT2G=LIJY(PAY56{;Geb5JX zAvZ=u0g%sJwmSz^k$d;JHp04jScYzdBXA12Tb=m_jCNSWvo}R*k}YJASe?6e!ECa5 zB}(<#t_`p2huV@CbP=?2fIyNbfRo(aZ@+PCVa3d9(_NZ56b2F?xv>@-j&Rc-P$cw~ z7qzc&K49T>GA!=j!wAR+#)qVl?}(gfO4gIIjChk*SlKz2c_FGn8v!U5ak1F@Z-}>q zbo8|uW@fb^i84eKs{lsLetE>B#Uf$T)c}QHP>Zk~K>Wwgz9Rk;R5cb^S5&PCADLAm zSPY76gzsZ<$=qVZHe)J;^fDSfl!~W0j*s)XQr5~+!~~i$RPTF+7q>Rt0gYq$Sy?CW zE)=DbF;LZ$vR#F?lH&I4ZHyh6>gtd2b6=IWPrF%Hx?s<=y78BXRPOzI1L`E zizLm#A)#aWSmfVgjt@a6Yli9Hi{MOeX%1*m8CxmRO)b+tPpE4es-yG5mZst97#oB) zH&O>GM{IK{)e+`%RZ$A6Sn8>!cqE3QNGw4j<9-dV!NmhZ;~$ASS)yF(l03?s*oKxq zlH=4m?0#bSpX9zMcvY;zwxg$uD9o4u#-tUw_K-_ zwb26kMO@8D*DDi%@v!#2!TJzz(U)ra$|#K%e~__NBpGS02)R6?e?yHgp=z41TT7HW zteF*cDoGtH+0huI6Kj)e6k%cOiofwSr(x6Cio-(1Vv-f8RcjuT)Ik89?SXr1k!svh zJ64crs>d(?01Wa0FViU><^)*p!Q&Rji=w4mk~tb!W-}i1YA?wG+kD0qPKnZ?8bt)yfh%r5TxrtsmXmggMQA}` zQ6pIY0Gumde~>?XE|#u+x+&IOjrvWG&>!!F%S9covs3}ii`;$hg)}Qv<)jjx#lp=e8-AVPsBp> zkHu8!HpW&iBO5in+b>t@{c|>a0LY+lCam+axP~UOcy&I@AY|Zl;cZE+!NeIM}1^!3uaQBdFjI%I5{#l&m`Iv3OB%`c-Hb1Du zjtuH41*C=JZvDnI<;9L>(K{|16Rza+xxB`6BIu~2qV93@meC(0D7s7t+`eN zTYr{0tjG>Dnok{zgZ)3HvYx#1(@H5LAk_hP*u?F|x z`eQJX4HdQ{4gi6&Nkl-ch3X2by$^MZ34x$5blR!Kf0vB;7TZMnBQ z{IJ;Yym1%vm4^hpV4nTdgZ9UvNm+@E#Ki5i);;?*u+?c+lWDei)K!?|L@l}LbtrrG z*kj8aQ9Bl<^1-8!94r%k+a}s{IlX7?eFif;TBBHs_E>^}y$>sHq_; zC0d0*dQ6e6_xA?)?MLw}lEWDUilWou2JTZyiFN)P)K43DY(6j#m9UrN{Puf5Xz@u85Z`n zt#Co~!&s-7A!b-u+j1it{XxX5!b*sfT+>t63LnZ%4Cyeb2g@KKBH;1B-vq{oxHkDu zBg{-MtEDLL%Sz<>f*j4W7HUb+EfGgHLM(duHw2qli+kb;n9<1utg}-a+}M$8j>LTJ zi>E5c+fGTS>ZvGJe6pu6mZvSMr$s#>i2fD9+yZVd*kPVroieQxo=K^am9s-m6E79Z z9FJ=okVVJ<-rJ4_FUf{HvF;X39ZU01&jD0G!5Jh=Bn~(R_B`>(KWqWxm4I+jfh63i z9=*ojY!~Kq-Cauo%7P8PS0`_#1?ItG6V8dn$SMfme?x3#meHWM!@I6e<^&+8Rfzsq z2f6G({qgV3G-BuBu-LMdJ^PD{9|J7Wmi)lDBoQLpaenqV6tSb;ISO3f#YiCY=t09H z1QcXhwN!M5Pc}mdBwb|d0PnFIk@{gBG_gFSEQ$%aJAirj!o4}C#%-zSvPl@Mb#fAA z0ESQjCcy2u9Pf(@Q+Q1^4G5{z@-?4~y;<|ZEr1l$mI z=N*b_Ssci<;say+@saD@Z-@&BInyP#l^e&;6rISm=prjrt(nB z)9Rsxx%rHBqlw}ZMN=(1NK16EKI4(UZ%hK2;)*_)t7cXv zoI7xOq>FMvAY2Z69@rujH7Z23ur04uqVAoT()Ng?fr$=bznw{1{0ZA-Jp!XOoM$J-cbsYc_)wbN*h>7*X_luoB==_DFh)HpBg4f@;8)2`)^+wXw1(}zkt=N!# zBSHHUiQ_dDtm&G66Gz!sa?;F$sK(Z?HyiRVix(r(P-;A+)6oLCg(4!zj4Tbs!3W=b zHDx(1CSYDD>s^^u4T|n=tVrkE4_R@|GB?c)7GX3-YE?kU#1KQM1Rlg(@9&EqV7e-h zfYES5ii5=s2N77K&FLtP<~EGYO5@!KEBcG!WjBa9HeqDcSs|pChN;Vi(4SKi8;_y+ z3~dulDpA7+TF4ePQY9C?fCQ88h;FO!(?@C`&6{bOb1CL}VbK2oJBt(b2NlfCCaG8u zIlF?XO&OeuT9H+vHEMb1ecHHE2XJih9h)E>H3hDxVcRc>PqZ6;$bOz}{#eB!zf9>~XV&Al0O<7sfa) zlNda9Rt2d`o|w>I{hx>SBLs}SW^zpRDwntmF#vt=T^3bk5Ba*Iaed_{_rrdy)RbCU zil%D3#gQS1NZw!uz>)w24ap;6jcvIr$y*$bcw}}-+LOISJXF;3GuKr`(xmlCPy&sP za>AKd;B~nz(WF`eY`bGXP+vkd_#NQFKyU1!4xJm1JD2l9N<7xc?k!w4Qz03@#BMyMr-c2FB6X?we}zQ zu+1lpn)02kHBB8r9EoWZf9bKq-3O2P>_iH@lP;Wh=x0KIQh#h~oa;|%oXJAw`8Hcw z)D4YA8c2Uq2_LQ@*@uF@7-nVJ^tCKR_okLeNct;Sewe!tj^cG|V~6sgb{|cYdf^|p z{!*h8@d+C*@pQzBd-PTUKIw+7Rj>7Lh}mJu^roE6L=0_H`DAH}j><}?0D6PYFM40Y z$A&OedEenRvw&_RnzhP(K(Qn1izg||X)>I;Jhv~RrlX^XS~y^gA_4Li-`|sko8!2{ zY8ICh@3M+6ozrpNC5A6h_f!{!{{V+9p>ineHOz9LAOLwtCv1GBf(1N||@zr>wI z(wPL6eY*vB@lxIDSpNV~ejGLaP_0pu)KO;Wn}w&8$1T6za0UH=IEvEiZxXaUam%Z! zvkGY=ur#@hMXWu8i-GPjyHvO%;|J;g02~+MMwQcgk3+>vsIux>lwxG_q);9d0J9Z- zS710j@z;2N#MyZ+b7lgY+$n>Zk_%^OaQiIbqV?zfBxr3zm*x~}NtjVn3Cq*52_oN+ z3AiBI;^c3L{#iV6sz&owFa!hfT%XqlcomZ^EPB^4%8OJ{Ngw3t8HLN6mLmKT2T1zh z-8@0h;GxfDOs<)j`I5X{9Uue2_u}~LvxDXgaSHc`B*ns;A}ID2Hv5HgX)5hAm*nyq zO2v~f@^^5ojzB-=8v(huz8!TQpry+zqpZ}1uAY{*ofGnrC@W$G%D5odcL&!Q-%?K{ zK5v*lTbTZCjV3Cy#KebQMfc;6t|S`ER<^Cmbp0JLmP*<_5HH4Qv6`88CJ8v%QQ2qSUG+Z<|fJWU*I(UL*Cp(E{lXFA^NB9^-x7{JitKuTh% zsZbVpBw{X2?d#}3{qVMmSZe25dYBl- znjH_BWzY=5wm7NcLJw5TK)v?Z8=OfLCC0#1^16&rw@aKX@H?sgV@;K2`T?ml;?*Tp zF;h!VDFnQcTV=5( z%ktW)1=6(LHPzJ!lT}L*e=UuLqgEsZJKXb$erHtLtusnE^Dzcv1w@MqG-Qb&Q(^*x zV{?7^#=&TFXsi~_SnF@@s1Fph{SKPc@0Mk?v(-e9qqE8YVB``;*0{BZ`QRE0O-Y{A zJd@1O(ndgL0_^9|bK8?_61i@3o#%~~CS2(u>HM`j0uj3hU@Q&$08h&i z8eE&luMuSxlGLt`%H$V~S&S@H@nsi~{K*3nbqTOBh05R;Gtn~o%bTs{ns>K<;#XOw zssgu8Ud%mG$JekR{jtqEqw`GPIgXB=BMBF24NcH0SlsW=I{}Ul0{mE|m`#`Xljlu) z{{R|k)D!jU2kJ17Hq?GAcwt!rYwUuTILeEFwUH?4Vh+}kKmol20C7tWexH>bim0Wq3HyeR{ zyW8Ipk(_0eeje&9u4zVRBvlfSvx2i1YYwmt#lbzT$G$Y=APqOQY@esU&HT_ey~nbr zYNV3#2$-NIz!?MBT=(yXNNAlj`jH)fJg)s;z{_32u;cOT=TzTeqHeQl~H7sx_Y*v zw=xvDlq}{L%%BGWE;ctLlX0=fv}T!?S>`nq6q83!JP@?!%_M>WvEZLvDX!5~lIeN# zIvC(5E;1UnH3sgXjfheJ;9s5aZH2^Y0>Xk^xSH`9brhGwxa)Hbc|s`b4Lp$tc-hBT z7E^FV_rCuCt~5m*MOTy}ukr-9HfV_f!0%(h_PNGm($%Y#=JeT>RP$0mhUR5PAd4NY zI}x|n7xcN#L0eBrB`m*~Jwbs$ZUF}7=H9r~>95ln6uj%l07;b62;-lWn9xu>g8llZvNZX#+u=iW(X;lyn&bC?J(2+Tb5+V))A{XbKQK#ksxN zP9vTr<&?EDW!a<^YXp!nNgl-f7P+_^>_^`d<>NK++eYD1@XuPB9Kjr~C9d0bMdoyn zP)M}3bkan~gJ9MpW7v;>Tq1@sPkCso4M9N-Dah z#>fFSJM(-){{V^|NAP8gT<)Pr-um zwpy8kwDlQEv^TjZ8FnQ11dIJJAZ2+$XgWii9+GS?w|n6-w?uyQW+g#YB)oMxn*WUaxd#|whq12SL}_S%~S`;jk}(LJ^c;_z?0Q1 zlEe!3LPrN}juX|=u!(Exr^1Ek0t=)rDI(^1NUXzo_})NQ8)_ zXzA`4o0yI7&u#F|p|Mg&WY{UR2qJ}+SgPseCdGlcJn?Wpd=3cP^C>dbtEom?I4Dm& z`1J3A)Aa6<)=dir1goI~z4#~g!P5pDunmZ2^51ehkf*Wrz|clXyCqkiFZuCh zCOM;I>R?5|vEPt*!Ve9^V@FprRTy8)n5eeK(G9-Xa`ARJhD408)Ida_bTom}zXV~k zMg#uUP zhfd~6AdbV-%7fPoJ{?3Q&dBKp_zY}#HjT&i7_l=n%)czlDbh^30Rhb&mi<0+^q>c^uqW$>SJjm9R(?);RuYQF zrI0IdM3JhnzaWW0_OZb8OuZ{8_2okVW?aUcsXT!cP_Q3O{{UP-^(1pAiB&4M^382D zzSnu8ANw($OPORIO6YOnhasV*wL^cNKlM!LHHMPSs%ND9^l{GzUzn4|Qo%_C+>2OS zo8js@WN3ucGpodS>0s!7U+~3yk>!~L`ZqPLf$7^fiaOZp5nLAvWNQ*R0@mN(5?YE3 z-aRQ_O{V8sTKRJdaSNMti^mUD?g+6L?cW8vo4T)&ixVHEn-7!?QKhmB{+*)Fbma|r zAcE#F9DJJB2jp=~X5JrZ{WGayr^%`3j+S;w40FF(LRg^yo$X>habeYK9aX1fj+aqo zaMwSW(YwG3k#3R=z_GYt*kQlK`uJtf@;M=mqiLZ>D%%lxFJta3aSTt9uhLG)C&OzR z9Ygd~EgWc&-6^0ff7&PC(Bf03C#xt?dSc&hhkx&eXp9u0m8pb>-bMs-=y0Pgt!QiF zkQo*sAS{a~BKwPV=Q?80F)+G z;)ZP;X7SGAp?~p!#C-`P8&eYKLx%^I<=qbwIC{*nylyuNUHD+|u7g?D%cyhGvt^Vs zh|-WB_40ri^`6K97aWppz&P0S^y>sm6i`HwpbDy_000&M04x9Hn3UY^C7q96;BZT)aFDOk&Sat=6K{@CxExc+bar~6`1O>mykC~2es#_=#b6mWlI zfugGeW_tr|iT?QMdO~dN2tJGj{^K1%NoMJ2Ks(t;AGR699?25Ah}|2OCw=eF>w?`# z0gD^=76$_h2p|VPNe}nHjA_(BceihhpWg#vHl^wqUZ$-f79ofPfn(3l6_4XnT%9?f z4oR0u(N~)@P{vf)tO@~{hs=~u{MfiO}tVgUJLGHN<8;%DNPS{l## z#!;o|m(4;hjUtdpBZGOI+;<8_JKqj5kYT!a{GZur;(*rbJaVfY3E`iPtC7c;>52@- znvzlHBr97SOyGfL@|l4*7UXU)`=vGBV7cU)H^khvsB4MxgtNotI=R>f1Xu&vfVb0p zYYGLLo?$dnm2hrN`NS*nKcI5$ec_d6e3Z!^pvh_8q8ZRxoe*8)C%7WydJ(rK``rt~ zqo_z?dua9_3OkP|kmiQC@JA|&&GNe3npx=HE|^ImNT@npdmH-OwizK;q_2vgC@hBH zI_!UI;LSgq*JfT9(dM3fl@(cCVWykRazTuMRGr1`dtCZrMX2>YZLH|>lUGAa5Tb;| z8$t-{2E^XywYy_$A`ru4y6L)JWRu6C!ra}Qf67IsDC2zQo=S*Z)5|FH0*hP|y@}fv z{(GY`<<29e%7j0ccoo5T)R0S90zey)>xBAKPipBjPG1s5M-(D(V-oJ+NjA9N!sPeG zot0%mo>4u3PbfV}XEs-j!LZ+8M*H@~h;i+kj#L?W+8u2?DBeq;X=p3fcBF;cGu8_W z3*O+16NfERNj70c`6Z45m$?i{Oz9#T_|z~X zclE!i#90ju14&xl7pTfX6APr*rD|#Pj-9H`v&_L)^JGsXvyh|$E&(^(l25)We;Pb{ zi#W^9L!#DXGmeR?tX0TAK}#1ao{u(RM_1rDV%zSL9%xP zu=ZE4;rqfGJtdXX>TLRftMwH^i4hnE6kzTE1dGY)dvH6GbBV*P+9}kYLq={tOW-j{ z1V|%Vh`<8C7Y5&a4NEhUvY{P-TmJxDcy4}lxziaWH+*{lj!B&%vWbbQ5>{a;S3KTA z2>KI+Ej1otLpE8P)4`Z!)e2Hr+Sc{$r1do`-)#84Yi(GhlUy#U()wJqrC>-*x0k8+KJA>?fu|W87pVa4o zRaDgg!g@euVR9{EFZRU^25XtuX++3HUGnHEjY>izi9nQs3As1mk!)Mejxa$T!XF3E zn&@2F?CCw!yTOI4T}*R2diJ4cI$<(2Aj0B9VvlQB5IuReCH^Un!l|OHqG_=MdAzlBkQ# zyOjr}0OSB}N!t&3M~8ksXWb2&>bfmE6AP4$!I4L$q89yI2(oEJKa3b;3;>%izWuLC z5A?>Aj(E+lP@>+1e|&QuCh-nWO`JguRb8%M%7uV9uo8E(zxJ~>yVCwC_*a-xXO-R} zR%Y2mMmcJTXTO$ZL}Ae6f_@?2zAiZGDfN=&)j1Yv1hf*}ywm}M0thNcW4_?p*emg5 zu}$E1Whk>1rvM&*{^A4uF-86mYjYt6p{Jv&jwW9r567|6*9|EBBza(I__}`}V|p^0Tm3 zT6o+L2n#i@^d}eQl1#5A(iD;AGE>qgl03sKp#UUYi;_3r2ZaEY$5#Phc&DsO)8TKB zeNIitoXNaV5En+({z3eTy*kPZ+DoUD{%qiZN{;ctb>3)}6hPB1`HYXNyAP$kOVyoeP zp)cVimU|}q`zUP%H6?vqG?CLw6w^o%3djh#Bo2Of(HeJ7QDnJ1RFHHt1p-GlyBls# zwjv`>&{Fu}MH@v7H0F(}5dZ)e3PtP>*XfHBEHt%nwM0c80!^3zK?3(T#JF%aFm-NK zPZ9MAG7DK5A+)Ps5ww5iYw7E0DI<22lyX=tm|n+o-}+*+%<|DsU**V;1c@h2l0bI^ z@xCvO9i2(2GMT5VqF74Q%NnJPiU#;ik9%9|ihspQH5!(xkWn%ykW3|t#`||4t|96e z&1-dyty}P~T9#Q(9GjMoQ*6st5SFNzuJ#jChX8NfgN9n1*aw=LN-7y{KnJCxExm^X z0l&5!A*(PDsU*lju_4MH{`UK0nYLwIS|dj*%5HkZsE$3iBj=2JUDlFHto&h;C&*(l z)4T*u0be*e_x1#RP7rBGf$-8+w4kr5&VJNGe=eZVlCdxxU!8&Ep?+moC``{gM6&(^5~J)je#j98l3abp`_85)JR{ zPAx=&1E1-}r>a@uIps0}2qcc6N9=K3{vPRtUT2vBxim5hTKE1WJ-)cKlP0NMU8bXk zl5T{};E{^NKu`|k?YGYZDD_%VKTJEFin8_2Yno+VB~6l2)I}a&nb$ySkbqspkpvdM z1NeN7_&+$y1lqQFdTz#iyMgO7G5xUXue6R!pKE-hQ#NY!mDy{dC;()cQM!O2*n@I+ zAEq4h&26HxnwaVHI{I3AzNqCR%O!|XN|RuA+}r1f8I1Q5X!EkvcUFO{V2_a6DhsFb zyn>e_)YHc#E1bBlj#Tq3*#X1+Mcdl%9&D7#Y$L23Ao%? z1I7=BHSpt5y-hAtTa|u(wl|NiFcxB55N&V?Cg%%t{Fc7IO3#vHnXGVTCa6^Pw1rBJ ztJr~Z1*|y17#_eu9g_b5P>yL@;O+0aK}}2fJg%maM)TeXVu;AwmLO9CZg;sPoK*fb z#Zq;aQnX|ErZ5n3awU`dV&KYj{&$yY`5?{fBdx5GRd$gHAdfZ=P&f#2S9qXZyhq5@ zdH_UQmLwnbuX}Cp-xW!xZkg`4nl?X$PfO>eOC+UaQF|<^4ZghohX=t)Jx5#9(`8mUZJblW)Xu^mCGB=DYzQ~oayY~v!YVB4i&)eO2;!}Q8R;_$ z6Ce)J6JupIxfZx1xW_>*F=K$c3!j6iGDZ^7xCvf{rqnrYTpybc9W3i>NCn6sl_KWj za0k~FH{zC!(^b${5D1=-AvU$jF(0uQ)mqkvFw3&KdUl2hX<>~4s(OJNAxFB9r;}hd z9{A6niRuNPPSNHf<*DjQeH%M`Ei zY2cg!Px&2`{{ZV4)W{^Y$V+j8!VZC0eTn{ zxoeAlhaNTJ`1ExP_W-N?LA5#g2yC)g*%Y7m&-TG*%pe01y}L+1t*~en7O^o~>M`Nw zkPkwilM($f%Ydm>Adferq|>?W{K|i>JY9gXf@S&x`y2>KC~J8n`-ui3ABYWEnrLqe zmr-RAL;0txSPM>_YJi6~upkq319RURJv*mMpDB(m-s(u>G7!2{%Z7WkxEDhw%mBu4u}#=G9qbjkis0 zD<}v3-EuVxZFX`p&mg);5hfr|0YCdEOcj#o2m`ZWoX*-)-?e zO=WwoppNW$s*u|tg3kTpU<4kHTOHEZv z9c(X{QK1U3L=jjJPe}&jjk)cGzA@|kvqoeKK5r?GT)^F_U?HTGg#e423jhEof^nW8 z{6T7*woLH8Y4V5igGC3xGYZ7sqGNk_i>Zy$Hr1GUT9z5k?f>Y^P8X$J-ssnG3Ly5kO*BU=tqQ&LM zLzph#mZ@;8-|jHkhqlMt6_%#_H~5i~Wm4u*Q&8ryK&7Qh3H-?v4aw*r6Z8iaDOn?O zjnu5B*5HCL5p@AD4g@$UU(m5%84!}w?`!B5QJN-SNgX74Oj0No1XTb}J&J!^b2O@1 zkl!w7uh^Ag_Wsz<9t(IES*-NjdW%r!)%k5K%{2uM zXGtKI8knx3)Pe~cm1RDlfp9%7gx`gH!d$<`%&IhXQCAg22dG>d#LNM)9n@kjxYo^w zE}g*y{{Rbn3JIg>{#3ky+q&CMSP&Ws8u#Hrx8DIOm%rs&{_y_*!vZtaDC+W{e_-W* zp~N@w4NWFt;C`fd8fto~SW=}LDQ&ViEG`Hn6(?hlBk8y&J0Y-#Rrgu&#$MnqtxI}o zy1Jx^Q1&F0{-Xy26YR4PJ*Ge3A3n4;ztvhhIEyjLGirg-L6V+X3qvsOu7ucw>&WB~ zakjiI*O^Yg({bk6bTTZ8LRC|;br>bJ%9Gq4LGC^729H_r^xZw7_o=@A%GORJp#bs} z(vPYdxTINJfJMO|f)2!S>5R>&GMCDK5IWCEQ>rXE!~(jRTH!>12fo1AS*05cX=GY* zL27jsGe6?rEw8Qd;~}TWCTMdU(uyirf@7fS$9Yho8E$x8ojcJ%>IwFHh%R@>kDBXO?qp9mBp-2MO z7CY~`#78BAH+Y@oq@2XA340PS1)3fM1+6IZPEI*|#5C_;AwAGCH{%M307w~nixF-A z0409^06b|07eDHj-!Y8lz*GJ(GFR9M^5oyv^o&2IG-zRa2~;0qF~IonAIG%+0QRmj zU!{ZLLO&9$AHb~rT03-8sT=GsJUFEP00%~ng>ziWu8OLqJm{k)5pVzuZb!B*kHo7q zegtY(EKT8v3){U!SfT#_3@<6l>tGc%bg{@~lg+0#AgDktJCBI|xa&M5@^BdA$XXD9 zap>@`?+|lcH=IS5SlHf7|6sbLlvBzq3R-ZXk@KWWFMl5v3WQBR!vF->+}`AY zb779MIE1Y(aKB~Fb#9{gav26ZgjVHJ6m-C53q;DxD#{RmH@GBQpIhR2CPz=HGudjh zx?rO5~F6eaR%^yfFDz-*meF09iAJ7HwN!`B}H|10G$a zd}PR~wB}b$mZ+hlt2EFrN_CP+*m{5g#o^$L)BgaD=JffUOtiu%U-)6|(gD8&_P?em z&&8rVel2C@_O??<7T&;*+#Fh(E-JY-oXJ5~B(h3xRPHuK*tPfHu=(H|NR$t9x~`t) zoDFU}X|kR*zNnU?#C*Kv(Jf+97mo9uhGZaz9YWh!?R+?7QTUCRP}IkjYTY@NWpveY z(o?JD?CwGv8=eX6e{3}Po2fENePu&KKm%s7d_R+-fIQQZb_Ui84YwrhE_cMkN@eYo z= zDmkuqlj;gO@aM~hjKV-d0o-s;P_f^PIQW#(*JkvU@xfGvcw?0LM&&^O*n!U2f_^fk zwN8|cZE+1lZSLwnrYzcQlCM+CA}biugC$CiwL6j{1P*(gLzEvRBy&qkpt2TZMUVv& z59*=wr7VyVYU<#S?mE!hmiP3w3#UrzG`%iq3kgdLvZ*G(SXqa@Jhinykcw22PLfKI z<^$W%?T*w`31WlKrb)n%oxlWfxFZ-26c?m0YAUPo-oCT`twUVO#JQ1JLW^;@u_E5M zBTLCwABEYOiV*NU6rrD@{XZYA_U9e(@J1@=mN=x10JscqYmM!`9dx!+4Nrj?m2@)B zl`zsy&Y^)vQ7T^Jo(cUib}@0aWKFd0`zH^>6&uSoXDWfzXy*tB2J9XJ1-io1Qi#w{G zHU9v!sy=dC)8n}xLNPtlUNL39Y=7x4o-tG`eo3sN0zg*x1jgHodlT};etlxuOF>UH zRUUs#@dp#a9vPDSqk=8eJ+2R8aIOtyr)m$!B=oF#62wR!Rln_xqb4pu0PI#oZJQnC z%>7oDo@}R3Yb=jYWHppE6jY2FcZh{}>~2e;0fm4(j31L{^z{1Dw>zFGl`{}xSBbh_ z6u1Ge@&KD2_@OkuZcbpec?DWcI&4fwa1Uk%+aE)=Eli|lner}Put85@RYCuZpwdw}5OFb{xS*#SpDMADu+nvV5jI=Cd@8dS;q7nnNO|OMn1Agx~bV zf8z}}I_E2@>vamC-AJ|k))qdy;2C{RZKAU}e5Ma5z>gj0BjaeVbzA!tHy=M-De)4e zD{69j&ZQ43ymA5A#Gs$v{{UQby-NtgAah2=Z1mi=ObETwthYKED=CVPGkWaoyvr<9 zWCTdaH%BDjq!IznkMgl3fIZIGaq!DlX7w7UJgS2zh77+bp_OKk{{Rwc zq)>VkxUe@Mn*oi&0q(i+Y_ic_=@xyXbq0T{b3ERq;GoJ@t^Ap*B)N13-vSfCv9UJ# z;tS(l8sJya1yIdA$@JBQ`FN<1o zyR0gT_~LSS>2uK6`Z34QFtdZZAod7Afe#V?0O^tc0J|I?3oRH7sCQH+*^l;0csfU2Axeb+-rX)P ze?~Z#H|C3iC5QpY^3MMNd=af^-#GBMRAq8>GfkGxsnQ7C#%;+v+zfR-6PreEliVrs zoEso3=DXY|$2TJaVRLKohus&X^L<^Jwq29Q8_I}ek)&{{iU=1Z`;a!rt2L$D0J=G4 zWGpXvpf@C@8vD5-J;YMRE zhyMU}7Wi%AeyPy8+_{EdR%#=tldiIwpq7rH-*R`jZO_Cv^|;#+Ji>~nFRFT4%6Vz$ zLuZauD!}`LxWk5x(;3dN)KvKvMFLMv8{k4lFUE?!@0#-F(GqH9KlDBuIY@l zniN*P(jSQb01k6nG<@Q&uOX@cd67>{^B_I?T>-fHf%3(B_?q$aE!6sPbY6y@X3C}^ zvkJzH#%BQBMxfaA+yY4gz>SEU4f^4C3%_*5`mW_WkUr=eI zas}2Xz$6bqSeyRdFyM6o`-6*qDB0)sBNmM%B{dZcG*mROQ`5kKB8eBJ5kRm24l&;$6`DoqyV~b|!rr(7#Ii_1W)|$S zFyH8Lm7moo%xgrhG|~S6^{6D7&j1s!P8n59)KyJ0v`(a0s-asCnI`zle~ph1C~}(m z4-hg6C4!eRl*O1viUKVBtJrKhfFSm`^*GZjNTl;O(r5noi2f$1maFjdo}_}}C5}|; zHz2I2LAm*ybeWg*pjC%qy60Q9y}(Zvd@(8A$U;Y9@jumD&AdjW@1 zr=eKW#>_W1YZ3A`#DBw<68Lqd+z>(B9BmGlvAnEL$bW29pNovLTAc-z>q=2<&rerGB#;fv zY{JC+oFN{aN7o(KLh8@ViP*CJRkzN|LmMEGp!Zg(4QpE8CqLT_n(mfL{{Rm4H2_k^ zY^tCDSRMKa8(3jhQC}8mmC@#O^0Px%0#6whw@avD+tA_2LT9F^r!94w7l?uf45WWt za-AW@4x-E2ol2A>htXd$M(u0;v3vdu>N7a}NvflzF4R)cJJl`hqQrDD=X;wEVsS=Q z#?Aru0ObgD{JtzdPxX6@j`_fO-M+EJ<&dPCX;UnK8kD z@a@aC0c~cyHYz>U(-d;M1q&U?0>qPwr^fndGY`ZUhqRHx8fp_!RVygD3W$UgZrw}z z;^xYgnzb$kl$JkCQobHl$*g>J)|$CoJq}t1Pej(ZHg2g1KQYgv3~~J-#~-H6IX?sX z{{Sm06QVNZXr%HX4I3~caCiRriuk>uqwxlhmrAPcv?;0uAdz7&2j zwEbpDn$haLKO~fq>PT9HGKv#nGm8*N9FjIaFLR6QL}lOLdQU3JsnuYPj*>WfQ~&`A z0Y5TsPq{esZnM{$gN(@`7GJuw=edm3P5TdJo^!mDSLr_=v@F`YGRpIbr(sVGT^vR> zkp<9)QUJK~2H~;r(%K86^%! z@Xe2*AJ-gDh%(N6P~x~pZkQr_TH6YkZ~Nk~{2ds- zF7)%5LQ73jLbj!F5C26bvOsJ2+`vA+(7`eKy)J=RT>X^K~&riyyX z)tVSgg5gP+0Dn~&?EE6|I&dekS{Tf9kd_Wr(;Y27nAE?Mrc$)|ih0Ce`5YT;FTuFP zL&onDqSCa7B*|q-v+9+wAc84W{{Wf4?;gYIedZaInT1Asl>Y#UQ~pmdqlAi>FK})_ z3^(0PjgQQB#UYT=(Q04CZfMzrNi{Vb($usqU>wAtC_C;iVn=WeJ7+sYLq~PUj8@B< z=`shSvy8(x4fspqTtl#DA@O?f?g1cO>7?V$UX72iWrRXEMkDCtwA(9e}}cBNn)4{YD^TG>!RO?@-Sr zCKBv{JfU(;_O>cN#ceU0Uujra^%*JpFKb@%+xp>ei< zPpJ0AQKvjYr>2RPu}EMpEH*s)VeYTR42q_LN>)juW)=F0}Vtp)WJbk{$XM^xwmnM z4qd717g5aFWkj(hOr!-TVz;=y6=oTxYY2b(oh1ED)cr|*q6j;S@BE{mQ;ST-V;Cse z3WT{&e1wr!rrK-84If37jH<6pv(tlRD-=TF*104Te|zBsIzvvqWcA)ulfgR~Ac|H$ z0v*6MAd|i;+{U^&q9RIJd;<;O;457r9WI^Ln#3CAOge#-*IoQ zDdtE;0I&4O*ylLBC{}BiWla)E9z{zUxFtGS!LTH6@pHB!)wGlW*exp|8+wH=n zjYgEq;7S=Y+G(C3LlDKy$t2vUARCj2;it)SJitQ$9YNy0MOh55A+S(LB>adNjgN8c zQOyGe_7%_gLdq70!~EAeWnuZc@_?WAB0<0E?fPQSi!g^M%<~pGLnw4fq?!V^bJ2Sc zY<3;)aLJ>x>b)!A?nRVQK(f@-$brIp}BifB%3mrk8 zJ1mJPQrnP4iw*cTTl}##qR#TkWO^uNT8DxqY5Hu)fRF$ui;zjTpg3aAbgo|xaWGhv z!96O7V{ODXbJP~+V0wWAw;W-!G))0$-B{_5d@_Lh2iaD-vsO^%^px~UDq)H$(^3>D zAQGSuH|F4*k)9VZR2)60Eyj zXSBIA`ADh~(#uR~f-nF^hmxUeE`3e$i4I6bY<~NxrdONRX`OQ{x|XV= zF{G%Zlt(#ZAe|22sVBJ>BKs4EyrRD>&QiWCu92xC1P+IgyAW2ul1aB5dt#5N&2tk3 zRO?qWLkTSuOxIK=n*+u1Gw@=*fAN~-sF=5#2w(~B4`K2+w~3Zafwi$*zlr)tIBuH# zO`@}2Z%*{Nl~pvGJX10e?g#`^GUFpoCypGwt5G3q&NQ8_9v)fn>6-3~D~j1*#n z#EkX;ET*mGQSAQ!5dQ$xjcxc#uUhW|^0>F^qp7H;YajdN$J#-TN5+ueAa!u$8Ar{< zWP{-T;aYtR2GW!C7yw2fe0D$XkMD!bWZu#^_7?uwEJRch=gYUS{@C*hSu}!zLdW7; z17USHKYTBwji#ilfXJjYB#~}F+>U(#!UImklC@I+ceR)MVRl_7{SGyOiI`;jcf{+?bvdOoR*7!n7HA1hlhW9MSJ2^~Sgik*0qtn>{IQj1fl zWUZ)*Rhl|{s&LHg4Zvprs9XA*`V3V$zmIy#zOcoTQBl!GO`}AE&XV1(THv3M7_~HK z;e$_5y3eaK%ADE8=9-jw5qygqu^%p+T^ct_>AfNrJvEYL`C{w~!w51k_mJI>)Z-&F z#`v+nOjb|F3kMIRble!jE6gL^U_EzVt8={1{9{!`R<#a_it|(XAg=u&3juALf!N~e z{3`fuokg6stIqQJ+6qO4en`xwF;UgOPy~Wh01fyz9NQCL{{V;_X!!=2t_$(aC`WGg zRgi)Dxy7g9jZv=f?@ra38~B-BG1%>YDM8!jF;~RBQdn@qqyGS&*X`YJWJ(#10|f$~ zp_Y1cc&CwV$P8`!;)DEOcxjN0CVWTA<7z75P?1+ggW#L2k=93M2G=8-@4hq(GWKu3 z{BaQcK~fCI@bjx+>FO{*l?#3C(IPQFpg87yFP}H!#7}V`j^$LtkW%wR(WID!;w#7Sb{~(x7Z!=6c`y95V}~~ZEqz5V|#&c8xB>n zkic965}o}q7yMRLQstfmR?vadEpdvTDAaE5@+klg=E0BC66z&sDx*uO1%=4k!@0#x z;~jjuzsKz@qT@pJSt|bki`TCpFdxHH@*O|<@zVHYejXXJpTk18if9)VF48$?5s`gLE@%Qno-X2)XSPg#gy)PY{nCTVdyub>I}exMtlc0b<@z9nRo`NxJjqbwj=qbik@1AmS&)`y zASa-Jcq@hSq-~aFK70^}g%qX88{4Gc?R;c(GGoted(y7~A>x%i_;2aXJSoYfs;Q}S zNF}7Q)Vhl#jnl9rg&=%@#j}$IrK5^C>K%p4UF0r6B%55D?ZCgLDo?_U5=Y?$D}Vyc zSy3Y2xazm=rxxM{*buz>oCi~s#hoECK%0oVWz!v}>RaHr~jwh?Ew^5q#NR&p}B zyv8a}S*hs9T+T-J18u!e+Xs=AnbzlP59k6>IT_Aok4u(C z)pqJ5;*{^gTpRZ`9q`}ye8}U|o)={igH)9@u?otf2lG6F``jJ}Ncv+V_`R<)j}djm z+0JagmqoNRw2DtfG(hZv{qJ&5a!;_v^2pg4i2#ZOKzglU6ao8VZ?9sGpVQ*S zY2@yw%Ztf{tQ?+ITllE)D>TsAc0oa>B=R!~{n*9*W*0v@Q$yK-FdM3;#@V_KxENZjfw;Nol zl)3#F;>)DDKNPNe*s#S}ud0_m{7vaxkq=xNZzz(sa5w3aKyCHjBlX3p1i%X_visWD zui_V-Fh%U&?MIVz*8C>dU}P=aG?J9#mH>&v9Zbs z195*o$`>)s02@*N02E_Np9^(WIg;h_YN7`OkcGeY;)n1vDLM9@(>ZlLYf;osTRbZ` zxhO-11aHpc8do-={NA3;=$I>sa>}THAb*+{AJ-WVKvf7lGoz7w)t)TYperNTi=;$v z^S>DMKM1<|dx7j$w@lPX4OWd=uZPA3qSShiGOenjl1e0*Wa;Y*VxapQlfEK896BGx z7NU5`RaB_}-shDa@aL7mMGbv6b2VL4x8_u#BIJ^wlEj~Lil;f%*^Z6zb5Z8Gd@(&t zlTQ+vK_Npu?_fpt1NFye6Ni#7-BjvW@0%t@Gm^^vR=dq}tfwZSdfeYLijtiHyUO5S z*bYhd7dT%{Q5@9K)I-!#R1T%C4T!k7JZyNz2-G^KKGeC0tj;Utsc>$pPr`%H0k9t| zZfuDbqavV@;#TXXiH*;y1Buw+;%IER9<|YrONoTK+~dEnR0rb>GwQ7|#mysuZ~p+> ziH3XmU+~R(BVL&sDV#`edyvR+68v4jBh@-csIX{VEIV3J{qZ6c8J2VYoYGPY%~6+6 z97}!KuC@c`YkhG}XAv+1y6?Ix1G+n2<3J97RWhm8d0vt5e=5#12|?-0U`SyH;+9V= zSx5CffH+g&?P<+CILk9xQZF*7Nh90T$oJm(#yW#N&of9VC^KrwrH3z1A_$*h7zc}b z?aAM4YtO^558(z#F5<~20Ned*;>#VW-xRq{xzd}1g{+%%ozKFre-bPk#l062i=K$h zuj@Jf*oOWh^!8^%s4F!MEE2v`oEYabC?#W(z&bG;8;gtb4kjKqpEL0Xq@!bT98i!x zQaS#ZxpFLP2GI3R#Q7-u=8IfT*dxB62ij~gCV z3l&H8D-Y>CH=62f$Wmp|Uc?zCZIUtSPxR#CcdYcic2}koBbO|oc_>Mn^VIQ>@~OGI z5-xcH#P-FXrSeTXmgaSl>8fg|a{mC#F+{15JBw|(7P$1j6!?#pN1S98S$bD3HCiW_ zsvH79Ct@#q9AL?ib$~ctjgN-W5hs!sRSxjUa0X_*$2fkVNeyvgM%TDD z_Qr$~GFb$7RCGUnryl1OUF$*f^X6)Edj9ZG0 zIHtM&2?yR&hyMT%Wf5wcKPY)&*rR+z+z@u$`r8uE7_==OQJLk@(!oiQ)BZ#mUV4K5 zY@>1j7bK1^Yhu3BZw)SWNl@=4(qtmrjz%m-3~~T_6_cJDm4hXF6(0Oc<>HgXcc@+} z=^~frKq!CoV&wb~W+rVHp5-h_{H=OS1c5~Br^a>8>_JY0N;upD~nbPzZ?GmOOwKXozj@@;8*NvYJQaDkT6k1+{yZf(&v-(iWDfbQ+!{+2A;{{V*|;BW~8>;@v= zjRLdyE0@X{e}|kP0{hsVJKMZumI0oyK(-ZKXS|CqvQgPh%*@V3&1Kii} z75UwG?H?*oOA-9``GJPbeF3cSqghcg>M~@t1Z{1^Y)9M-IR+R0R{AOa*!6rOvmnjr zfNRe|GG{{Xud;0R6p z&;I`a_~MBC8djhBHq2-pBx6mR$!?g-02(;^fwth{^AcQts&W4S(?8n}*VtK~DEYtL zK3F1WD9?;jtv7_awxCK^%gQGKgKu^nBfoo*j49!Mcr@m}$upT;q%^g$w8Rs%WZC%t z0J=^$ACAyHPk~y@#uyZ!RwBe32^62OIQj4h7xl+`;e2+xrU2oyuGXJVU@(w-ucDf# z#GNIfbex)tGR&!}rj{aTDBzepl_ZOfkO{CmU5>ze?T9~s8AfwZxxa{-tn}wvnqfFb z7BN6SkN|f8?P2H_6_?>Z!#syjWs_?h`V(CA)rOvumF!{#RamF|$%>Be+FC2r6#ZxIBwn1Oz|=q)@7jfKUJf z*a5aF;dp`Ay*%QvyPp35bTLk1jIeh>4@`&Rs49J=!zYV+hCMsr=Bv$CVh{Lx)4=Vu z@gX1%@)`<444beA_Xn@c#fMs97ko$vn)$L~EZUz`5`7XJWfu%a)L`vq_Q9BE;u@K;SKkcN6^kdCWv(z)a7iwua# z{{ULw`Hmre1C|~R=}@sTzFeDv0Ob0dO;|W%bszvu?lFnfwLdmb{zv;zO=d&)Tv=(j z^VFUQ4o~&L(M*a-ig}Xzo{~sEFhK_uPlx^>)m3=AtUNx=rBgKxbkb$cYzsmT@%xYn zBfYQbi&Ln9xWCs8myMCrW}<1^5JGn`@Vn(uABm3xhIW$coexMFy)OBc1WRKzw=$sr z0BgAeo<{e*y`i&Z&vb@Wn$yHQx|&pL88-&N5Jk2if(Z7+nv$uh=UD(Ca7FKN`r^K? z=$l9I6Q@p=V)*biHbZ_Swgvw{KMNcXRBrjkQEU>-t$&h)-V zo#y#wahzpP)mG(2nu(#uw*VwGKm))#n+c;+~Feodfms09YGbHSTUVz9Sw1&sRxNnCSf0p{gph)@vqSCUbKn zBY25Ewl?_zjUK1d;metsF*?8@q>DbK*r$k{{T7v07*1iR6kg{oqMP&x}gNsN}1bzkT(UJZTXJ-)>^Og^Q1)MSUSm`{%TniEjBG<4sIKC@$`DijWNnwVjjjVwS zjlt>y#FOo9y>VA*46$>qS1c)2O+;dl%hNNG2nw>O z;X!J=GSHc3l+-39&8jm>ItQqZN~IB~D`9X4JCV*WeHOx98F4TTPFYXE{{ZETT!H1|a01}GTZ!bb4Mp4X zen3=*;`?n&q=*f$kZwQkt}Jg1mD^lr7B`K2)gt};!SC&e2jb2@{v^@m*_alPUBBN? z?~8v-2(r3#s)mpWD`a`5dswh8NEi7Lh7g%D0Ued-I*fRp9}zop@k94eZ12Nw4l})N^)ja2HB2;u4=5HuqU?X5L=*r-B>ER@r9C4#Ezax zKg&v_fP00IkLimWLcD8LJq=xBQqm`k~Bt2|(TFYzIjI)W`oq<{N4 zF@I=`x+yfr_=M|B$n?%EKqUYKl1V)6$F?(aK{9RH*P!@wOL}B?+yzrp(`K;3)OvYR zr#P%{E}Td{7>T(uH~rNYKQIROwjz4xL1|4Zo#b+A%~@GdnblRKnVn0LLqmU$r2s4k zV0XWu;49BOMX1vg%Tbh5t5?)UQW}|-=@MUZpz=w#I|~htDU98}pCsQ6vq-4DDl7*$K`gg^ zc*cWqqsH7DKIx%&)B^d^4VYgFaA(n;mD9KK*CKQMnO7AtXZZ)3RF;=q?vNl}(jS{ESEIuBAN zm!(}G`B~3t?qr%rgaL6`LQ9O@iQYinarZ0s+Lxe z$jKE%GNC4OG1xFXk~rfGDECZ7D5Lm4Ni_u3)LOt)JVlkGIaIx1uT}p5l#_3Px3_Fp zxphWgmTH)&bxkz$(ZNy{Nnnu0JXSlh5<6PA$ zH5Ai2uklpGNF;y(Ho4;vxVmG>GWcn!sv3VXl=+4d1;vG~N3IF*Pcv-)0Kq)IS)0tM z$|R|wEO$K~L$ZAUU_O|A)Y-h011Nw6yptqur(!K2aBY7;MlQzdZ^2MN0Fa*HA<$ZT zN$QHc&r4HQ<_4yrNfWIxD6WJMTKfxFj@P~w(P#;B-w~;_{IaDsVMO%RRC1C+SHiD( zNIjTyZ)1q3hdFkrmp{y@7dx9z$s!lDjPa#Oy@&*Ddmp|pZ7SJ*m&)jySyn*RX;e~z zd1Nz4OYA}$5&`dwXy}c_D_JjlTtGGyLs{thEnnh{?N6D>nc8JFaH5|omLLEqWZ*d< z*biOt1o10L>FpOJu!ttEul(3}5?LA~NG)-5{&T>%#mV9%T85(_uY<#yths66>ssnc zXzf(aNiIWr?|W=dV~ShF=FD>Jqbtbj^;_og$qLlT1gH$OZ_{pqAktm6aG~Fc$l6?kC9Cqng_+jC-q%oVf2Iih6;I{(shGe>wAoCe$GxP8{=nhW z@e>-qh8a}qO953Cn46LeP2cH=hv61)E5_`(FJUb;N*nk76Cd0RQ0wg1i6}kW{ueva z1@zZ9*tmZyZw9BixrBV}jx*B$N|=Yp401V>sHl;4HXt4_DC7)+&Iz|-PCP(`P!w63 z9e_7J%1`vbOsmLQ56UzBuyl?>i>sR+%1`vi1ef9|kN*HnkKYa|liFt0T9+)-83g(6 za`Mw<@DL=I$!4)8zyJXxl0f4XPGR_$@csf;3ViOW-PV;9AN2Y2U<8hk1m|wUv2>Q`vtrPFYXA(6`(SV*R}_;JDe7!aY60fFtA;aos*5 zD|M|u6grnp>Q4w(ry|a1vlSVf7cj~hhr=$!ayBQBF?DEJ8T39t!X^Oabff@B9!h)T z=OO~cE%`S3A{{Uv+sQ&m#9XlTg85S^Ynoo1o18A zOuE}TpH68k%Ta%a%Uu>-7@BAxa2%z;BoZyP?tOv92VMB6g-H}zHdgdC72pr3RQ|Zq z?~~=()?Jw7xqxXR%xPYki@7!o2)GxpBKO#GG4q2`Wfd7Fps&fZ1!(GMYF-IJ9n_Fb zz3qH-{u}9dS$JXcG#3N9xrG!`H0l;rtE|5fy8i%CP)(QRX-SY%x)CE#t9ivv#CeQK z1KmJA_@)@MIc6-(NhFhUPjYdge+8Ouj=NCj`MzyO6=qu%2%|C05OsHv!&=8}f*btC zEiV^*4DkN|HPZF<`fDbaF3uv4%!MfK1CVze1dw*V!pGko6j@kUk{o7JPqMfsiZ}Uf z6s5iig&q@WV3ODjvK@gO^zZk+CNnD-rL?RGLIv&UaYy(At{x*t;eMyeA1%%(smjsH z@${`!Y6$>_0EV^CaBO%x8>`6?#nQ4c0B{HZ^VnEp%zC5`$IW+{wVNLxm61COBsce1 z*YORQ<{CTkLz`#0YnZBGs)n*7eV8;zNIsx~K^?(3*E&NzqSX3hFVFJ%Tk`eLEUG-s z(2-)N+z>(c2N`Ga%RtorEM@tKUxL3Tr<166Dp?QNMj!tG1{&1fzeCndeT`iJW5MD? z8~m6LW;pFUOMo))n~=e~KtH0;%8$&1JaQJCESIsBhyE+!w^U?#ZmP(t^xkaD)K#fu zl}E=-DBUDe*n|DM;lrtbH(Pwi{BR*DL?jizsW$$&^Xx3Q;m+Av+x8)3wZ*2wsPf#V zvs~yr_riT}1R3sFz*AMV&D}xrY8Sai8xlDL_r*2fM}&Hqc*vA`lPjpDp~$Bd70n<% zT%`@;RXjLm0E=I1oM|5yH0Eija%z1+r6v&S?2htN2+sA8^6(#9+Tb4d9q_Be{Z|gH z(-hgHMWU3CE~cH2#RQ{gLJr`A>)P1ur|Qzb0913ejY!~_(5d_4$D*1#b!xfTEHvt6k=WQOs3eka z=rLS)9TUl;B+n#Q6X$i+8H=8hNfJ5ffT?wyi|W!amF=QGXFY2_dX+j2o5u&_LkZER=_IhMhv^zL1gQo_#-4K#GMoHfARL{{ZtwH2Sogf}jKc0L;Ji z#%J-C6GQln%@_g~ImqLfTe~U?{oy$2yd5a1V+%*6Jb9x1(c?YLYx2rWrnTyPw5blV zjmQKLMS!{PdBfgEme*yvg{lr_l(e9gl6JWz7!zWrb8v0-#CJwjRZ!=-bkSv!R*75) z;|*fxa6tKAzAb+j(w%7O;!9FVaMBW&B#J?o9r^6^V%W3=n0P@GaEB$3mX7I~W)<9BQU555D&BJi6ex`0|aTK@n!T;CNJh&3PK z--<{mH{(1rH{wGfiHBP} zFn||(gVZcO_`5ait6!!SR*mT*qKP9BFtI{Kjra68rz}O~#Bwcmy&EuN;o~*KXK5Cx zioHEgsC1v??6K4!>!+0M(%^7?j|cVbiaxF>=<27Zsz!=uYrD9E8PLUWzGu|>>f^JCO!utzv-w~9s zsG494CI0}~1A%Z38#JvnkFN79${1TX zf*HxAnyy0QsQf@692k+e98t{8WK;Ih}0lQSz`dU6Oi{{XXb&&w760O3vg zJap6K0&n?%eqKbFnRvZh44wmJ5QaTwt~Kc(gR;Hx8T=$uB>pncx$5hNmZnAN7bN*) ze#~&)ZNOp3PyJ8yxjvTD9vqZ>y;OxabmG5gLnn$^C)A zh?lTI^CbTOOg#XZDWQe41gXpAh$7U}$q^<%Z`7o4K6v?)o>M&rYga)h^V3v3Og##* z2ktTS&n|gl%xUB$0*3(D8}GI-7vfJP{{R8;!&Oj(=#A@|qA_i{WwVd{SoE(4JRD~a zVzzo=8c0dJA<&TP+}g5+OweVA;k=~av;tr{si_K-`gH>O%fR-bX6M`X)FiS zoF$(z$>Vg6T*8%FL(+*eHhTf!4FGLHO9qYFXK1&1qmqJ8$Md zVjaKQQH>IjG5-LylwagOrZVT^zN()s@n=NpYIaABVT_p(t{6j5N!%X5+ZuM3S~+75 zq7n$Wy^h%Ed`#apnDg;%qxvhELsMA)0EE7beqN;}^QJu{8#C;8^u`qYSY%C*c=4$t z=qn9u;<_6P0wqwykNic4(;Jyyn%g2D_hTpa7|cJ9e5|%@rF9}kLe)^cB#cGAINsnN zdq3M6z6i+DWQ3oPrRmP67W=CI0Pvxz;nUtJ!$DUmS}f)>M)zU>kdR|0$Nizx{{V>N zYXM3R@}c@)A2VrYmX@YEm}N1`6Ng4pK~@Ifk8pAHOT!IQ9Yy^4f)j9lgB7=nJ_+bw5Va80 zRWs&!R%IfAR%pWX)DSEfh6c@G1;-!@j`*POW1V{{f+UqFrR}pdX5=YGulD9aB#jOw%vTXvHMx z0DC)-$#J;^4n46xl#T5f=WVfG`14k4bH5F=uqz|hXDL}S-~P$~NhjNL`eMWk#@0*v z*|F02u13GfHN9G!D{$Lch3Y6|Vmn+i1Nt^ICXmkRw9ci=v+5@v zbrnKN7UXpRcT?;|!S*=WpNqO?uJ9JJUnqv4%_-*>AlNWuC-oy3pDoL(^BE>eNE&8> z2cAH@gg{FlkQYB8j^m^}Wpw!LSS_#cweb$92Bq|4DXyT+GMY@vjum=pxKe1FpbM)g zBcEf1(F-6{rBI__E}&wc{3Gfks5~!Rx@v}MteRs?%1FPI*J#hJtXY5X;^Kvht)&PE z;>=C?^&4Z#I*uvD$b2WU{uVUM(DKxL4Dm=LP>R6Z5O*K8Aex&;YD#TIU8+1f%yP;) z`rsPBE3S;1YPkpb)rRQgbHFEii=0l@NY2U>pZ8Dp7#G4wCBU~~VTFU#q{Q^lEj)w5 z7Cg7)dn!X*$@q%Zntp972Zz)-G&N((tE+;!2y{GvOP-K>+T@L~A@Dy`)#eoWrjpDu zs3i{-5y07xAkH!=-4-fKswoaFeGbzpX zXvzNo+m3iWsu~Y-4LAU+T0s7-;cyA0*_;IIIqZ?(gUvB*a84pBwU#PV{QBj^!)AVJO#Pv@5 z1|yK8l1F zw5|B2(Lr6Ssf?d6l2j@X3BAY{IDKAT zqD7t6%r<|hV?h*BP;CSE7Q>lf*5wTJ$>*lhQ9>-#s2`~fhs8eb!8r)Tw=wZ>K&16dt4)^vi`TtjANW7x zf^>?ZtCFeNOCofRLAmex3`#QC>T_(?4683_g!3C0k*tx9>`$Qd`eQdLR|jlp1*MG? zWrfccq+SAP?7EM{FV9uU`IxAvrIf3nD{=x0j{7m&7hQf(W6!H=;g&dKo{?!HffNsj zkj1PvwTKvK(76Uvq^XiI6V*J74NX%Ev$crhvWx6LbBQD-N{FPEp-5z$`7C)UU;!KN zuo%(8lT;zV-s=lF;nF)mps8MpVF0{NPT$QT9=`YzCQu{>qBwl9xgKdG^X@&cTg6NO z>7k~*z`2Yc-wU+9K{k7-8j>j1I%tS#nN$F)w%d0+0gM(#T zmoQk%80lev8-Z@OEO-9^z%i5JSp;}epNjtg3g1PM&gn)+a!LNytY?rZ{vYbVW5dlV z4@_eHy2<{S1*Nrup!u=>gC1Wv4camC1pfe0j}rSRLKzaC3`6Ko^%(H;E(1D%eHZ(j z1gw`Am<#p@KdCtBPgz`_YY*v%DbR((sS>r++yDUnn8_cG{H(#^r4DqdX!9((HY9La z2~+mAHK&%OpNammALvFXug6AF`L7Q2_IQbQp{+E|+>nl>i=Ubg*BzgOvPhNC_B*W( zp7PlM_gTBaO7HOh026XadWwlEJc2>70zgy$0CqMFH3cu_#D=D!=8Ohzs;4%vCvkgQ z>5MgyR{sEpXA~944_!S%OK)D52l``aYAni@4KbW%RI!Br0H{2@cCjEvNZ;x)>e!F; zkb5q7#yI8KFt~rqZ|DC2+N8e^lBRX|m3-P_y%GL$rsV7{tfT(`SjM!kp{1&po_J{> zmExE&K1jJz2qNTf&Hk9nzk+%}CcV$|2415EULzY`#pF}_DaNx}gVt0;AKKf^8YB%I00L~NlO~R(sAi)_n{_-{28{{Z6tR9Q(h(cGDuL{Q{`YYX3N zkZwC;3mRQ62EO~M?R6Vj+wqT*3QZfNYY`+<4NX){*K3b7i9j~u#2j886X&g;cyo|u zo=oMYp^MBU01K$;atS+*r8t9rFml?g!@>Um&9q3r;rWbHFcNhTtQsji;=CVqZu8f8ZdN0uZxU&*|Sh4_P!~URP_^Bzg3VOVoG3l0%FsFKHRHzpY z2tU3ud_9-=Z1>{Jj*qCi*6{*XV+57!!3@KdYIHMy3Gsh9+)2DXegL3XX`Nr2Y5LV+E?-wAJ9fWI5D&S44Y_zUy{)#Lk`B*7y>1x56ZMxBDmO+yRC? z9i3&GlT78A{#!={f)C3N#z}2)2p>5=usHFFSm@qZ;Y1oMn;^8& z1p{zdimulnT-(=k{jr}se(~CuFQ%%}njWnx zE2UEvUS%5sl;GSIh>eSpa9C_RT<$eGM@*ADAT$q1+?6yCx>tY($@@-bG3&p?es7)A z$|cJ5wHM?m9Y`u>azhc={{Y$x`wU#stAF}N{Rj5NL-<|DAj&)|p{z*C)MkaMrhcv3 zx*PV8;+I?N2gi-_%9GlCd?tcH(~lG$~Pqr2FfSn#R;wOOITADXa4~5 z{{TD#ZH!K@`vZ)5_;oP1irIZ7LV1++u+&n_mcLR-3#lJaak+I4RUTobGrX=i_pHk* zU;vVCS|$UMd)pWz!5W97@o!E@HYU9zKPEjV_s4nQ*|p&Yp2n4k+)fmLasjW|Ss#ab z%Fhpce6G?JjK&Jrl7aUAXHr@x1K!pi&y99mw%ra7xC8p*CjKWf%B?fvR!gpEE{1a( z7hSD9BwO`fkI>^&bRo z{v64Z!#scDIrAEH^6zw~7BaE<+%MGnVte6)88tqD$tkjGs4D1Sqm345Tr#-|I*GC5 zl1T?}PWZBYKmPQJQppwL$fCH0>Mz`?)08?n(yDzTJ=~gJKfhbYBx)^Rzt*|yA+kXCs z8)KouFh2+frnf&n>PIpLFk`vE6UWN>0ZBb9s3nD=k|Hi02xTMG5NvS~@s__$*7$Ru zq0De z7O_6Kx-(cK1!@{np*FSlH#>L7c^d|z;mFxzXXTbPv0aC6{Hjmz-;wFe!$#MpVW+aX zx|&?ZXj*BhQQelnfJp@HaxrY>6p&?^O+5uABoy&Py(t`G%7Bt=2iFyc;mx9lD%6q5 zIfQ?VNnv{vu*ID(<(ZVDO&|v3-H)ybiCfniLl~DI8PpuReqH#hFndvRyIjL4RX48Lzb#6MGUiCF}2TG#glfn(ZathRQ~{m z^B?^b&~?KTs!cI1BiIj!`(nla07$g-a~Ntf9I6HYlh;^)3wxVjSl}8Iy;>O`nI@1= zsP;&FQK>26wxAC2*yZwo2Ro_7dH6u9r-w#fsy29k#3~~eLe^s(L~K4s4qh~CjVPKE zIHRQ08BIl8^vx7-)667hCvL>sY()P64^dAifqAU7y+U|1p0LZxgBk*G&Tz7Mpt^p6 zk0f}tAR^u>)t};&)6`}#^(@g)p(z+>?bgShP5m*Sb$+;;Pik7cs(hl7phxjXC?!c! zE(sfs_CG9G+5U5!O$-Z|W-T~Ee6^H~t}IU5-)vHTHYfi85KvdiBFX2|^srH3@Uivh zVn0k`64|HRY`sy9lNSsCcM2`5m88$)oKHzHsfj8{hy+2@pp~)iI6k(+Tu5CRm!Jd} zH*gKTfjj*$Rb#Z02|5a;fL*x*Y)ErTIs=l^wG$lC?WS`2T+2{JmR4pI*?d(5#wuzS@uS%E^`5|+0()NPVS=l& z$RePos1hGKQz&@Fihzt15JBGLH*VeUiA=zcP)kW16oF_Q_HU(*1hlh8c5k5=O&k+D zFplJoY;A)U8iUlPOBGT`E$Q0=C1ByHQTI|k80LLK>4<|+Bqz>Bu>{zQ9>j0@<4aeq zJVu&Tf#R9zkjzU1)cqh5H`{~y<2x~-`<@SFtJ8_HDLTGmP_jDZin2(cmZfIDS2rko zA8aRY5NJ{{Nmof(6zbOL5!{2m+>CmXC#Q*Jr&NuYfLvUWa&NzW_)D48QpuXqQcX^? zR89+tdO@%rxPu-^vCf!H50n{rQAkXj6h>dAs`Gk9s-%(_sU7-FRI&hrdmC@L99!2D zVK$P|nL^XHb4y7WxspRL>zRhckSNuR`hNJUQ+c1q|i1#d~ zds};4Snq5DH>lIgTax4y<~O2(6d9dpiQS#KWl{kk6WnutZH>%$TM*c8xE`zKbs021 zOK82Cr<#YwT%MkykNiGmmW`^AR5|$Pc!9fgMn9Ahwb+Bc!@eX(#oUHUb5NN+p;|Pz zT|uCps9A%NZ7gxRes=x7XQ5(}~p%W`Bq|&Pn z2t5`!oqh)Bx-?FpuK;yVm?S`ucu4R60KXNN;)XE{I#!f7QG$u1C)V8}{{U=WUxaMB zN)H8SrbbjX^>fscR_5J8G2hZZzBun0%cBXv_aH8xrvT287;hW@0A*Xf58cPme{+r) z&9`PhP(P+TQd@6O-$VoVzB$wJkkUxoUvdZR20VxhQLYpOf?2^FS-;_rbd!4)KU4ki z8Dft2Vmfsl=W+Y3w=zpZ8@c$~jtb_g%c`SePghRx$QcL(5J4OJGh=JR zv-vsfzWXWh-=;uU%hez_#;4Rd`qlm&TQQ8EGHkXeSpNXtx}$x;#%a{KRM{q^%(8lb zMAS8M)3`pU^Z{U+U^7G9>r`?DX!5v&+ddA%i zZmo8}) zfmcT+H8%#tT&cgdI(~}NlhbE{xE2-cMwdYLEyU(Nr3~yj*tr+y0*uqEhwF?mHw4MS z`kW&Xz+FkFkEn1=U=h!*5$b&VB+~hFW_jjkN0rflKzT?7kD@5u&#(mJlZGiDAQ6I3 z!l2f&$znr!NvMN-MQ6%l|5BzmpC@|@u0kV@z+V}-3c~}$nq-6xXjBcW)*}-<+wL2h%R>ojmX%Yu|R3e z!ScNFk1&q?bn~REzi>hRnD%T3O88o4Z5@|G6QvODHv?ro(S9Op{{RWI8M1zcia6vZ zY_h&GP%-3za8!}qNC$3lILtp3`lf1ricL9_Q^{@KMwUVJ9YgxzyYXD}X7!qTQ&Yx| zmeytK;En>6wk3OxYe4`2Ym^eTCp&n1rb>aT!b)A)lPiO~8v z>5-O~StV&R8_9*>oQXtsxIau~@57e8 z%ltmp8I?And7z-G0y!i^E#*ptfJhsWVnMJcj9Kwc0m{U1XtUei*D2wtO!#s_H!VAT zirPiU><8BsFXCgwi1coXn=PQJ37zKAm}$Z{#RNv-<@Va@4%?DP2MwC*@f)JD?5;tk z{{SP-WVmG>a?DDkP4as)aTL0s-9I1A~t!xa`^;)_zBY^f}VLa_I-seU(dF z_-)EsZmKO;Q50nClTxb?K4FFb08BgReFvRsO?MVkLW42Ni~+@AV1Wp|!52HVUYTE zA!c;XNtz5NC$m?{!n%lulQ zQaKt?FhrKb5=p(j*oP`X5do)icUHVJ(`3(Mq{(fDifK!HKi4`>N@lvgk3G$zqIS;b zXwb&&S#CwgNIsZXo_--TO&Kde4riG#;gT^LpQ{`Fu|W950_$qH&Q|mihAk&s64MqX zy3P9#MXlQrC}5U$3k)(l9fGQoPtag|*A0TQ?+oDNKhK)UJ+Eb<<@`)Qk`qs)9fxl+ zyaIlKF%9t>$6WJRuo@^@3H)y6`A<%#2bAF*Ak4Y zPk2k0)JFtbVoKYPrdp|)kIvTv^cY2ocz?1jI zXX7+5PfM1`EW#%bBB@|VwSlp>8-e=bbZen;V)8cLpbq|+fOx?0&yYaq%3dnat71v9 zMkeQu!x%9G<}XXgm4Xr}S9Mv5mnx^B@{|Zk_`8#Gf36)ef@X||5`oa6M@g~T+~4Ph z38O0tA5w3JytZ(W#niwmpuNq9A3SLWXf;cpl1E8I_D#|WUReO?3S8de{mu;!Qpl0J zp;SVNabf`^+irI!pImtwFo2f1JDUT^$Bc`8jsBR?ZZu_}yOjZXy_cd%VsgmQl6eOH z_zbG%Q7=fjJN#Q7a4#?uZawfK%2cV}vBGvVRkA_nx<LfZEi1YCM!Wq7ug+15#s>wJ?j ztD&LHU|1{ZspTq>RH)d1I1B;*0L$-;w?(Xx?5#5(#CA1li!8}05(!$eO8FW)1V>UxAb>6`N46ZP zswgEYls7OX`3U9K&vVv7DcM_NadSQ>IgFn!12KpRLYT| zU`J6lxv=9BoRjl#Qb(7^MGOf72*C3$HXMKk9c7wQ0FI7l^d*r;e|!C~2qDZKcaTR* z0U!VznF%|N*7om$00V0`BQ|W2Pp^PBS>y3iT0K*hQnM*3L)LmlfGq9(hBTjm^feS- z4ryrr05>YBp%Qc~Xl>Ta{E$!iv61|G&MPyI5-Q`WFtbt-N}gI376kSro7|rG+&V^y zvdu4(Wg=M@^0ZLGKng9;fF9o1^RFAraW%f@`d*a;eosz@Gwo@3jz_sQbzl!dtNSiI zu_BJ9X`cPwW0T9JSWC5b)BCj;qXr*m&%k2C`n^vy(5_a0O7apMmlAbkA|F++p0i6YvAC2l`CF31R@5FtV8&_$WBM& zo^vXvOgWmzm`CVLiaO8!aQJ!rFV~jKGt8Z&D{``^2XF`~Nc&=W`18}|qb}3BzBM1h zcc7e&_F!a>^deF97^eRK4YjETzG_Jh)l{+~{{Xx!Pcj=aNQGD*aB-fomXpa%;{{SsgR8;_cxs-HDzan`a#^V|ff;W?( z(e_zb-D^7)tvPY(VFT3O-*uC>^}_6}H(6kiqYtPf^u+sK_&un! z;d+_{Ijsn}5<J6jawh>L5-?z)U@%zVaciNV24^#_VN z`%vXAm1eq@u6iT9k&c+d{{X&J0>jvoh=ek>{YB#1*JFE<9@k58To1m3|${@h{C zrz@VHC8W&SCi1FekpW?~(%TQ$5l0Mhw6%=@d<8u*lsL6+XCH}8dsPfE(573LvLc6) zI&kdl1&Jle0_S@GImJ(@wFY;ob2rSh%+9MYseAl$$XdhD4gmB30quscZZ--&Lk<}> zO`2ylLZ2?AmZ8bF!n+T9@CVNkL4yPb@|XcW!*mrKAh^&T>9B)`tudx^%|}=He4j6x zp@I0A3nGtF$6@t2wzN-#`DGfVUZ!u&&9VHnY(g*0jnC4<=ZiXQ-yzeqBASsY)1Z75 z)XD${-rEnZ_|p(+8l*Hom4iQCbg%Mom|pLG!5N`)YFw|wB-6V0@_B_aU*RCKqMhss zvADUh8;;nAOX2T=^|h?D@@H^$9g$|~LVW>sBz;aTKM(RMO!q5~Jx$s3oZ;Baz)txWCt&Ns$)8?Hdr6LF(G2lL~iR zn&U+G3Kd&hS6L{QvZ`u{EC*DsSl9~za!$hu$phTr>MA;_+0vepo>}H|WkgcUPoM)9 zzJ>5NQ0B~)Ir9Gih0+@ygJUxfK)>bro&B+1IEmSTZ{=s>;j-m$A07VyWmjc6US*rr zttMMXHB`)O5;Z65>^;udxja1Zj(oQkci!xHc16h=UI+*Rq+yH)fvGWX) zpFrd>CQFm6Ba*D)fHwl4(!>@f1W zI8Ksms(8-K>e1_nXpHS=lm7sU*wR_i%%Db|ra3DjVkHVdBXiP72Wx?ho8z8IEXv}62@b4%y%S$4Tbn4lk1Bg#XSL( zYy6QRsUiy4K{U090V{p%eN_5i++xEW_?SWN7c^sUhWepv@5^}S*sMxe_c#eR#hsk^ z8Lz0SnmSqtE8_;jNM}$8^|KI09(0G{`%>3Vl4=?0@|sYQ=7!}z%!)MNx+%?I1x^;7=<2eqzy9YW;Pv<9Y% zU7ZS-Dgh*rdvksLF=lwbQ=MhB#k7o)xU0L@7_3?=AOhz10FT=guY}r zqNMp=U-AMC_a@$h7A~OF)KIRqrLU=2Y9xe55=4&oVz%S}0o-zMP&|1?%F@bV{6H;k z%AwA)s=4Q5Raq3$wadGaBNM+S#O?FMm%?nyne}BgB~2-)Qyhf2i~yhlK?CXc!~xO= zYacbQumpv_J-0ZN=zPjNk5Ee?i6AQjuTxx*NcA@L#cXLb$_?zM>iFVZM=%RM$v(5z zHM*j5tqG-~idJ}HKuH(9i6fI?+tlGUp2}-8irDh}zBcn-?9Sk*MF(~y?`_7|jlD$I zWP16nbF#6we?x3P_EV)f^2~D+dj%%s-uAx0;F{qipvZQ#(y{oRJ~U40gtIbKCY3$$^5 zQi&Ev0Fi#6FLP`Ca8{}D2C}NIqL(bI@+k|Dj**`*f;*nugU7BSKbdNDF~=Ja2{&g8 zalc`6i#d6%05%=IS256hH#>=!sU26qy@Gv{IjmyMCTm?hfvjFxm;=vla0;yYv6IUg zwOmJ}*uqG^%=3u*)goEsXn`aXu_T@QlY(W7m9_N0bE;qLu;idBxa2Xz=rAhDb z3vbwCl`_=T1rSmsMNPp1=e`I>Av`G`Gz=B}D^Yc<6gg}#(X+hbFbN854Zpr2+M_qj zbD7ukwb92AB!e*m-0&}9`r(1-^D49d09dM&5G+tPNVfLa5ss!uNEfc9Y{35jHsqdt z&McNn@B@zC%PK#@z~cDX>OIO`9bQ#NjK-`~Fzkw3*MK&}E5)4t3hb_nE~KTBH1nEf zl0^WL1%Lp5ynfi6Qsp%1W75QS_<+S{;_T54PaOmZ(WNCigTGKL-x)i55I&fa2m@XT zMJ`*U1QiH-9ggGE(*X#hZ~^+@`4I}-xF`L?gzN?O{YAz!90lDfql6;%8yps7-vM*Z z`}^RsP0k^bVm3t9r51j-|vc~Q%Igp^ptDE21T`Qo_n zuA%198F^*6KXo4+E08xNSljD+V?n!%E5oML*H8qa;{4e~3lvHL zJG|TX>;e7p$!k2U#tI;@G}5CvDoF|lt?kY66V7!GZ#x<+l855IOHCmJ50D#vr|E@R zHd$Mh!&RK-nWNNHB`k!1ET{k^@9k_hpmivCxrv+}dZl*#&9T&4I%jrRsp2Hun*eW)FgS1(0OX`sQVC2^$c*4$ zrXh20kQfoEatT-}2=yu#_ag}8%p)(-8b>E#(Hk}Xpj!vQB$6%G83&-nSPN4T{`87JVsX`ya(IP)rN5xS3QKF=HT_%rV5wectVGuY*nt=yz3?;=prOBr ze4cFo0KuI>MC_A16#oF5ge*iAXo!7@CzTF3?~GI7RdCBZM9FHIx=>ZBIlZi`dQaG# zeF)4F8FKkzsc9Z3LXs&W#YnLP04^*}K5}N%bL9Gpu7*HTYAUCQ-(m_eAJZO@;Ow&a z-4nm!Y%NT0&4KYA;Dw;PP|GQkI$G)JQPtMW(o90!djdavMN>JXrm2QJwNg2Hz#o=_ zd*A(|zue+&uWDn>bUss@`HDpGM(u6Q*+C-P@Nb9}C0uaym}w?0ac40F7r&{;UzSTG zvG+&NSTZn!B<*02vaoVpZ&Mtm3hG&UNw8ybd-H;|E=8iXRa9x1QO1>%6VW6}Vv&zK zkSu<;#C2=x9DFenpCu?5dVb?6x8J#DeBS}tDR3Jxk);)*=zAPMw z$)G3|mfnY))`?#!e2q8136DqkQf{?cg~$VOOB-%~-eJecexnm*&GJl+Kgi{9L`rN@ z00M*V-OuWA9DLHZF^tDiS5_4As-;rf@&erbPAyG8pr|wN4l<0-C#8s0#Pd_tvW}OL z`o}>ak=WY|B>)i+-`!drCR~|Av)pv{1BG5@dChfTv&zxNf5@W4>%Gs{2n=!(w`bph z(`)_lJn)N4QR>}an`D));tE(LDI$aLy2t<~$GE-l*{&kV^8HU)N0o+pIAkh;n)V}* z2s?}4d{LN4;jPBkTZI-pC&`7NZS164PhQKXawzi8%6@Fb50=HcEpknWvEY-4Yt>IZ zbhT5=8foQe9F2!jB%QCu_$cNP4c9KEC)L_UAE!_l6m|Kd8`C0F4_GPEJAdP~{`dnc z-T-$2G(9&P5=YAmY0l)Uf5OS?Valh5pgBVQagq;lWBXx7xyW)&O-8iY^%6}?kJP<# z6(H^|2q2Hw5RDg_ntJ+o%(FH4$Peb#h9n)mPkS6$nUYd99mh!kh744Z>wA%GZ(~Z? zBcs`P*NHlQMjui#MRx7M9NLX(%!^8C$jHeuxFKV)cw;Q**ty={Ts3MPRP$yrWwcdG zOB+b3G^j>NtvcDoS2+~6`KPbcxS25sy@BRTKuVfVuM4J>tX7~&GgdjlyT zovnKU2kU%g&ncDqh^623>?YwrA!)FXz~N8uX<{wf;JG~Zzx2hap|x{MMI8oWW2LA- z5ethefyUR^kG?9!sFB!oxmDn#Yhm8|05H0P@`&;YXK2G-;ZznJ`rxs$3@+Qcqt|*Y zU0WZ^lVUhM)#58%j`P!j{{VL6{`f_m=aku16qS_%X%zt=08|s$T>9a&MAg>CPXtX* z1JZe6gzq)vYut^1u>Elq@t-&~A!%ThO2$bb5o_=7&e+$JEH#!nUTK5i_q!}MQ*8x8 zGu+;{GtMW>XO{|Q05|{wcmP;@u(7f_hSTFTtF2Hbw~~==NF?q_wYI*)5s0Cz zsTYcs*mrYeQP25_wk3Iud~)f`w=I@c^C_bOMT{300D-x%{V$AHKFKGQ>#)V8tz$L= zWL+e=c38Ca5y1?VQEpxOn3H3^#E-TavkKYjvx(=5KQ(5#C=%Bv*dJ^f^CTsQlB~8r z&J_3b`rxW+lOuHbzDkfy(EuI$3<%VAQ@Amk-st*ia|l2SPPC(rrs+a?_1_8SRg$Jj zYHHd>Vo3-IztoZG=yB$m9_p;^A`(NgfGjV~{&-(UO*AmdDwTwD#vK|sQd@(2Z+*7( zAmUcS;#FBPSO+#zNGTq^rYdSWb}~xgBP}N^Z((y_K3Fbj5|p>*CbX*M8X%;&BH)5J z1Rqm_Kf&aRu#r2uDGt3rsV9-KJ00-hQ5?0kZ7ifcM27D61FYMVzdLSw;$a85RgP}^ z1co}0RZ=>6m#FlIYXAwptk2Y-GsAc}=m0O{Y>{{TOHE~lpW z2bcgLb~paGk+3uPk;S&QB@6?yuIXHPDUyzbQtM%`{{Wu&a7r>2LdzKHlCe1T?tj1D9)XHQc`~r3ZeDG1Z7b5rO{WYpU(>O{8{yY2%WHEs zsY)nJzm}$wreY0(M1t&3%VF~)4P*JOiW7mT0H$vUN)5OlQG*n!wa5q3+heEz924@# zTGs$^iCVw{0_#`bgf9%b0*9r*bdqF{dLFWWVn19->!~U0C}*OW-Z_w=Bawax_Xfm# zv0wNRRz{!9AYjE~s|+kJZlo9g0Mm;L%vS}J+k0Br1rv=F>ENDtl~UK}T}0thsSPZQ zPRjcjNpkA?ZAC~(cnC_1cT4Pk zgxlnOv14bsjCzkKqSTSHw39|D>i9R2MU{`uK>De{w{b`v&8e+LRzXB#mRhW;21}J= zA_6Wqw)eyU_pkg@Q>GWRLO%AGR&8 z38?8P^n`U1&l#$#CRs=~Yg~l}*E<1wd*PzVeo3GxE=#EN3{MZVPUjgN+W20kq$@az zI$EDDF}pYl3HqC!{jk~MwR7cu9OtzG0ux5j2I{#5&qwvdva)ch%#lhl5=_2yiJ6cvQ!hXcL2b>*CjH4cj_VC$ zsda5&s?<5fO?!{!S8F1Fx}v~+0K*958~qoe9-nS|t;BZWT*bvOjm?##JU6e0Fz{j# zAp%+nUNUS+usvgsX1CJ~)ehCYK20k)MhqE{Ah^A`+~Ggrp1CB;Gt8DyNnn#kEqm-# z{{T!mM)fb$5|xxGAekI57aR+mZs+dSJM=~2w)uHkF#PHtsw`91xcH`qD|P^}``BRk zqNg;%no5ePOp;y7q96l-VnHYEfXy*j2$6!Z*p=SjB7e3LLzpEqhmFHH*cl^7`xVA} zKFg|^r`-x%nu?}%ifEcpukeW^0CIQO3=y2sMMs(?Bnmo0DIp1AatS-&dU|==H=3$= zC3Lwc76njAJl?|C9(*b$%%q*9^1%RDvD(7epW##5_(kQkd9_@x`8>L&p-}JTLeF8^ z_6FFyJR;PPQCHJwdZ4*oU3_x+Xwf~){TD*a_5hL%fCO+cUwA{R^35-u%PwO*QHEfu z>jXW0b~gariwpV#izhPGlsd1(b;#iG(xSG$o}g4gUHP*ILW>b8A$C!>B>uR&jKBqg zv-0IGIvm}H1x5TbtEBMnLFPIBpo%FoY}&c$X(^}b0lbn#q>;ECM2p;TF?eV&A8hYmyJFkQEM7%S}d|jBr#N(8J-^~DsRE zQ7&mTL?mdS3w4;$4+psy``~Gnf2?}k!VpNYJw{f!J*~Ij2_S|@l*uD00B#oSdAFt< zDUC0b!dRzi3BCHlfCcTa2N~yX7KmwgB_9jWK#_>WT*fc}VpcG1du#zed_HDcmZLJF zf|@#2TM}ILGqZYfeK8&~B7^0^n|gxhzpmeGb>ypcC@LB>BaW_x@7QgI*5D`}QyfSf z_Py-{jtNTSuB)M9W2^k5FtGw&f=2y@{{U<^#a9}v{$rVZ$LeMP?rrL9e%J+F6mdqa zElQRm;6@7*&wL$0mB`K1DOiJI49o{&FKZKkpaQf_otK47eoHhojO5AX+_5{6dz%h7 z^}&>}S4%LmMiS=Z%NMr(xAwt`l?z)uGCWZPBK8HlUgGv0@QXgHhMlRxRn%1zC-EYT zfC%4f069LV0ictzb0b(S#V?|UC{jV0<|+-%k}^rPk6=Hh2%fhtfX-lwslvU!A<`^G z`<_0SY?C+4V^WkkZ9OuR%UGT7^1^u`%q!kOQzC|tgJH0}tTw(RZaayxpmuCyg)Yl; zf+Rzr%8aP&!R^&9Tc0Bs``3xMeR>PG?KvtB6khqyr z(;M==SKNCMgT`A=3|(?9OpM?%F;EA4gSkIZiNpl*RYR1(eIX&BlAS!0G?LW&e1;yWs^EOW(d1A`PWA`$GP@PAH#-sAwXh0$b=ZiBQY>tD9>?Db-kbnSDUSOK zj!yf7gKj%Ubc0OQ6CN>%7A$lD8>0!jY>juLb;)4Hnw2VuAMz=@QF0lGzvz_CBB3|L23 zNenD5I)$(DI8zNWg(aHfvA_IqlDbGhoVfrzfOi9N^uG8pVPj|MVPnYzSo$0|!_c7I ze6V3;AdavB=HmClOkA6-Ey*VSg4pO;I!Uk{&4w1VX?v`UM|I#It`9^)r=+pA;5EN- z&Jr65u=%YYlomoSemmgE;%jcKErrbJqUYfUi{ULy(}ZCZu?DfRVR3(<;|h|yMxv+| z3(v27XYU!Zx-6?&JvLoO9V9PL9HkJO7GOyr6R^J48*PhzOy4`Ckcs12(IP#UE522!_;<;UVK$|jSnnM9RM~uNc=IMw0Us`r`ixXetdcS~ zA(W6uaB-tN3yogv2ZWx#x^|y42sX`iyx<8xeIs^R^G9i>{_9)ml*U1?XSqHy~Qxr;JWXAwLT8 z@N*`cDbj0EQp#U4VN!^jCA0Cl*ez z@dA%PMA_$4O77sUd=*Hnb=$7$>&; z3{jzIQfT9f8gfY&HY`Uzr}|>*$jU7Q3iVMa2sSbSZM_By4uC6>@q--j%eo0pbs7At zbiq(b8(A&u>P9F(#Z_dn>3o`jl%SHK+=9T9(x47M-o^Wv<|!dCD>Q%tI+8XcgWlH0 zW&Bgutku~q5J{sj#Ul|QweCQ;-1=h7q=?GpygL@YsU2`H`c!!X)9a1_>w%7+Mn7x| zju3C#n`1qC>Ih;F!UFt<_2&X$>H$4gJByqf1Qip=5*VbBiP=#}C+G$wxle}r-!`*T zY0B`2hn7Dne^#)<4JUx1lOia$k-!g=>m_t97rIL@D^0wBx0-_g0R6YYj7ODN__L>0&L{LMJ1BM_D7oNScQ}~o ze+{)>dKOfoYC2}$&Z+(yk?IF0=rMEBWf~huPSR23(N9?x#_i_FhS%JaWj~?94MDFe z=9S^2DNdmaU-_GoE$A?eQOEVV&#+7VS2H(kIH-Tw+kXlB!XFRmbYo3bEqSY~nF2cj z(ugm60ehXtC-lJ@kMgt`?R;oQNn;?l1E^g0^(PU0lTqf9(a9{iokFWQw%{9E*4H0Q z13azEszB?NXON)`S&Ncwwaw3a;;vk=%D~2oqO^J!P0Yf|epW<*#lol}vwGShTc{x? zyFI;q@WBRSMN62o8BhYY79@~w+nf%iY2KZZ7zkoED-j#~?dyhj6+U__vATLQGyv#W7e<`P!dV_dI=Wx7?tP`5G2tQ z8H7}^LthF(+c=?0a0B_5%diebjEs+hkG9CzcUS zNkSrIuwRPhfWM|YESbErFI_~jDBq?b)9ba)`{C9a80n-jycDyc1Os-sJMcjpkJASV zFEe(L%K`k?+x96fTj+l-r!UW;N5+ zh+=|C+`B9a5dkA|1?(?t{cuG+E3z46jc4gQ78WC(_;^O8M{c%aqTmY>d+c}T9ZHBJ zksTG-Z*)*^^!}K72rQ(q(iy=%TXg_UhWiWt*zziyt2jkcKm?Qj03!}YX(kN7nA8Gp zz=Li5Ilvm794R8k+mqb>xOz&`HF)BYN`P!QJA?Y147ZpM#29nZNfsONg`P|*g``{9 z+T(lu@zyaYK3WU@hYv}uBS;Od8pNB6_x8Y^m54VS@fHS>G$W`hi*L9)5{|Bw^NJ_M3ct+w zftwK_kz$xYq@KuuZTf?WVgS5acHb&66dk~`1HL>|*u0EFjs4HI26kY>^9cJU^#}xOEC>O*@ zqyP^xmYtZ648p!DD8+z=6XrMrU@x#8hkR0Bi|sK-k!l@1S46S} zs>|LfI@;x)IS%Cehf(y!2LeT;$9kzz>NdFCcNj7zk|~mCSfim1tPbFVa7VZ}3|w4u zfq}io$GGfqFlCL@mql)U6{&Sjwa7Bu)|Q%@80Vyoq^p~##v~{@`cPQ82KU?mcDc4H ze;9R6X_RO3<@p9@B>9WS(>`}AhLIHW9XK0AI~Gt0;2nu9SwD)^tKlw3r09vI6j8|y zK}I2`yRlGDWw93nlg`+O%~rFSYU*ZbCnm_8-1?tDJv;um$IQ%g9ihLv>-ramBb9?A zAnn+H>OUdVbh1d()JAHgH+dwT_V;2>?s>$UPGnR$-eA<3Zd(tLANuOAEGnEouO3IHT45J^4Hsm602=epcYF4M?@ z1_2X5M4Zm97Y!doBL4v8ja2@&z9xD%SHqX)G0mA(%{*+K4yp2+rnf1cTlTeW%UG45%SL3W zjki`sBwOdkD<2d5KmPzuB!vEYpD(DRk(G@9LW*gH*Xid=?S^2&%RB=~_6AOviH8m0LYi6vmExiuen-yRxp01=k1AxRpDNR%SGbTCaOdq>nmhux%IWc`(bSQ)`^g{ zF_Jb=NWG2Cj>mI`rqAnZA~Vla%(A6~aa|AtzT_K|^#j`l=3}#gYN5jM4r!;zT0d{; zO!Dlqk1mKU4HYF4TZ(v9J9>aHYE!_@(z{79>LSjo?bLZE+l(-3+>!E}x(S0*kmRh4 zVwV=l6mC!{Xq7^9bB1piEy$o2EmxI@4y>0WQ?7+ z>@l3|saz`8b&cWPpN{QKj9<#-Y}GY2b+N}!U)imTH-bP|>4UK^Z ze_P?u{&{MrW>%+Jqf>d1fWA1{W!!RlC|`;qJr*G%sl;BVr?!3#SKQl*Lt-Pz4jzR8+YD`Ei}dAoFWm z^}*HIh^dL9rpqIS+x0t=*0DD>z|KogMqo$*x^9#B{Gf;=HVeAi``+G{!m4F5FG!7$0dm880f|FE6rgj- zH)**v`K3=ZMqNq2UBS1e*XIYrNZm}W7_qvQBKvnf*k25E=H-Jk1ABr1+qn0>6_`<~g*B8NNn5^k4vm}6D%u-aT z_8{%_!<{rHGR&o;HXwj@Bh#JmJH;UAC#Kw=U%nM4E-3`D)l{CUs)^=cEFM{l?eix1 zKA3du?t`Y_3+_+1t`#I`pp}srl5C~yMZH1ok2(fIjUPz_+#XNT`+UY7F(j_6F&Ro0 zP!wE}Y(Ib794-=2Vv!ogz+dOK{NMr^e83h?pnuBNBHQqPY#OjD8x`0c?k!{b{qU3Q zf@G);-E~pK7@Ghtd-ekyRh0ue$nH(<0og z@YI&1*A!A4bp}N{-N6K$D2kYn2|Mnj1OEUXaJ^Js-kr(7ZUd5=5w*uB1xd9e#uIb6 z7CT=50N(=Zo;2L4Qf+Gk>&K=Ja822tZcYCH;edHNbt$#}f7c9>1>2BVf^2Wj2l;k9 zlkMq)li(L1w$|9&9%fr#rq}EZ@JU(#rz$TX1#Pntaex;96;ePuUjG2`z~z?0+9x9)I~N({0pS~*Bvhe;re1kTJrW>9^$x8DWD(p(E0F|i==@6J6k z#3m^mf=eDqxAnqFb^1dSVbnL+?}DY8FsACq++)rct8-#I_qV6Z9$5Ox0Pc4K2|6XE zVPdAhb|+(wE3k6Nz#aJB*gV5!*mWK)dtdL5c}Bzq3vW;V030Jl(Mm$ClsH&!gI;4?6^dxQf!n#dXm7_4&lVPzW;YUicj<*N67vtr=6XmoTk2DH0 zoSLR+j}uCwD2G4iasm2Z6MZq^C1rF?SE+NBiaE4^xCJ@DmaT zB|vIxDI#))W-WVJMbFC=M!53Ewa&bybzjd*V8DV8QMe%RZ+vboF`=}+nyij-OA)OM z2$rT_Il#Hx6JS1I3}OEO5E-9dY8EZjPHR+2^*(FwiJ@uLx^@t5lQ}zK!$;SDhie>{ zFbH4r*@P2xgJODQ2H#s@tdogng4rBelf_*-lg`Cqo~$&aauES``zge-osqOs)A?q- ztkpBh+Il(EDL047{vvbDt`E!`VvzhzQR*5wvL(;fwVF@N$qUrVTHvx0pkLtwZN2fY zvZ%5>H9{zIzsk|Xg2V`kB-rjqn35S*D#_vNiuSXj5D)%CipJ}7 zETHX{T!}~*8;;`xzorWW+mZ%44`6XKO$t)-p0bt^Q5uW%IzGo^)q89~+n)Gyj$V)s z#P_%-5$ahO{$89Lt4K)$>Hh#6JsvU7XZ>ru=rWHh)7rmvA=5C&Q<_BYDiucSWdPr9 zHn*-OxsGK{kp=TqHNXIyAHFMmt%?>ZY;9|dDS24P31UtAoKg~K1OU25G|1rR9u(!H ztcn(zXNnR(l~y!jPW)cy^}>g$joe5o>m*i;U#?=7HW#oK+V{gXLdDWd^%F`*Dz;Jg zz73&0s;eX*?5K#;u6(U-geQ>7+hNk+yFXrvYFRUufvgn}?oUfT;?d!6t= z%9qL#IDVtc8#1<3}$@-A@tX(I?(tffc+NH=bH99!#yX&{B9Wi;MtbYzSfIs!S^F+SYb;t>!W ztp{W{@S~MfGu2d?CX!jmunbMM^s(a#Aj%bExKM!ByUW@L`eEn zslC)#{->ND3?+jCI}!-*^TF)|ip(Nr1#WJ8^Y_P3n(+pgrH7yZ8}HnGuz*U?A&I=j zA%BQBB#r)C@-Td`9=DcKh=$| z*hU4py@=fXaP*j>L{aoBAw6Upu{Q)B*6(a}qkG&)NdSVR3jw*Xz^K7c!6XbASoJ6% zbGW|a3K9u=N$OJ->`lNU>4!{%5D5?^?vO~aAPuY!2ldAl z9d~Y)H{RQRm@yC*YZ5MZvBF7t66^yrT<}TT0b*==ZY{~U+;7<6$F;ZIj^k`_sjwjI zMa7R8NKgv`0ZyhM+>3xm%N=Ifq-JG2{6O6EfH*2k4hg|>q=S~RCh7^;`uE%02@)~p zjUs02ZnME7Zu=V>;E^<)C73H;y57KV-}+;X8-hsnq@D=>0P(^} za3Zb9V9XCBY&rMAY#K*m%hO}I0>I#JEMW;Qpx(y#1IowwT(Im8*76J{h4xCY;@02qz{YN-S=`2|lO}ee$9hR%%A(c(L6NWmh z=9()5G;CY>ZE$bC*6)XXJ*Bm7pqNPoG0P~AH8rYMiH(9@vyuX1QLNpp6=)mX-w;j+P}C9PFq#A3!krN#|rG;^=Oxy+7f$Z&xU6 z_PU;iBg_=d=1O_m2j3OeWvsP6YgboC9d&J6OLTOEvzHt80iYURT7AgS7biwp4TlAjY{ zu8U(uNj%>VJFk{4xbG$_lFa`A%nir+hd8r50G>KJ{XtZf5k+188|6`Xuh5SxNTexa zu((re*k8T|XMxWOc1Gv=S}c{N;)=4Wnn@d$emi8sUBjtxr^glL^ zoKKdrfH3cU@YNJk8gxkGQ)0zjY}Yp0{rKDFa3!9y z7PQf`0m&lA?ToCLyXTY;1;`q0Onb4oaT)zxKn0 zHEk@0;#IeO$M?olv8BJIb+C1eG5`+&OeV}J5yL$*Re`@tNMk~G*nzqIMgnV+dX|xC z^)E+a_-iw()Y8~pJjVrcB3bnka5qx?1!36>PN z+WV9B!O>;Q(fk0V0J{>sAy0ey{V?YsF2KeBTLIE81?+uKCkG^Qv_TveRXs!=FY9al zFN4wt3L^4(O=6fUg=qr?z4{40zw>-ArK78O%hSLni~{9FiLl&~FMYjms3?Z&k@S`u zl0o}>`e5p4X~KDuOi3ofBm@!-_rD(2!_pE`cn9#MkTH%xz{eV=QZNMEl1{*FwU0Pb z^%WHo&n)Va$vNsOprR?gt`!I#!)tqBvY{_#x!?nEPdwpN6%sYntZFVgRW<;Q0N?Ar z6(p0qW>CEmN>v9Nk`1@HzB}awJuR^&0KW(MuP=i1-b-vM%vxmaC| z#_Z9BAol}(@br=?!l(gR!5gUx08_p?k0D@B^AJe`ZTp?O;ZXdb%Zp0gH9lZafyub_ zBGw-=a5&?HfXv}rxV^|5^S=0W#V5On?8=}6aKmDG=Y8-cLd38Ix<$z3+vR*KWiH35 zfJ1TtI}UyMz=UGfQFGjYO}+WUQX5HxM1sy6efT?iVBUb>1~&tX?Y{lS_&7wW+qox@ zqU87Y$4XdPdY7wmZ)1l^7NkY+kf;v8mi_Q2M*`?jsO)Y)Khpz5K*TUbVr)8y1oL5Y z+~6{Tq0Rb8Hr(3(0H^PSlH^HsV9Y@#moDmgd*0FDIV0tPoA9qf0*B!E!3U~Owy zpZPfGjD%j0wgYl+f3Nk&nU{0a#4hDcxb`C+6+v!%(4da$eg4=;k=d&i+pOOAzi*%02{=lcq;~`ZxVhweZ-6xYUlCQ@a8KU^Y@n71+>kKVmXxkZkwFXvxv|`S_)9)yv7<7wl>pzU+t%^mGj`A$`-v&bTBvn{ABN-jxULBRpDs!1lj&=HAv*s zQI9Qq>|`L4K0qIQPW3K(ljKTdudYutZRI2N$T{Q#u=(2+map-Gww9z*usdE)*jYVx)HysFG+mpb)-%L(4$Ay)7KD`lvflB$$3 zBq|bA9r!+&MTGKG2Z8j37s)(2k*TAbP*lNRJYUF>IgJ3^*|r7u?nuR_CM<5+t_XOMz(+v8XF`;Ohn=qh7lmonw#^b*K0Lm^tM-?pw zqs(9->7#3t!rTM&^}|-Y@jEih^C@zf%{<%+3NJW9%cE!(|c!f_UT~xKP2+WbX2>Q#J0R&rZ ztZ%*XP9md=1GwyP>^tmLhKdwIdNWb^k_f8hk|d>aZPMr&zd}d{ z*y6m1gt#hLdS4b_hEX(nVp%{cvemf&abT)Hz8ZFi4biqoMs+u0qAQ+92x@%Zp0Vnp zVyF1UK(^MkvB@`@mobwlo;rM{YPj#xW=P$HN1I%156=j{IaLd&nH@^(I>83s zo8!q2VfjF5jJ{KnSR)V#2HSvru#QSG!I+}`Cx-nKAn}db5Im1sHuS-V5o|Cb|hXOZ1T0z-df&ics z9@p5Bu|Fe&1S}jpa&%l+^z1F^e_SYNq-fkmuOhDOR1y?>o-yJdV8Y~g2e<3SC8ZUh z#R!d9g38a!b&Fc$k!xRnYzk_4#C>W(Alkqi0lwsuxxwZ(LZQI~i}aIweQ(YTv9T9Y zZM}`aJNNEzsWqg9h#-XwEo%+GY$&8?ps8AkX<@4Z{ZUF!Ne2DF1bZ9cQAWKi8JGe# zWj43WcNpRVpAxYI?Qyli>~N_%8$blTL_(3dW95nNP!7iX-+hkw1WK$(9ai)_j2jXQ z8!H;?G8ytZ~{b+Fi4z;G-! zAHEc$bRk6`0&lnkkFPfR;9!7$B1o|}H{1RgbjXK=Iu`5k5Ay{i{cVASQa2=lz&9Vi zd<|K{0-#y0P0qvn;K;?LR%TWBw=H`CziaLe5=l8;tL~tKxL`rH`&jdVqAZ7?BOj1E z^V;}PBkT^u6UU|fKej#AsnkIr+Q5!S-w84VeK5+hFHx0AAe96QUvdrZIKhYG1c&MG zaCrX!hqeocbv|Po4S>IIe_SX?<0!ucfnq^B1N6d41yBS8mMm{`ZHVk|esS5Aj6jNp zTYMk@2>avG4v@r!QG0V?`rn)c#vPT|^@J9&*nGwwl3WpxoSru)d!K)N1|KfO0KGu= z7P0+stS3?(iXK7g`Rs6-SR5-z0a7^^x%u;ik`;*zs#Q&_OACSX7r}*5z(X7+z<(;* z#CIF>g5i}_Kx>6N5_!4r&JILd6<(q{k?DkzG9snAnB0M3y|M0q7&#qwzQq0hm@F#C za&ApQsKF+xlM#H6s~GCd%Lqz`e(Q_~48J&E|B6+>h6Oc)?FtzE}Z( z0e9xa`|pI()yuF8@RMNIxE%MtI7!mNv8-%W?Q>yZY)1D!*yqLYm7PV+tiTcS{@6*? zDvK*zk-g8)et5@`i9lZJ#Gizo2XoF6NW$^4JtUp&ZY|Hh7!t|_*4F9Tz~2R=Zq7=# zNf#h(@9)R91R+NXReG$ukO{HG6wSks`Jzhz~^!g z^uq>TxxS^%W1-XVyz-lmFfmwA3*PQ_x3@RM^C9qBqFS%aYFzGFSAMEmLO?w1UAMQ$ z51tqjcur_?R8oBAnOsJO8kr8ru(2ea_5cHZJ7M1?(mJC$1&st*MJwEgt8yQ`h(W#n zU}D$EG-g?nffh%WQPHRtE(cVkZ+p49Kdu3u=Xz%%5+z<_v(%s@!w<&b@3A}&sljRY zD0SY=35O=|;~|4=(zd%Zl$)}%m|?!-`4HTL?oK6B%cr!>6jbxeMU}!uqKMfG0qCQ1 z^R_BoU*b-2TS|Y!6Z|ri5(KI*D-HQ$#>cQ2s`HG~H_mGnT3Wi2X-Vvt5Zd+Sl*zi9H6M%W{WgV4s*%@fH^#*xLL4pkb}W5Mvwi zqro!_!gVrc5HFh_m=#MqT#`CS17qID7EX)s^GN0~#Z#TtH1(?=NvC4*!*PA?4bSQ@ z-u1Ckh>_u02^Lwb5R0A0`|bTOG^jJm5^UN?A|TxKmjLf=f#BiV(cg55u|s8L+d&Ou$y4lA9{r*^Q&GO1z%AM9_RzNJu!+!QV{{Tz_g`;Vu zMb*tappIDBfx+J62*CKP4UehY7Hximqh}@;nk(MGHOJo!b^0$dfU%~LX9Iqg*#7`* z4I5I21sEwH0GT0c_YNj+=%~sn3vque*!@7o zg`je_Y@JO^4+EEG5rb<3^TBE-VoSt$!?l;=@u|Ir6wXRc9n1p!Wr^~&Ri-UiB zSdBo4LV`}jfKMMS@S0j8;HxdqsN7+Qu|)_pY$_^x3W`aB)FDt!gAK+FT5^DpV{7n8 zJAX`Dwfbt3rZ!n&1RiW{Z+>vl`U0Jv$vsLhpkRM-fej;sdhK&X&_gbsrZQ}7#G71h z$F?5^O9PvEVB39#!5+UXJ7ifRWx0A&L)KLm!J5RLZ-48DIFV6$Tm@hcNbGsz1{#2s z6gdSXj6tQ0pF)7&2&U1Qbk5Aw2(~u5i+_&60HkL5PV9v+x_oM7D}7i6^`d%q}+Po-zG4Cg<$tLBe?x}!J#^U0k{@DKpvy> z!=|)C4v}&$zQ*5QmITFiV!LnvH@DZ<2Qu|7h_$;8`1D8wgQcub`Iu}u@4gac#6pZk zuEbu~;|7Q&WiC}f9m%(@*S-TGP))AH9><&w3{rnHIRpHsZTG@S7t%|7R<~vBFlvVC z3|NzWi9c*~jmabsI0W)NIp+d0F*|gSK>>RXaFZbtfRcKK+t}XUOcyAKLQT#80NOnF z+Smvu%mI`Tt$$E{d*EeR=O@lqH`}BV0pIO}lI@kF1a&aCDh<7`5YE8#uIII{^ueu6 zdVyuRJCZiv_5CnskOi26Nj4ypZ=MoJl?LE2Qp1uD+Sol+n327Qdm9XJT^yLgfpf7I zx%R-!jplU8>2bLu<%E&~K(f0NW72mAkJ9)!C`ARCnL)T+t$cMBHUvn-6LZuC!0+4B z1<1)5U?l2cuofcYeZe?LS3@#6yLA)sb8K+2Vpwc@*x&l&%ObE;3JDhlulMJ1f_l-3 z3>wD!18Z~k!bFZ@7By!9x7d1r#~oK-w+unO!5_Xjr>ps0LI5{oVgS8`y>Z8sC_M$P zZg=hX;|U5fb}j)n>fnyY-wC9$kXA-2yr}?yeNTK0F?0qtTkutZ-~N4Y7f0WzRDrk) z$o2=<(+LtF6jvhP19Aa2zqRj=F^!Rmg*P@NZGErnV}l+pp>pg?4pl%So^B7<9D*34 zhC*%uJ0MaCCi{yUewM^JAr43Y{LXDiYQ06zo=|y!Y&TVYPvKU3 zH^rUj^t32O@j!-Ww)BDZzWT3f8Zi zBgs>$dWdPj7YG{G=Y<`y3DmwVWjTFAQswb1l7%*wpxJM|fB^pFVv5f-x93y}T6s)@ z*Oi=tPWR)Vo(agZY|m6xv3i(cKnpWe%n*TMb{DxnAaEv2*eM$b8@Q>irtwcb%xNB$ zD#@dkU5ZnH0loGX+>fp!)EPdq&n6-oN2HCw4D$|+x4AdpoJgp2eI{8H6*+ce7GUyI znFB0N3}hP-xdeRh=LL3oMF?UILh=fmu(&$|bGOd|K|G?cHVM{)MrjIKNaoM8it4P* z5DB4R1Z0703k%z8bA?G;mr_IdT3oi0Iv_UakD$2R4Z$S*$ir16@m5RKDl@nFm78&U z?Q{PC3u40487@Pbh}G(Rxln&2n>F{~@JAStpmtHY$GVPDRB6=dW}q>-Hw2EWefuBM z_(z+X9M+_X8C9=kW&uDO*xzryCz^{#QPRfM3z#t5;g8D({P!Nc@dT`(tcjXMfE8Pj z@!f&naen^TA}IhRF;q|_Q?e|+Xt@?9_vdSZLBSG3BxERzrOo#r-@YVt_0cpWW)jIH zma%^=Ks?wU`+AFD2~(9*gFIB;bfDZNLl#0e+QP@&8|{Tb6_ppMEqCg24g2@!(}RL` zBp#y7IRju%rSJM-ZEM8xvxR8bu^~^y03_@Wr_Tf|Vn!&AppZ|*!9lhAlWXCVqN9pV zmi{{}+o&l&es{q9wpC)=0l!ybeGdHKY^17?LjW#7zTVjIHai9<)sOt&43aD{*b;Xa zAe?mG!O6AG#`iWHl080nFa<5L+WY)OfH~W4a25c$Adp(%5G`yZkbwC7&XqmJ!pHtN z1NpCZmhIQDVl97{^!nh)l!8@>V`~N*8*j1feeiqvZmO$JKv7~9&5t{PZ)4w_Dny&b zEtr!cfHx(+yAgmGmO|_idP%jE+zx&A!<_NP0~HDs4U*SA_XqxY!A1{+7=o)?axMwy zo$%C}(IS#REt*KcRTm@+j`r9dFc+n#1zs>B1a3O64X^bdTpH-CtT(g(lWFwY?APj+$~dX6XZyf9!d}gbJsx%wXgY zM@_}I_4;6GB&gxzPzs%|zprDlzorsMlM!G#hfy5#kO3a!i=S)@%8Zazqb9@^YxDg+ zcr>D-5+zd1gp?cuy~X< Date: Fri, 27 Mar 2026 14:00:23 +0100 Subject: [PATCH 02/73] reorganize scripts/extensions Signed-off-by: vladmandic --- CHANGELOG.md | 2 + html/locale_en.json | 3 +- installer.py | 2 +- modules/face/__init__.py | 2 +- modules/loader.py | 4 ++ modules/scripts_manager.py | 34 ++++++++-- modules/ui_extensions.py | 21 +++--- scripts/animatediff.py | 2 +- scripts/apg.py | 2 +- scripts/automatic_color_inpaint.py | 2 +- scripts/blipdiffusion.py | 2 +- scripts/consistory_ext.py | 2 +- scripts/ctrlx_ext.py | 2 +- scripts/custom_code.py | 2 +- scripts/daam_ext.py | 2 +- scripts/demofusion.py | 2 +- scripts/differential_diffusion.py | 2 +- scripts/flux_enhance.py | 104 ----------------------------- scripts/flux_tools.py | 2 +- scripts/freescale_ext.py | 2 +- scripts/hdr.py | 2 +- scripts/i2i_folder.py | 2 +- scripts/image2video.py | 2 +- scripts/infiniteyou_ext.py | 2 +- scripts/init_latents.py | 2 +- scripts/instantir_ext.py | 2 +- scripts/ipadapter.py | 2 +- scripts/ipinstruct.py | 2 +- scripts/kohya_hires_fix.py | 2 +- scripts/layerdiffuse_ext.py | 2 +- scripts/lbm_ext.py | 2 +- scripts/ledits.py | 2 +- scripts/loopback.py | 2 +- scripts/mixture_of_diffusers.py | 2 +- scripts/mixture_tiling.py | 2 +- scripts/mulan.py | 2 +- scripts/outpainting_mk_2.py | 2 +- scripts/pixelsmith_ext.py | 2 +- scripts/poor_mans_outpainting.py | 2 +- scripts/prompt_enhance.py | 2 +- scripts/prompt_matrix.py | 2 +- scripts/prompts_from_file.py | 2 +- scripts/pulid_ext.py | 2 +- scripts/regional_prompting.py | 2 +- scripts/resadapter.py | 2 +- scripts/rocm_ext.py | 2 +- scripts/sd_upscale.py | 2 +- scripts/skip_layer_guidance.py | 2 +- scripts/softfill.py | 2 +- scripts/stablevideodiffusion.py | 2 +- scripts/style_aligned_ext.py | 2 +- scripts/t_gate.py | 2 +- scripts/text2video.py | 2 +- scripts/tiling.py | 2 +- scripts/xyz_grid.py | 2 +- scripts/xyz_grid_on.py | 2 +- 56 files changed, 98 insertions(+), 170 deletions(-) delete mode 100644 scripts/flux_enhance.py diff --git a/CHANGELOG.md b/CHANGELOG.md index dba84a637..330e9f4b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ But also many smaller quality-of-life improvements - for full details, see [Chan - legacy panels **T2I** and **I2I** are disabled by default you can re-enable them in *settings -> ui -> hide legacy tabs* - new panel: **Server Info** with detailed runtime informaton + - rename **Scripts** to **Extras** and reorganize to split internal functionality vs external extensions - **Networks** add **UNet/DiT** - **Localization** improved translation quality and new translations locales: *en, en1, en2, en3, en4, hr, es, it, fr, de, pt, ru, zh, ja, ko, hi, ar, bn, ur, id, vi, tr, sr, po, he, xx, yy, qq, tlh* @@ -103,6 +104,7 @@ But also many smaller quality-of-life improvements - for full details, see [Chan - **Obsoleted** - removed support for additional quantization engines: *BitsAndBytes, TorchAO, Optimum-Quanto, NNCF* *note*: SDNQ is quantization engine of choice for SD.Next + - removed `flux_enhance` script - **Internal** - `python==3.13` full support - `python==3.14` initial support diff --git a/html/locale_en.json b/html/locale_en.json index 84d715fcf..6c6c2a662 100644 --- a/html/locale_en.json +++ b/html/locale_en.json @@ -424,6 +424,7 @@ "e": [ {"id":"component-883","label":"Enhance prompt","localized":"","hint":"","ui":"script_flux_prompt_enhance_(legacy)"}, {"id":"prompt_enhance_apply","label":"Enhance now","localized":"","hint":"Run prompt enhancement using the selected LLM model","ui":"script_prompt_enhance"}, + {"id":"","label":"Extras","localized":"","hint":"Additional functionality that can be enabled during generate"}, {"id":"btn_extensions","label":"Extensions","localized":"","hint":"Application extensions"}, {"id":"","label":"Extract LoRA","localized":"","hint":""}, {"id":"","label":"Embedded metadata","localized":"","hint":""}, @@ -1242,7 +1243,7 @@ ], "s": [ {"id":"txt2img_sampler","label":"Sampler","localized":"","hint":"Settings related to sampler and seed selection and configuration. Samplers guide the process of turning noise into an image over multiple steps.","ui":"txt2img"}, - {"id":"txt2img_scripts","label":"Scripts","localized":"","hint":"Enable additional features by using selected scripts during generate process","ui":"txt2img"}, + {"id":"","label":"Scripts","localized":"","hint":"Enable additional features by using selected scripts during generate process","ui":"txt2img"}, {"id":"","label":"Scale","localized":"","hint":"Resize image to target scale. If resize fixed width/height are set this option is ignored","ui":"txt2img"}, {"id":"xy_grid_swap_axes_button","label":"Swap X/Y","localized":"","hint":"","ui":"script_xyz_grid_script"}, {"id":"yz_grid_swap_axes_button","label":"Swap Y/Z","localized":"","hint":"","ui":"script_xyz_grid_script"}, diff --git a/installer.py b/installer.py index 188acb767..a701cb644 100644 --- a/installer.py +++ b/installer.py @@ -527,7 +527,7 @@ def check_transformers(): else: # Git commit-pinned version current = opts.get('transformers_version', '') - if (pkg_transformers is None) or (current != target_commit): + if (pkg_transformers is None) or (pkg_transformers.version.startswith('4')) or (current != target_commit): if pkg_transformers is None: log.info(f'Install: package="transformers" commit={target_commit}') else: diff --git a/modules/face/__init__.py b/modules/face/__init__.py index 7cde0a06c..e42150c9c 100644 --- a/modules/face/__init__.py +++ b/modules/face/__init__.py @@ -8,7 +8,7 @@ from modules.logger import log debug = log.trace if os.environ.get('SD_FACE_DEBUG', None) is not None else lambda *args, **kwargs: None -class Script(scripts_manager.Script): +class FaceScript(scripts_manager.Script): original_pipeline = None original_prompt_attention = None diff --git a/modules/loader.py b/modules/loader.py index 6e5c7adf2..d57bfd3b7 100644 --- a/modules/loader.py +++ b/modules/loader.py @@ -16,10 +16,14 @@ errors.install() logging.getLogger("DeepSpeed").disabled = True timer.startup.record("loader") log.debug('Initializing: libraries') +debug = os.environ.get('SD_LOAD_DEBUG') + def report(msg: str, e: Exception): log.error(f'Loader: {msg} {e}') log.error('Please restart the app to fix this issue') + if debug: + errors.display(e, msg) sys.exit(1) diff --git a/modules/scripts_manager.py b/modules/scripts_manager.py index 044614f37..e9381f53b 100644 --- a/modules/scripts_manager.py +++ b/modules/scripts_manager.py @@ -46,9 +46,13 @@ class Script: paste_field_names = None section = None standalone = False + external = False on_before_component_elem_id = [] # list of callbacks to be called before a component with an elem_id is created on_after_component_elem_id = [] # list of callbacks to be called after a component with an elem_id is created + def __str__(self): + return f'Script: name="{self.name}" filename="{self.filename}" external={self.external} parent="{self.parent}" args_from={self.args_from} args_to={self.args_to} alwayson={self.alwayson} is_txt2img={self.is_txt2img} is_img2img={self.is_img2img}' + def title(self): """this function should return the title of the script. This is what will be displayed in the dropdown menu.""" raise NotImplementedError @@ -226,11 +230,11 @@ def list_scripts(scriptdirname, extension): if os.path.splitext(script.path)[1].lower() == extension and os.path.isfile(script.path): if script.basedir == paths.script_path: priority = '0' - elif script.basedir.startswith(os.path.join(paths.script_path, 'scripts')): + elif script.basedir.startswith(os.path.join(paths.script_path, 'scripts')) or script.basedir.startswith('scripts'): priority = '1' - elif script.basedir.startswith(os.path.join(paths.script_path, 'extensions-builtin')): + elif script.basedir.startswith(os.path.join(paths.script_path, 'extensions-builtin')) or script.basedir.startswith('extensions-builtin'): priority = '2' - elif script.basedir.startswith(os.path.join(paths.script_path, 'extensions')): + elif script.basedir.startswith(os.path.join(paths.script_path, 'extensions')) or script.basedir.startswith('extensions'): priority = '3' else: priority = '9' @@ -351,6 +355,8 @@ class ScriptRunner: script.filename = path script.is_txt2img = not is_img2img script.is_img2img = is_img2img + if path.startswith(paths.extensions_dir) and not path.startswith(paths.extensions_builtin_dir): + script.external = True if is_control: # this is messy but show is a legacy function that is not aware of control tab v1 = script.show(script.is_txt2img) v2 = script.show(script.is_img2img) @@ -458,6 +464,7 @@ class ScriptRunner: dropdown = gr.Dropdown(label="Script", elem_id=f'{parent}_script_list', choices=["None"] + self.titles, value="None", type="index") inputs.insert(0, dropdown) + # internal with gr.Row(): for script in self.alwayson_scripts: if not script.standalone: @@ -471,10 +478,11 @@ class ScriptRunner: script.group = group time_setup[script.title()] = time_setup.get(script.title(), 0) + (time.time()-t0) + # extensions-builtin with gr.Row(): - with gr.Accordion(label="Extensions", elem_id=f'{parent}_script_alwayson') if accordion else gr.Group(): + with gr.Group(label="Extras", elem_id=f'{parent}_extras_alwayson'): for script in self.alwayson_scripts: - if script.standalone: + if script.standalone or script.external: continue if (self.name == 'control') and (paths.extensions_dir in script.filename) and (script.title() not in control_extensions): log.debug(f'Script: fn="{script.filename}" type={self.name} skip') @@ -485,6 +493,22 @@ class ScriptRunner: script.group = group time_setup[script.title()] = time_setup.get(script.title(), 0) + (time.time()-t0) + # extensions + with gr.Row(): + with gr.Accordion(label="Extensions", elem_id=f'{parent}_script_alwayson') if accordion else gr.Group(): + for script in self.alwayson_scripts: + if script.standalone or not script.external: + continue + if (self.name == 'control') and (paths.extensions_dir in script.filename) and (script.title() not in control_extensions): + log.debug(f'Script: fn="{script.filename}" type={self.name} skip') + continue + t0 = time.time() + with gr.Group(elem_id=f'{parent}_script_{script.title().lower().replace(" ", "_")}', elem_classes=['group-extension']) as group: + create_script_ui(script, inputs, inputs_alwayson) + script.group = group + time_setup[script.title()] = time_setup.get(script.title(), 0) + (time.time()-t0) + + for script in self.selectable_scripts: if (self.name == 'control') and (paths.extensions_dir in script.filename) and (script.title() not in control_extensions): log.debug(f'Script: fn="{script.filename}" type={self.name} skip') diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index ef773a378..a77b1a296 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -393,28 +393,29 @@ def create_html(search_text, sort_column): tags_text = ", ".join([f"{x}" for x in tags]) if ext.get('status', None) is None or type(ext['status']) == str: # old format ext['status'] = 0 + style = "style='cursor: help;width: 1rem;margin: 0.2em;'" if ext['url'] is None or ext['url'] == '': - status = f"

" + status = f"
{ui_symbols.svg_bullet.style('#00C0FD')}
" elif ext['status'] > 0: if ext['status'] == 1: - status = f"
{ui_symbols.svg_bullet.style('#00FD9C')}
" + status = f"
{ui_symbols.svg_bullet.style('#00FD9C')}
" elif ext['status'] == 2: - status = f"
{ui_symbols.svg_bullet.style('#FFC300')}
" + status = f"
{ui_symbols.svg_bullet.style('#FFC300')}
" elif ext['status'] == 3: - status = f"
{ui_symbols.svg_bullet.style('#FFC300')}
" + status = f"
{ui_symbols.svg_bullet.style('#FFC300')}
" elif ext['status'] == 4: - status = f"
{ui_symbols.svg_bullet.style('#4E22FF')}
" + status = f"
{ui_symbols.svg_bullet.style('#4E22FF')}
" elif ext['status'] == 5: - status = f"
{ui_symbols.svg_bullet.style('#CE0000')}
" + status = f"
{ui_symbols.svg_bullet.style('#CE0000')}
" elif ext['status'] == 6: - status = f"
{ui_symbols.svg_bullet.style('#AEAEAE')}
" + status = f"
{ui_symbols.svg_bullet.style('#AEAEAE')}
" else: - status = f"
{ui_symbols.svg_bullet.style('#008EBC')}
" + status = f"
{ui_symbols.svg_bullet.style('#008EBC')}
" else: if updated < datetime.now(timezone.utc) - timedelta(6*30): # TZ-aware - status = f"
{ui_symbols.svg_bullet.style('#C000CF')}
" + status = f"
{ui_symbols.svg_bullet.style('#C000CF')}
" else: - status = f"
{ui_symbols.svg_bullet.style('#7C7C7C')}
" + status = f"
{ui_symbols.svg_bullet.style('#7C7C7C')}
" code += f""" diff --git a/scripts/animatediff.py b/scripts/animatediff.py index ee23187b6..12df8c3e3 100644 --- a/scripts/animatediff.py +++ b/scripts/animatediff.py @@ -198,7 +198,7 @@ def set_free_noise(frames): shared.sd_model.enable_free_noise(context_length=context_length, context_stride=context_stride) -class Script(scripts_manager.Script): +class AnimateDiffScript(scripts_manager.Script): def title(self): return 'Video: AnimateDiff' diff --git a/scripts/apg.py b/scripts/apg.py index 35f083457..29d4d5ecd 100644 --- a/scripts/apg.py +++ b/scripts/apg.py @@ -6,7 +6,7 @@ from modules.logger import log registered = False -class Script(scripts_manager.Script): +class APGScript(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/automatic_color_inpaint.py b/scripts/automatic_color_inpaint.py index 83885824c..aab406934 100644 --- a/scripts/automatic_color_inpaint.py +++ b/scripts/automatic_color_inpaint.py @@ -29,7 +29,7 @@ img2img = True ### Script definition -class Script(scripts_manager.Script): +class AutoColorInpaintScript(scripts_manager.Script): def title(self): return title diff --git a/scripts/blipdiffusion.py b/scripts/blipdiffusion.py index 4376ba3f0..118120021 100644 --- a/scripts/blipdiffusion.py +++ b/scripts/blipdiffusion.py @@ -3,7 +3,7 @@ from modules import scripts_manager, processing, shared, sd_models from modules.logger import log -class Script(scripts_manager.Script): +class BLIPDiffusionScript(scripts_manager.Script): def title(self): return 'BLIP Diffusion: Controllable Generation and Editing' diff --git a/scripts/consistory_ext.py b/scripts/consistory_ext.py index 4d1d4dd06..e0de9f1d4 100644 --- a/scripts/consistory_ext.py +++ b/scripts/consistory_ext.py @@ -16,7 +16,7 @@ from modules import scripts_manager, devices, errors, processing, shared, sd_mod from modules.logger import log -class Script(scripts_manager.Script): +class ConsiStoryScript(scripts_manager.Script): def __init__(self): super().__init__() self.anchor_cache_first_stage = None diff --git a/scripts/ctrlx_ext.py b/scripts/ctrlx_ext.py index dced80c77..41a2bcef0 100644 --- a/scripts/ctrlx_ext.py +++ b/scripts/ctrlx_ext.py @@ -6,7 +6,7 @@ from modules import shared, scripts_manager, processing, processing_helpers, sd_ from modules.logger import log -class Script(scripts_manager.Script): +class CtrlXScript(scripts_manager.Script): def title(self): return 'Ctrl-X: Controlling Structure and Appearance' diff --git a/scripts/custom_code.py b/scripts/custom_code.py index 30ad81cf2..7c45d2f7c 100644 --- a/scripts/custom_code.py +++ b/scripts/custom_code.py @@ -35,7 +35,7 @@ def exec_with_return(code, module): return None -class Script(scripts_manager.Script): +class CustomCodeScript(scripts_manager.Script): def title(self): return "Custom code" diff --git a/scripts/daam_ext.py b/scripts/daam_ext.py index 602cf975d..af8ca3add 100644 --- a/scripts/daam_ext.py +++ b/scripts/daam_ext.py @@ -9,7 +9,7 @@ from modules.logger import log COLORMAP = ['autumn', 'bone', 'jet', 'winter', 'rainbow', 'ocean', 'summer', 'spring', 'cool', 'hsv', 'pink', 'hot', 'parula', 'magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'shifted', 'turbo', 'deepgreen'] -class Script(scripts_manager.Script): +class DAAMScript(scripts_manager.Script): def title(self): return 'DAAM: Diffusion Attentive Attribution Maps' diff --git a/scripts/demofusion.py b/scripts/demofusion.py index c6bdb046f..4f1c47925 100644 --- a/scripts/demofusion.py +++ b/scripts/demofusion.py @@ -1220,7 +1220,7 @@ class DemoFusionSDXLPipeline(DiffusionPipeline, FromSingleFileMixin, LoraLoaderM ### Script definition -class Script(scripts_manager.Script): +class DemoFusionScript(scripts_manager.Script): def title(self): return 'DemoFusion: High-Resolution Image Generation' diff --git a/scripts/differential_diffusion.py b/scripts/differential_diffusion.py index 24aa844b6..d0f13a078 100644 --- a/scripts/differential_diffusion.py +++ b/scripts/differential_diffusion.py @@ -1847,7 +1847,7 @@ MODELS = { } -class Script(scripts_manager.Script): +class DifferentialDiffusionScript(scripts_manager.Script): def title(self): return 'Differential diffusion: Individual Pixel Strength' diff --git a/scripts/flux_enhance.py b/scripts/flux_enhance.py deleted file mode 100644 index 6ce2d3e9a..000000000 --- a/scripts/flux_enhance.py +++ /dev/null @@ -1,104 +0,0 @@ -# repo: https://huggingface.co/gokaygokay/Flux-Prompt-Enhance - -import time -import random -import threading -from transformers import AutoTokenizer, AutoModelForSeq2SeqLM -import gradio as gr -from modules import shared, scripts_manager, devices, processing -from modules.logger import log - - -repo_id = "gokaygokay/Flux-Prompt-Enhance" -num_return_sequences = 5 -load_lock = threading.Lock() - - -class Script(scripts_manager.Script): - prompts = [['']] - tokenizer: AutoTokenizer = None - model: AutoModelForSeq2SeqLM = None - prefix: str = "enhance prompt: " - button: gr.Button = None - auto_apply: gr.Checkbox = None - max_length: gr.Slider = None - temperature: gr.Slider = None - repetition_penalty: gr.Slider = None - table: gr.DataFrame = None - prompt: gr.Textbox = None - - def title(self): - return 'Flux Prompt enhance (Legacy)' - - def show(self, is_img2img): - return True - - def load(self): - with load_lock: - if self.tokenizer is None: - self.tokenizer = AutoTokenizer.from_pretrained('gokaygokay/Flux-Prompt-Enhance', cache_dir=shared.opts.hfcache_dir) - if self.model is None: - log.info(f'Prompt enhance: model="{repo_id}"') - self.model = AutoModelForSeq2SeqLM.from_pretrained('gokaygokay/Flux-Prompt-Enhance', cache_dir=shared.opts.hfcache_dir).to(device=devices.cpu, dtype=devices.dtype) - - def enhance(self, prompt, auto_apply: bool = False, temperature: float = 0.7, repetition_penalty: float = 1.2, max_length: int = 128): - self.load() - t0 = time.time() - input_text = self.prefix + prompt - input_ids = self.tokenizer(input_text, return_tensors="pt").input_ids.to(devices.device) - self.model = self.model.to(devices.device) - kwargs = { - 'max_length': int(max_length), - 'num_return_sequences': int(num_return_sequences), - 'do_sample': True, - 'temperature': float(temperature), - 'repetition_penalty': float(repetition_penalty), - } - try: - outputs = self.model.generate(input_ids, **kwargs) - except Exception as e: - log.error(f'Prompt enhance: error="{e}"') - return [['']] - self.model = self.model.to(devices.cpu) - prompts = self.tokenizer.batch_decode(outputs, skip_special_tokens=True) - prompts = [[p] for p in prompts] - t1 = time.time() - log.info(f'Prompt enhance: temperature={temperature} repetition={repetition_penalty} length={max_length} sequences={num_return_sequences} apply={auto_apply} time={t1-t0:.2f}s') - return prompts - - def select(self, cell: gr.SelectData, _table): - prompt = cell.value if hasattr(cell, 'value') else cell - log.info(f'Prompt enhance: prompt="{prompt}"') - return prompt - - def ui(self, _is_img2img): - with gr.Row(): - self.button = gr.Button(value='Enhance prompt') - self.auto_apply = gr.Checkbox(label='Auto apply', value=False) - with gr.Row(): - self.max_length = gr.Slider(label='Length', minimum=64, maximum=512, step=1, value=128) - self.temperature = gr.Slider(label='Temperature', minimum=0.1, maximum=2.0, step=0.05, value=0.7) - self.repetition_penalty = gr.Slider(label='Penalty', minimum=0.1, maximum=2.0, step=0.05, value=1.2) - with gr.Row(): - self.table = gr.DataFrame(self.prompts, label='', show_label=False, interactive=False, wrap=True, datatype="str", col_count=1, headers=['Prompts']) - - if self.prompt is not None: - self.button.click(fn=self.enhance, inputs=[self.prompt, self.auto_apply, self.temperature, self.repetition_penalty, self.max_length], outputs=[self.table]) - self.table.select(fn=self.select, inputs=[self.table], outputs=[self.prompt]) - return [self.auto_apply, self.temperature, self.repetition_penalty, self.max_length] - - def run(self, p: processing.StableDiffusionProcessing, auto_apply, temperature, repetition_penalty, max_length): # pylint: disable=arguments-differ - if auto_apply: - p.prompt = shared.prompt_styles.apply_styles_to_prompt(p.prompt, p.styles) - p.negative_prompt = shared.prompt_styles.apply_negative_styles_to_prompt(p.negative_prompt, p.styles) - shared.prompt_styles.apply_styles_to_extra(p) - p.styles = [] - log.debug(f'Prompt enhance: source="{p.prompt}"') - prompts = self.enhance(p.prompt, auto_apply, temperature, repetition_penalty, max_length) - p.prompt = random.choice(prompts)[0] - log.debug(f'Prompt enhance: prompt="{p.prompt}"') - - def after_component(self, component, **kwargs): # searching for actual ui prompt components - if getattr(component, 'elem_id', '') in ['txt2img_prompt', 'img2img_prompt', 'control_prompt', 'video_prompt']: - self.prompt = component - self.prompt.use_original = True diff --git a/scripts/flux_tools.py b/scripts/flux_tools.py index dc59954b2..6b4401670 100644 --- a/scripts/flux_tools.py +++ b/scripts/flux_tools.py @@ -15,7 +15,7 @@ processor_depth = None title = 'Flux Tools' -class Script(scripts_manager.Script): +class FluxToolsScript(scripts_manager.Script): def title(self): return f'{title}' diff --git a/scripts/freescale_ext.py b/scripts/freescale_ext.py index 74e3e9df0..4068620ef 100644 --- a/scripts/freescale_ext.py +++ b/scripts/freescale_ext.py @@ -6,7 +6,7 @@ from modules.logger import log registered = False -class Script(scripts_manager.Script): +class FreeScaleScript(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/hdr.py b/scripts/hdr.py index fb330d0a2..651527449 100644 --- a/scripts/hdr.py +++ b/scripts/hdr.py @@ -9,7 +9,7 @@ from modules.processing import get_processed from modules.shared import opts, state -class Script(scripts_manager.Script): +class HDRScript(scripts_manager.Script): def title(self): return "HDR: High Dynamic Range" diff --git a/scripts/i2i_folder.py b/scripts/i2i_folder.py index 905c8530f..e616915b0 100644 --- a/scripts/i2i_folder.py +++ b/scripts/i2i_folder.py @@ -7,7 +7,7 @@ from modules.logger import log from modules.files_cache import list_files -class Script(scripts_manager.Script): +class I2IFolderScript(scripts_manager.Script): def title(self): return "CeeTeeDees I2I folder batch inference" diff --git a/scripts/image2video.py b/scripts/image2video.py index 1ef7a1c3f..2ec56cacf 100644 --- a/scripts/image2video.py +++ b/scripts/image2video.py @@ -12,7 +12,7 @@ MODELS = [ ] -class Script(scripts_manager.Script): +class VGenI2VScript(scripts_manager.Script): def title(self): return 'Video: VGen Image-to-Video' diff --git a/scripts/infiniteyou_ext.py b/scripts/infiniteyou_ext.py index af844f1da..733141c5d 100644 --- a/scripts/infiniteyou_ext.py +++ b/scripts/infiniteyou_ext.py @@ -30,7 +30,7 @@ def load_infiniteyou(model: str): sd_models.set_diffuser_options(shared.sd_model) -class Script(scripts_manager.Script): +class InfiniteYouScript(scripts_manager.Script): def title(self): return f'{prefix}: Flexible Photo Recrafting' diff --git a/scripts/init_latents.py b/scripts/init_latents.py index a54ae95bb..9925eb070 100644 --- a/scripts/init_latents.py +++ b/scripts/init_latents.py @@ -2,7 +2,7 @@ from modules.logger import log from modules import scripts_manager, processing, shared, devices -class Script(scripts_manager.Script): +class InitLatentsScript(scripts_manager.Script): standalone = False def title(self): diff --git a/scripts/instantir_ext.py b/scripts/instantir_ext.py index e4ee6e8cb..01b9befe5 100644 --- a/scripts/instantir_ext.py +++ b/scripts/instantir_ext.py @@ -6,7 +6,7 @@ from modules import scripts_manager, processing, shared, sd_models, devices, ipa from modules.logger import log -class Script(scripts_manager.Script): +class InstantIRScript(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/ipadapter.py b/scripts/ipadapter.py index d7bae8bad..0bb866dad 100644 --- a/scripts/ipadapter.py +++ b/scripts/ipadapter.py @@ -8,7 +8,7 @@ from modules.logger import log MAX_ADAPTERS = 4 -class Script(scripts_manager.Script): +class IPAdapterScript(scripts_manager.Script): standalone = True def title(self): diff --git a/scripts/ipinstruct.py b/scripts/ipinstruct.py index b789f8756..b6ce43c96 100644 --- a/scripts/ipinstruct.py +++ b/scripts/ipinstruct.py @@ -17,7 +17,7 @@ encoder = "laion/CLIP-ViT-H-14-laion2B-s32B-b79K" folder = os.path.join('repositories', 'ip_instruct') -class Script(scripts_manager.Script): +class IPInstructScript(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/kohya_hires_fix.py b/scripts/kohya_hires_fix.py index 0eced514e..69336d63c 100644 --- a/scripts/kohya_hires_fix.py +++ b/scripts/kohya_hires_fix.py @@ -4,7 +4,7 @@ from modules import scripts_manager, processing, shared, sd_models, devices from modules.logger import log -class Script(scripts_manager.Script): +class KohyaHiResFixScript(scripts_manager.Script): def title(self): return 'Kohya HiRes Fix' diff --git a/scripts/layerdiffuse_ext.py b/scripts/layerdiffuse_ext.py index 3c2ec43d6..37d26f7fb 100644 --- a/scripts/layerdiffuse_ext.py +++ b/scripts/layerdiffuse_ext.py @@ -3,7 +3,7 @@ from modules import shared, scripts_manager, sd_models from modules.logger import log -class Script(scripts_manager.Script): +class LayerDiffuseScript(scripts_manager.Script): def title(self): return 'LayerDiffuse: Transparent Image' diff --git a/scripts/lbm_ext.py b/scripts/lbm_ext.py index bd0142e86..02d0675a7 100644 --- a/scripts/lbm_ext.py +++ b/scripts/lbm_ext.py @@ -30,7 +30,7 @@ ASPECT_RATIOS = { } -class Script(scripts_manager.Script): +class LBMScript(scripts_manager.Script): def title(self): return 'LBM: Latent Bridge Matching' diff --git a/scripts/ledits.py b/scripts/ledits.py index b77a1110f..2ebe428e8 100644 --- a/scripts/ledits.py +++ b/scripts/ledits.py @@ -4,7 +4,7 @@ from modules import scripts_manager, processing, shared, devices, sd_models from modules.logger import log -class Script(scripts_manager.Script): +class LEditsScript(scripts_manager.Script): def title(self): return 'LEdits: Limitless Image Editing' diff --git a/scripts/loopback.py b/scripts/loopback.py index e24683ce6..31c2af7a8 100644 --- a/scripts/loopback.py +++ b/scripts/loopback.py @@ -7,7 +7,7 @@ from modules.processing import Processed from modules.shared import opts, state, log -class Script(scripts_manager.Script): +class LoopbackScript(scripts_manager.Script): def title(self): return "Loopback" diff --git a/scripts/mixture_of_diffusers.py b/scripts/mixture_of_diffusers.py index 7021c8ef8..601133590 100644 --- a/scripts/mixture_of_diffusers.py +++ b/scripts/mixture_of_diffusers.py @@ -8,7 +8,7 @@ max_xtiles = 4 max_ytiles = 4 -class Script(scripts_manager.Script): +class MoDScript(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/mixture_tiling.py b/scripts/mixture_tiling.py index 5b95e694b..fcf7b7cf1 100644 --- a/scripts/mixture_tiling.py +++ b/scripts/mixture_tiling.py @@ -25,7 +25,7 @@ def check_dependencies(): return False -class Script(scripts_manager.Script): +class MixtureTilingScript(scripts_manager.Script): def title(self): return 'Mixture Tiling: Scene Composition' diff --git a/scripts/mulan.py b/scripts/mulan.py index 652233cfc..b8e8a8c68 100644 --- a/scripts/mulan.py +++ b/scripts/mulan.py @@ -45,7 +45,7 @@ tokenizer = None text_encoder_path = None -class Script(scripts_manager.Script): +class MuLanScript(scripts_manager.Script): def title(self): return 'MuLan: Multi Language Prompts' diff --git a/scripts/outpainting_mk_2.py b/scripts/outpainting_mk_2.py index b9288fc22..6a08247a2 100644 --- a/scripts/outpainting_mk_2.py +++ b/scripts/outpainting_mk_2.py @@ -99,7 +99,7 @@ def get_matched_noise(_np_src_image, np_mask_rgb, noise_q=1, color_variation=0.0 return np.clip(matched_noise, 0., 1.) -class Script(scripts_manager.Script): +class OutpaintingScript(scripts_manager.Script): def title(self): return "Outpainting" diff --git a/scripts/pixelsmith_ext.py b/scripts/pixelsmith_ext.py index d88d340c5..bc73d1e4b 100644 --- a/scripts/pixelsmith_ext.py +++ b/scripts/pixelsmith_ext.py @@ -4,7 +4,7 @@ from modules import scripts_manager, processing, shared, sd_models, devices, ima from modules.logger import log -class Script(scripts_manager.Script): +class PixelSmithScript(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/poor_mans_outpainting.py b/scripts/poor_mans_outpainting.py index 7f2d68c85..968684a8f 100644 --- a/scripts/poor_mans_outpainting.py +++ b/scripts/poor_mans_outpainting.py @@ -7,7 +7,7 @@ from modules.shared import opts, state, log from modules.image.grid import split_grid -class Script(scripts_manager.Script): +class OutpaintingAltScript(scripts_manager.Script): def title(self): return "Outpainting alternative" diff --git a/scripts/prompt_enhance.py b/scripts/prompt_enhance.py index b702eb3b7..b0d46bac8 100644 --- a/scripts/prompt_enhance.py +++ b/scripts/prompt_enhance.py @@ -300,7 +300,7 @@ class Options: return get_model_display_name(Options.default) -class Script(scripts_manager.Script): +class PromptEnhanceScript(scripts_manager.Script): prompt: gr.Textbox = None image: gr.Image = None model: str = None diff --git a/scripts/prompt_matrix.py b/scripts/prompt_matrix.py index 1fbf95768..2b758b0d3 100644 --- a/scripts/prompt_matrix.py +++ b/scripts/prompt_matrix.py @@ -6,7 +6,7 @@ from modules.shared import opts, log import modules.sd_samplers -class Script(scripts_manager.Script): +class PromptMatrixScript(scripts_manager.Script): def title(self): return "Prompt matrix" diff --git a/scripts/prompts_from_file.py b/scripts/prompts_from_file.py index fae363131..0ec86998a 100644 --- a/scripts/prompts_from_file.py +++ b/scripts/prompts_from_file.py @@ -93,7 +93,7 @@ def load_prompt_file(file): return None, "\n".join(lines), gr.update(lines=7) -class Script(scripts_manager.Script): +class PromptsFromFileScript(scripts_manager.Script): def title(self): return "Prompts from file" diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index bce6c6f50..638e859dc 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -14,7 +14,7 @@ registered = False uploaded_images = [] -class Script(scripts_manager.Script): +class PulIDScript(scripts_manager.Script): def __init__(self): self.pulid = None self.cache = None diff --git a/scripts/regional_prompting.py b/scripts/regional_prompting.py index 9e0641aef..c0762c5a7 100644 --- a/scripts/regional_prompting.py +++ b/scripts/regional_prompting.py @@ -22,7 +22,7 @@ def hijack_register_modules(self, **kwargs): setattr(self, name, module) -class Script(scripts_manager.Script): +class RegionalPromptingScript(scripts_manager.Script): def title(self): return 'Regional prompting' diff --git a/scripts/resadapter.py b/scripts/resadapter.py index e3da7922c..2ffebf02c 100644 --- a/scripts/resadapter.py +++ b/scripts/resadapter.py @@ -18,7 +18,7 @@ models = { 'SDXL v1 interpolation': 'resadapter_v1_sdxl_interpolation', } -class Script(scripts_manager.Script): +class ResAdapterScript(scripts_manager.Script): def title(self): return 'ResAdapter: Domain Consistent Resolution' diff --git a/scripts/rocm_ext.py b/scripts/rocm_ext.py index 6563387ce..4d89f7e42 100644 --- a/scripts/rocm_ext.py +++ b/scripts/rocm_ext.py @@ -6,7 +6,7 @@ from modules import scripts_manager, shared # pylint: disable=protected-access -class Script(scripts_manager.Script): +class ROCmScript(scripts_manager.Script): def title(self): return "ROCm: Advanced Config" diff --git a/scripts/sd_upscale.py b/scripts/sd_upscale.py index 14f565f87..e6f614d41 100644 --- a/scripts/sd_upscale.py +++ b/scripts/sd_upscale.py @@ -8,7 +8,7 @@ from modules.image.util import flatten from modules.image.grid import split_grid -class Script(scripts_manager.Script): +class SDUpscaleScript(scripts_manager.Script): def title(self): return "SD Upscale" diff --git a/scripts/skip_layer_guidance.py b/scripts/skip_layer_guidance.py index f457894a2..b50608d88 100644 --- a/scripts/skip_layer_guidance.py +++ b/scripts/skip_layer_guidance.py @@ -7,7 +7,7 @@ from modules.logger import log registered = False -class Script(scripts_manager.Script): +class SLGScript(scripts_manager.Script): def __init__(self): super().__init__() self.register() diff --git a/scripts/softfill.py b/scripts/softfill.py index 6eb8c0fe2..ba5a9bc81 100644 --- a/scripts/softfill.py +++ b/scripts/softfill.py @@ -1608,7 +1608,7 @@ from modules import shared, scripts_manager, processing, sd_models from modules.logger import log -class Script(scripts_manager.Script): +class SoftFillScript(scripts_manager.Script): orig_pipeline = None def title(self): diff --git a/scripts/stablevideodiffusion.py b/scripts/stablevideodiffusion.py index 6ea267256..5da5b50b1 100644 --- a/scripts/stablevideodiffusion.py +++ b/scripts/stablevideodiffusion.py @@ -15,7 +15,7 @@ models = { "SVD XT 1.1": "stabilityai/stable-video-diffusion-img2vid-xt-1-1", } -class Script(scripts_manager.Script): +class SVDScript(scripts_manager.Script): def title(self): return 'Video: Stable Video Diffusion' diff --git a/scripts/style_aligned_ext.py b/scripts/style_aligned_ext.py index 8b130e068..6236dac9e 100644 --- a/scripts/style_aligned_ext.py +++ b/scripts/style_aligned_ext.py @@ -12,7 +12,7 @@ supported_model_list = ['sdxl'] orig_prompt_attention = None -class Script(scripts_manager.Script): +class StyleAlignedScript(scripts_manager.Script): def title(self): return 'Style Aligned Image Generation' diff --git a/scripts/t_gate.py b/scripts/t_gate.py index 7ce281709..82567df67 100644 --- a/scripts/t_gate.py +++ b/scripts/t_gate.py @@ -4,7 +4,7 @@ from modules.logger import log from installer import install -class Script(scripts_manager.Script): +class TGateScript(scripts_manager.Script): def title(self): return 'T-Gate: Accelerate via Gating Attention' diff --git a/scripts/text2video.py b/scripts/text2video.py index 7c8068c03..42543bfd5 100644 --- a/scripts/text2video.py +++ b/scripts/text2video.py @@ -22,7 +22,7 @@ MODELS = [ ] -class Script(scripts_manager.Script): +class ModelScopeScript(scripts_manager.Script): def title(self): return 'Video: ModelScope' diff --git a/scripts/tiling.py b/scripts/tiling.py index ed77b6272..57d50c8a9 100644 --- a/scripts/tiling.py +++ b/scripts/tiling.py @@ -22,7 +22,7 @@ def asymmetricConv2DConvForward(self, input: Tensor, weight: Tensor, bias: Optio return F.conv2d(working, weight, bias, self.stride, _pair(0), self.dilation, self.groups) -class Script(scripts_manager.Script): +class TilingScript(scripts_manager.Script): def __init__(self): super().__init__() self.orig_pipe = None diff --git a/scripts/xyz_grid.py b/scripts/xyz_grid.py index c8681229a..19e41b695 100644 --- a/scripts/xyz_grid.py +++ b/scripts/xyz_grid.py @@ -22,7 +22,7 @@ from modules.logger import log debug = log.trace if os.environ.get('SD_XYZ_DEBUG', None) is not None else lambda *args, **kwargs: None -class Script(scripts_manager.Script): +class XYZGridScript(scripts_manager.Script): current_axis_options = [] def title(self): diff --git a/scripts/xyz_grid_on.py b/scripts/xyz_grid_on.py index 9439f7c00..bac0ad8ea 100644 --- a/scripts/xyz_grid_on.py +++ b/scripts/xyz_grid_on.py @@ -23,7 +23,7 @@ xyz_results_cache = None debug = log.trace if os.environ.get('SD_XYZ_DEBUG', None) is not None else lambda *args, **kwargs: None -class Script(scripts_manager.Script): +class XYZGridScript(scripts_manager.Script): current_axis_options = [] def show(self, is_img2img): From 20dd097235b9afe6a9cd30ec0ce9635a48692e6f Mon Sep 17 00:00:00 2001 From: vladmandic Date: Fri, 27 Mar 2026 14:00:43 +0100 Subject: [PATCH 03/73] update modernui Signed-off-by: vladmandic --- extensions-builtin/sdnext-modernui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index e8374c5b5..488ab401c 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit e8374c5b5e2b97961cf6ca9fa72a90b0dea479aa +Subproject commit 488ab401cfaae83da94821c3f92ba718177dc106 From 716bbd759b09a547242a6d0363bf604c82a7d493 Mon Sep 17 00:00:00 2001 From: Oleksandr Liutyi Date: Fri, 27 Mar 2026 16:47:32 +0000 Subject: [PATCH 04/73] new reference images: Anima Preview 1/2 --- data/reference-community.json | 2 +- ...ness--Anima-Preview-2-sdnext-diffusers.jpg | Bin 0 -> 67115 bytes ...Felicitousness--Anima-sdnext-diffusers.jpg | Bin 66144 -> 65418 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 models/Reference/CalamitousFelicitousness--Anima-Preview-2-sdnext-diffusers.jpg diff --git a/data/reference-community.json b/data/reference-community.json index 927c38c1c..e107d10f1 100644 --- a/data/reference-community.json +++ b/data/reference-community.json @@ -142,7 +142,7 @@ }, "Anima Preview 2": { "path": "CalamitousFelicitousness/Anima-Preview-2-sdnext-diffusers", - "preview": "CalamitousFelicitousness--Anima-sdnext-diffusers.jpg", + "preview": "CalamitousFelicitousness--Anima-Preview-2-sdnext-diffusers.jpg", "desc": "Anima Preview V2 with improved hyperparameters, extended medium-resolution training for more character knowledge, and a regularization dataset for better natural language comprehension. A 2B parameter anime-focused text-to-image model based on modified Cosmos-Predict-2B with Qwen3-0.6B text encoder.", "tags": "community", "date": "2026 March", diff --git a/models/Reference/CalamitousFelicitousness--Anima-Preview-2-sdnext-diffusers.jpg b/models/Reference/CalamitousFelicitousness--Anima-Preview-2-sdnext-diffusers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df17dfb8a0aaad96dfaed609688c7919174aa464 GIT binary patch literal 67115 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
7Z7Mukr zS9qMZb1402i)Lvwk;ib{t`}B@09FOHjlS|hHZYNM0G_d8(92Qf%{Pq9Zb-f0>^nx9 z#W;eQMvy^rdZRSdn+O`+#}*KuwNdLNhv4Plyu70=zeuUfK7=JMJZjIUI)K$y2EylC z2ot3Yp3?6POXDmwQ0b*@PPSTaw0P*)Jd}1m zkoPdtatJbsC~?F1$%hnlC#t_Nbo#~`>9d~Tr(8-d@lI4M{Y&m)x^iJk&XTnp`mbI5 z;x2BtDKWw}-*p(qa%O4e%t_qKq+FnY6r;^X-Fk9}k7iK8MTTXNNjr;jiw(dWUQS%$ zf}ui6j&?>-p6UbYj&_V(&Yxe@gnPp3`cGQ_0O-j(c0WRx>1{Uhr&)cZyu-3HC|he8 zlChHZBc9P&VXB;@uev&?L2Zh2VJ)-@)>Nx#5;f2wE!hfczLO0jHdmT;12C}#O%W94 z2WF`uhvmZL=BceN1chs6l!aZIHDL~wK(F{x~wjx6V$_f zJ=J#kSZ=R8;UOd$8JAbDFXHs{i>HFT5U%5lX-Zxp!c`eeBFlziaoW77WvQTnbTS)R z%&@gu{o7>*`^5%h$oFWfTN35N8%xWD4{s`_;q^+jg4=4ZOPdt>%;;0|Np-%_iGZ`4 zvw5@eBwPSRl$%{7bLtKr*PXb)#u zJ{Qy8#Tag8Wpos|X{t-=?LLoe{dN`c7LtA>D)~}w4U=eq@N*eTU_K<%=IRMb=+#1s zboe@@0ZRN!{{X19YJVka=@;>&d=mIC;PLcWS+K>_G0gD(A;0bq(R68vZ0mDs!!*hy zi)Ghl8~2%zjzLE01oHl&4s%#hx9W*UVwET=z*@-w9$;=f;#}&bXwr^NOs%%kkPDAx z3B9x$50DYENTtWMhSYNiaPpCcXN2UO!?O<*l!Ee8Z#0`+dKi4JS4|C|;gf!42TaWn zEP8c^H=Sl#CC65Vk~Aw>3G}>2@pdU{jUb-IDVTZiLwel+b0m+t8q3{fPfKEDG*V~8 zQW$rNGzSqhv`NjhJCD1SF0igz{bZh-9|IiCTBJQft4&kpN(<8KC{aPWPeKnuEMn7r z&eg@KNf%MM002Hw2*(n6Y7I<*e$@dd%{qP7`9`iI%T9uJT<=ndIigS~j#O8((?|od z$bF@>>H^zwB??K{f-FJwg&A!bkPcC-xzV=ipAX^bY&A+|pDL#o%SA*f7rfa#q~vK0l*)VT&rVIa(vvSWP{`AVWt1hPs@_H( z3w{@iLYYiu9?kM|4mOoI?jdp3)JCBD!jqx$MWUWq)EM7y(5+6IbUH_W*XBZn&pqzd zDOaztAo*Wkz7}E`Z1U-N3zQoZ;D4?VSCMowuM#3bFOq(q*;c7>v450B=T4WX0jRm9 zLezkKAxygSwoi8D!d3 zzg>Uo#UScIPGRudxOX)Ju*yf8Qz6btES1V5z0}r0PCIADmEAlEn);M_gjcchZ=Cc3c3Z_GM@v zoSjGA9M4>(_AVTwxUEzBqSO!m(z7!nv#cm&#J%EC!GDs zjK1)q`W99|Cd8F(c=rems#B%{ z%yHHkzdE#^{h_$}0!GKo$AB0R+aKX!Z}?tI{?Oce{+*ARfX~@mgN3sYUN-RgzAEsW z72!7kDyq}nVUm8U*38nq77~3TV7iM4pKeJ`0W{-Ec`cpF5>gaLky3tQ6rEEQxKkif3zQJi7n?L0o2lZpvbd3aX z$KbBv&(Rz>#Q4r(pdYPIi790$YuHPJay$!*Sp7)tisf!o4pC?7v+f2YWM$l$eZ#UF zLQ0f<05L{WZdald#Nb3!UeXO`!c^6MOz`_#R9dn#h^R@iGT2aU=F;MGZ)FRM{Nl3q zif=XtmQ}tP=Kj>ILW}W*44vX~=CXl(cJP9oUHk_j2RuLrSV&FGY=z7qk$vN${hBBq z?Lnzk)|)DA;LBu>sDZEZlzvgp?4+&G0Js~Dz7g6O281xy4y9A=m2EJR=AT_%<$a{Z zY^PHI^;hs2s#5PoA{s^=qCJf(h@#V5QBs4Bx{#2a$Okd|t?LgI`Sz+(OwBTLH0naq zPmElN6>~$69fp4;({)Y6(I!KPUv-V0A|0 z)j6Y-%RwUNZR1lN_R3uDYc$J#sVa|Tl@sX=lMb7md&U+|y>5Nc4M3M%>SFUn?y=rc zt)sX}`rmXXCv(ih#H@jOT4Bo@G>tsTu>G)I8iws&rp&TZLKds3Kx~n@g{TX(-W!cq zbmxRPb5_Q6dO9UbGR?g)VEgLOBqc>e0jba%buin*P8L+%Vs4DV4Y5d`n~+?~n-bi^ zfB|jIt>qWi25q?vSBIKx1Ry@7B_ojRmH>$!1H@GcGl(M=~3znunGjV}yI8ls!MVhV1 z%c5D4F_C9GM%GYJwxH>5z7fg%TJ|)=6p1N{jt_OJy)`YZPGRAhGc6?QQ7p1@xRl(K zp;k~G&`)$nZG^#7GfYUfT$p*b8~mpf51ILew^rKJ|bxl{oiph#Aua$y!e#AdBfGK{YBlIpOr(QD>?HW4wz zSfZHaEx^@XlsM;iJ3zXyIoTlZZe}Xkr&vp*ODS$O$xgNquaG7z3nt2;Gr=cFpj3`_ zsXtU^)329MRvhfUsz}<MPWmy|8#%&>c;?Qa-OF)*o@ zO4n=cU?M@g?yHyjCDUQ5)W|Y4<1a8lDrJ@CLaa3@8-w645UgiSed$!X8z4)l_O~Du zgJH4p8l){DC|D^e)Fnd1UIStV&~}Ox ztDViKyb(iIB*k>PP)SlIW)d8?Bn?!5k_>j55F0>BMpS`d2O%8o?AM3A>bp{`IG*IA zL59ivwdzlzNAshi{;XzXy5C-lq3QAIk5TTZzi9f-cWD%aD?k-A;(wZt^`QR%XBwdm zRw;@nLWz_QKI*>Y!~==7Z{Zd>s?4QXnQhN^YTIQ;ckj9Nhu#d#nqD%LB-s-wRJy%I z$Jzu;iib)AU#lly!E|vK8pRKaD5;jJ&d96~mfblIKy@Esi{yMUS#dg@*wrQH5<9QA zkw^2B{YUJIK+)N1$lXJAPgLm2VRtql?5l4M+$fYS@g9z%KC_?b)eeuanTE;~E)UrX zcy%OM$F#ymsV;w`R9g~TNGmhJ4UiG)ud%dMIO4p#HN=S->IB9;|xIxmJH$PmaPoVWG%9VdPvmT{#jw9pe4vrZ1rr^z4rpc3-tTil! z_y>a0pG?XgR*u{oK_oXsD8vW^6~VuSp|0157z@I(_x+hs<^;^HV06|!N&G8~cAPZ8 z+(5o&1K}< zHh%jDX;VbJk*$3Qj8KW!i6{fLQ}Q@R&F5Se!ok} zf7%<5pfv1!%zXZE`9JtV!l(ZLwj{sp4ad+DeiP(OR!$)|J?HPjb?A);pHBl3F239^6<*wt2SL+}n^`P-Sntg~8x6BCcy?FL{;p%u- z!8{v<@??5Kn$VaQ-Sv*q)BLq6Do?^4#J}Jtv()`Dhr2oaNb+f|fNZYD#mC6-$eh2g z9X>Qo_Kz)p2~QFK0EL`mYYedNc`P$e?ADO0r`}!x$2~$jA@hJRYI3mcn?ZVKgP!-C zCq;LB@+>dr+F}#!4nOdJoAPHFKj#RRaOGj#0ftxkRJl|BMG+a}^IfM7W`8zem47N~w6aQeFj1B{_S!aqT)}BlUKru?h;gMRNT)Mhuyxy>ipzvL@X_TC`)f_Lc}-0a2fmAZ2Nh|qn49C&#@ z?iisB6K3X{Q%9y@-cQ^|tW;Nft7+Df^J+rU6omp5ld%VJ9B+)MYQwmarA$yDOT46_ z{L#8k$cXH-v~&Lev_2jZ^|=bN5!{<-vf&?=jj!gD_C=T-POnu@Ha&6J?5HY(YVABA zsX1eCOg&7>CBw8UqEXD;<89lxJIYZT0UCxt0_S`Z=TJ_v6ms1aX({i!Wf2c}T8s2t zs+6&395=T?$U^y9bdm+Th~?H7Y$G+&6JynHM+;d;(I}z0*<#E(tJn&IVETeTY*@Hl zma#53mOCP@hewl=j4SU3D;8JS)afs6+0Vh@2cDZQ^ut5Cd%gQS&#L%*q;(S7!J0O=5 z(SBjoc5F0|d&>0X743SRGSfn%h-Q>$AJv%_$jk?c*$Ev7-xfo)$$5GrDvwzW7Lx6O z2U0XhJk9iqa(z%=wUU%!({GZVrC~p8X6rpjo83qN(v!b!_K!b^T<ai_t`@&smB&_r3g*bPe2ByG~<-slDWz8z-fC^ z9zo|AQaVF~?GB+#Z7xm7%*vr(3f^T%2h@m06Bhxsnp#H0Bvk>DMrC}G%GL5oi?4|d z`>qG!+@{@~IXZbV(27>LlA0|*jm*1%dZdrr7ykeh+3c(MLPsdcElzQE^2ndr6sL7a z-(V|a3AYo+sS2chuF<8Zd!&eBlzCFK4LqIDpluS0tfHxti*HpSTBM$07|giLPb=vK zV}Ty@DOf|jp=DX&H&K1mT%eE=M?fJhy2GT*fR~q*T5p}y6(63EqYdHJ;u`#gIVZg` z@>@3KoA-~Pyhu0zqv4Y3?z%sMcz@^)AIN7$N9Qj#<^KRX;r?h$PS%X*ASk4fY{PNm z0heL9W?N~rgf`kjQjxF#SO{ar7~Y$LC1vI+J+VXX7SI?*Wn2rLE;NjTZ*{JfphUnA z0YwqOJU*M=YNE19B$tz^KdTN@z7Nrce_?`-WAsbr1Tu z{**0}<31mqzh;@yZ^~p3+Y@(*-35XR^3tCOi}4Ph@0fYV0J`Ot9S6f>_8+nxs8!i) zK_l;Snfolo7I0XCJRw}{vS%fpVPfcY1qaBBK$Wgl4y4*2Fe5_uvWBG;}W*Ahv zt7$^ZLW&LggJ^lcME?K^fms8CSc z8^yoFEJ73&O?6r*cB~Wpyx%lpR-a9y>_S#bXV{yO8&3Q$ajXH-8KYb11!Nxums zx?kb$63#$EDvqe%{{Tl+dB5(jOcEMp$3Hm_NQ&W;O>JM1j-$+Jl+7h!a5|IWt*is0zR=w5G3My`GDUlC_ z0vdg#6VlEmESy5+N>`3jra_?V6I4;}NmBBsDj!%1zffEob&6iT#LTTKcp%-Sq$x+A zbl>(x{XV3xA7Qz{WA9X1q+hL%SKQL?wCfTjeow}HF;%!VlTa}Yl)WotoMWh>DO55zW z&KN0^OI*v7PaNo%M{C)W-6|S3EzlA^Mk+9OS0py-PFSv@ge8hZsVS0^`lRl&xjsL2 z{31TuYzgZHy5gNul%iCkZlxY%?+2scPn1aP6b9zdz>JIsNXTSWWYB6<_huBSC3~Zb z_~jfUD$gR5)(os-3OvgX$kYPJ_*U3K%#+u^j0^Ib z7&W?;*rZ&J8*ZmO>kL$-lG;_=Q`btC4%Qudh}*axs?_r`%4Av9vQNK5|A!N zHa6yM1k_MN8%Z?h2$r-3w^3}pvWnUuA5d@ehOgk2 zdkQ+ahMF!UYuiiRcDFldL^f2aQEx*nEYjg#cJ5~iF&rRuVB^%+M7R}+&dBgksuRk*Yu2ILl4Eel@h5p=YTZU&KQ_UQttWOG-)Z_wx0$9tV~>yA@L|KN>T( z;XvxGcCt!qa_fyXZ_;%M{jtz|R~fj2A^t9wuS>oCQAM{dCTf&cHxE^0Tlvhl`=avV zVuPGPcl=#Fl=)r7m^|mr@cOFVJ-^fV{S->6O>UyWLaY=Ab#~PzAoDWImVIovEVLUK zu-rGlj3RPPm)r|mC|btKDY+0Bq|vcgXMjjS9H?vA*3$@aBnHw#Nfx*!@nmoggeNgf z%|%JNB$%>E{I%#mnicbg8l6AhrOGZ6LAWGyiO&jgH4_F-YC8~)*rIBsg_c2*glOMLG{#i z1t*+Nj-ou};6JpLCxKYm%3Vb+w}fX}$nckJxTYOX!1ht8zNt3W);iicQ~jQN90OYX z;Pa)-e?}l$dj)S$8xpHu!fg7P;r0lq7mIs$VXxO zaQj7IZZ+XNF(HL2FV9R!)Et<7FG;w_N()6Gg0L^CvEla&>oT}wh}c%KI<+??PpeAJzO|XrA(joAX9=!rDGM%YfY6&{uVF%Na60E@TAxJ0Ul_tQe(IMzx|}JCmrzC z5s|_5DT(=tZ2RxbhveO0B?@aOAgl}P(m0XCkgcL|0vozgkX}en7!2gcIB8ufvS<9d zBj^=7A2|8(!*i|D@f9X@+xAk^tUlpLxypx9qhaI>dg$Nb7vOt|{{Y4*^!}A1XZjF1 zfh1Ba4geb}ll(0A_dXbZ&eVU+Vm$04OA&F<$722v4`|#E$ENT)Fl|ZthtX=BRM%}L z;~6_Z&_%O>d*oK#BaciLAxr?E%5CI@>@Tnv6+gOXv!xN4m&>(WJflUL%&Vw|z$~cw zw4{2Z$4HZ;c@OL#?I}n0e#X`Iaa7y#xL&g+lH-iBr;Af9EAeW`kWQ&m(nueZ9kn_5 zM))AatIjisC+1y36r?hmOvo-M3xwRF!uwq5tW|tuIM7!kk)@)_;_t$N#1-S7Jj-F( zImHP~DI%G2gf8uwr>yIwj-fr0d@N$R_9(ovpf$%YGHk(S5o?J;@>|sy*SEPUFZ2th5A-9Q4`^E;VqpL&w zompFQtss;zwItaiP(ZOBFdR|Dnhk1!JtZkHtGY@I;rRDEE?Im2aDu4H5f8durcIm_BcukU!8 zn@&ounMq>ehvztda!1ZAkM8$_i2ne0On=oJ{n5|(;P3gC&B=RvVd)@Eti&4ic4u3l%s17W-YnPEsQGJ z_IIhNx%$01N4Vo?m__=elm$QbmotxAcp2@jDNs zYc}Se;#K>jHbNZh3!sD+Ff^*aj&yHw#S+u$7DVedQT+61e!`!WLuumUNVE8*T%}_S zKFe|rt?AYu4j?I|Cg~uB3!ejjNU!PC;=@^={8${hn0vOU7WwQWQ?zXD0$x=v=@~~$ zz(6J<3Nk@dX-k)QCs4E$D00}vlUA#>OGgbVvkrD_DTn3Ope{~nOu!DLmV`uR>Ec<5 zVs&wM&O8q&bj1aUo)&QR`IRj!u~L^qifmm#7T##v#M}sr{LHUtNux}fy@fZ<``$FK z&A%xwRJ8z7-hkv50_SVOy0#RW!<4Y(!>B8Gr!z>`C9k>Xsf7Ok!h<5(+N4UNnuQA~ z+vj;>#Yb;J4DUSj(}l;JTdP*;T8Ssrz`cPzjmhO{Agx+Lm1}dL@DM2(CuUR|Wwkou zzN$sxM8uNiob1-5m5+!d-rg68xbBS6Nf;sp0$MCINggMh1Z@p!RFPnOMK6l5w4Fj) zt0`R;EW1#rrp!9(O_owFY%iwdc*EJ}9(j8+v54_s5opa&s!XC*kn-v)r8zL;EOtv; zQvQkES#p~zLzDr`N1_S?H(xjd2?VtEOOPD3FDCT-${Ck!PB^WSKemwO?gpzi%H1tC za*O3lfT+QgJWMF-3DdDjInvTnRI|{YzjsJ9=-w#y@aN{9hYBVt|RB1y+f>cS?tag9| z8$*-w``keRn;oEm$RtuFq#N%GPzVqP8t+21wbmGwAQ94vT8)a7parZr-O@`%*=L`#52Xf%?EXBRBu(|oDi!*bmXf}&!5DJ0lnqaaIpN6@M7D(8YgOzLk<613Y1Wh5qLM6Wj$6XCN2VQHXnB3cO4XDF9%T4$@{V%E z6=ca#T$o63rNDAHP@&qMWL$Txdy+cEEvrkr&}T5}@jVqn5B<3y;5Ol`kaNK{ijP?~k~Ec(>5e(PsQ zYMPUuZA2A7n?jrfBp@W}Nw)X>kmn?X8MUoPDjH4iZf9@X z4OM$0YE=Qi=y6MMosNRT?J+6=4(%aGnNU9g*4NH8fhC#6jTutEMQJ~_4{d;Lbb?QW zDNMKnL=TiLDOzQjl9(iwOFR$gUK^Ckmhu`)ZYkBMB`63tQ9Oo`EE3tt0ZIgGYv~C< zQNi?YRdXrA4 z^bG6S>eK+1E~9ljDu0Ssj$0HTB=w8>O!iAEI}vE}zks-v`~k#DO;`m9RiAg9Nczky zfUlN{9x0DSOL2+0=MT1iCZkI`SS6oz*snE|diy z9iUyR)SF(=T1KbNDcaMewN3YQPQE)rWw@oPES zg!81V0!6GXYr)f(U$gct7XJWqPB`fB33<06UA5l?=kc{M1Z2~gh19twXJ#z?$|YG% zvn_g`KsPX%-~-FIQ}@BFXp8kR0%#~Vl`EX8$x~#Er6$%r)w^!;x{`kH+#)_TH#(RD zX5tJ0^njjKuy$G^6Fk;aak1qJyx^y7K=XtWD~LUjc&kUi6Ed`F?26^zpFM+hnU@l^ zuoP|@QOXpS%C$Etv9Zuaxq>*=h%s*(s%6Ubgr)|UVrWZBy3=i?)uTp=ol(tm@e&QW zS~(jAu454;nfBXh$q5yku#lBa%`9vU?2t7az|)*gD)JKMmRK@rXwF%;6L1jK_bOHF z0KYByMrn|+mXBNg(2SQ>x=-19cBfTq8qHMb&(haastU_5xUgB8L+Pj+;cQVcz#2kIZuG~v~bH2Os26)o_2n} zG{l<^Nz9>A$x_#3pdgS`yON@!Gys8aeOlvcZGGXdUa)wi553e5;1H6$as{iPCL@zo zhvtw_EZP(-LU%r}^;nz?va}}UY8gobME?L>M$2)h6Lzw)GNd5sX-}LfXgS5~FU&UF z>%S&Kf7glCX<-oBMZqsmQs0qv^;;`ybpx|1Jb_X& z`KS(Yc23CQDf*Pu^6?l6nQ*(=HUR*eUt3?40#~)KAe!M`#9=VBv|lP5;>wkn>P!Jf z!tpcuKLprbxasl-`Vpf~z~@6;d**+k0`VE@t@v;BP?b5|Jz*=0E4|`=DOe2O{knNy ztbd^eDwlvk*0C|@Rs9HB+3KU=JoZq@2_>oIIG_@MZ*?199!5nrq^(J@7TiP1Y5YA0 z{q&eVtNx4_B{+JG>JNIA{{Ti9y|;Rl+Z%wYQ0Jx5ax)~JpxzNVEDE$DC&X~+BHsM> z@|^w9S!0K5{{V#EN9(WpF(E5GR17aYlo^SB{{W0QH&1ojWI;Fav`I{d4+;MOe_v1i zA^wDIGCV#`qY%u0?a2QCRu_oRRKh2Y$-YLNGcG~;JUQa0HT}@=(x!kP?P2rn1OXr1 z`IG+uj1QkVm44_rPjLOe_;u56vkU#uGWMS6?PGx91<8rgsgPJt>4O!Oa}QLeu^iOj z(a*Zvz09j%3oUEaO1<>3u=2lHvejSV>H$cux(`tD$@`(P>Zc7#R+U%g?xklcOUu3Q zeeJh|O_DXe)L$E&Rux5xum&Kkx$hG)uFSMFOD+5<^GN3$&y8tQcv^YJ9*{ownAtB7 zGLO-{$=cJo zK$9KM8wKYbVs@i6vWbPb2mDpCr{xj3l&K5KMUO+IdL=W$A7)n^Q;*h|QjVmW^MwBZ zod}Nw{glbN>auqx_f>h&f6t3!DkVtbO1$!ImmFl}AZAe{_-rA9eA=|=O7vl*x2IF7 zk4p~)J(WXw1!7IHup+$XpEbmKW7(70P1l@wV>L3T6`5Hv05?9M!u!--seRH>*?IXd zFaf%j2ZTIG&r7ITOG;0Pj^JOj2ePuxoIsjv_*a|#t;W&pv+TQ=5yUygTbI*}pZ(lF z-eUDp`>dXeiWIh%4p$Oy;}P}Q6{i6r$(M6qJAU}@cfFW>me6jlBF(mZE6jiJ;k^4R z`!0!vJN?vZ0I4Mw`e}oq@$8|#@fWI)#gukjZG$Ieq|rSj^O;|mdAHG;!#Yxowin+i z*4{Vk4fy(QN@8wVwXN{;Yg2_%jiJRL5CxTT0L*o@@7=#R?j`#y`z*~e6896`akKSZ zu1j0wTaC(lDSIripc~>U-9R_&#b#WOvACdF7mecUSHq<6ygdugwJuy`_j##@T_g_4 z`9(HW*HB7yg=k42TpRQ;=wqJC-ph}mr8u#Bd`YUc{RnOU0Ac5|+{1*)aV~ug-$v6v zF6F#6MdI^vB50!JMcC3iaMi(vl&SP3DAifeb<*A876gwBrYelIp!*=_N`eBlJ`vb$ zdl>LYvO|1DtB`qznKu6bCkqF%CkRzy-xDfnDcFY?{)9Qni?K{GrS2Ci$#5E8cwOfh zZD*gnB_w^Y?%m__aQsg#?1?HxsgQ8eZgr?)!UMAHoh zRtdfG_d>Ml05F1I*}sM?q;`BqsH~2PVE+K_;zvT^HU*T&eeBb>kJ0e|L1&O~*wLm0Byv9gCs%OYL0p|NC$UXfuFBw=hNu&=&+(fx

s*)XtjmAQiPKlN&Dh+{1?KfYV*IzAJKs)2w{Z{E02F9e?}U|s+Au_ z2Hfca4V4|Dbc`d0f&T!0pC|N3^kG79rW_kp-ado+Fsyp1QS?wY*eM|IZDCMV{;j;C zZZO6k8hs}D^dHfIj4_A6{{Vbn{!jk^EH&9l8FjidH5XzD{4eke-5YBiE zcKwqzguS)uqD@IS`$%)^ECQ5`NxUl(ZAvy$`T`2(|PZ+*^2G#Y$xYQEgOlHAbZSOK}2HohpmAGT5jT>~GAH z4z>|d;fk^;uem1VvRR^7Uv#Jw z)0MW0QlAD(cIt`qHo~JZW(uCfCUX%{Xtf4&r7gC^+7_vY1?);uuVy+8fErr*&$v-a z#<)?ITBs&gT9BkI-*sM9IuxXgsR>4j*St>V=KQTUHHuwkoj4nvVs2j}jl5cSJ%9x( z2QIp53|3TLCQ)z&DViFWGgMre?>x!6GN_Ug*;%@RMTL#6eauV6e9`F*vJk*6cPeLq zDzlg?jTGEjiQIO2Qcc$b2nbEw?i8dnf^xN~_=&xSnw!T{OmV@v+LC5ui!M=~64{Y7 z3r|Vj!R*!tY~1hgn`vm^X>KU9R>w)IO|<*c`Bcjk^4bd8NY^&E7u=g0-@r#r(XnP5 z#b0XICXM ziIzf(YEnTKSCIho1{>z6^Ag~w0P06He&~hpqO#vpdX|hh6k(S2$ z48Acb!n{Y4#r1iaDJgdnhFk4>XBtWAYJk@@nA%7&HTARnuG@!;+w>G#NJ$%}Gju9+{yC;jR}S@C>EDTl!IJ zn-X%|j#tpbMOK(Hm)cE;)kz%uL`jbaVi2W?;A&%!=Bxhz?rDX;^AxAaU($e{8DU~S z-WfmSEBC~-CrHsrA`e5+QPlqc`5(KbndE0CNl_{{ZsUGyec!BV&d5Ol^kgzxx3a zz?0@+MWqeJq39*4{-^U%AMRy^2mVe|PyGOme{(D*fAVgb>nZy$W<+w!u0OZ9e`O2mx#RMCOz?B^a<`&+G{NM5_vBbPC z!*vC-NT=c2QxCqRDd&?el&QALtdxUmg)D+E$thXo6AD)aFl9BM9H7X~xouYbx^ns= z)&u5zVV0MPq$Mj3)v7a$%1FBV^JsnLSQeWCT3ill%tPt`YHx84vwTCFo>3BV$)VHA zbA2aTNlS_yS(G1)aP-ZTb%GZ)gLS10ZY=|np2ft0`L_^QRZelhoqEI z?G##d$z;CME?&y*6Po&3+FsUy>wLR2Vd|`CY&*Q!^i^&=ugYSI>(e4eT25H6K6Ygg z*J`U;`BDH0=m56dq8U)b?9>4gX=UeaqEL~T`g4o7ihLxf;b{R_Yq7*QeqeTu)#*gM z*-7T0JIVV%>lD1qniPWkvw_yerpHvp=;Lbu4Ox=N_qdlR*U_znc5WdpyplmVe!~h_ zr-5+uY^^raxC#5Ae9=_t%<_wiwX>gy`JR5TkR|C;r{i1c%t5rE>nCeTo}fv)dp49G z%}BH+UL9p4Mj3a_At(1k%TA@l-6sAWBNn0oHie)O!eI9etw-FaC9M-qKs<>;Z3!eY zeJ_5=y%=!WC>G@oPt_Kel#&tvI}x~q5_bAdbf6HF%i7o4>L1q?1_Ik8eU|dLk?^x(dSrnB}!hC&V=cw4aSB0_oyDr9TqeS#f4wOmqcZsW zoPZt@VPmy9(d9ofKlhP0$a+QuTf@>LW6?(6>VGu}{^ZzXZ7VjP(W*_4{p?`jJ{`4! zDoOns#Mu7;-o)E2ykl8mZRn;QC;X4*p<{(K1nu;%{{WoL{{Zn~z~P?*Fn%JHokZ}h zDdtv^l_L;NqUj@`caa}#6(ug)@1#1Q+g#L5y&>vX5hoAKhbc{^4}osgLgL*m&(;Ls zI00FTM>WCDaj$xiE7^krtZV!r{{Z`ncmDv12$$@ifr%wEc&V?@#It|3aVo(4MRLDA z?i1}c+`^Jn+pXx8TT%$+)*q(pZq7?Bx@rpEbg2!j=mowd-=?C`ShlvMvdLQZ>SHx8T?YW5&Ub8Vi}c-{z$py&Kla_4Hw;%_?pChfd2ppy6nJ7@C2(<M*Rv;Zg+9wU8CHcX& zh9nLGaj1>T*80ZzMn;rk3RH%LY#>DG5zHlx>3G6swJ%R`W@3*zxe3NyPE{eq>_Fy~ z4MFE)(jKZc8Cpby#PsXIiAi)99d$sEl#R}s#B~bQ*(%nWim$<4hk+YQWE0uoMl3T{5OiPLZhG1I=$ zoNh)aqSTnA$);k6&Q(10+MLSZN>y;CtUEBPk(eDugkIL-9CL_fszy#<-kF)DHlEf+ zErgQN6}k!dv^N%4OY?za4;E76#~;t<$pU#afEtuiDzsB5rzg=elQRF^ZhL<_~&tGX>O3iABtIOdQGYS+x^jG&j%#v{Ps;x|FRqAZ(l1A2@o$ zbJWRczxLKe6DV;=1>Vs~EdZcRhQ#=ozUW2YKE<9LVv?}@wiLvO4^GTTPsLZb%m2eIg-UeqMIB zJmi~cOtEoFXf}eIqW1)goo%`Ggd)lutrmR1#u7_=Pg?u-dsbCCAdfPQ7Dbx8B)3nDz+fstTLL3BNy`Z{vwe-~5 zgOsREQ?vW5!r0D*AwefX4u}5z$0(97h?CPeQdWsMF!aL=%m?!JXzqmDC`!q{sZj>jpI$SJ(LP$0@1MV>$q47#v z3S)ViJcVtleEUEZc8G0l>`!7!wL9i1xVDb!%Ju_AxdpTDM5KwR06a%07Z@xLaanyW$6~A;l9fPOld=r`9Yxyw$_a;7dydt zQKcN6r@1Pktb{V95QW=A%#Sg6Oc8D3Q}mm%5|c9TGTh{ogcUID#gFAAjZ%DJnZ_mG zRppkXU;GpH1b78(e#o#KvgD6Twn*jNRI8!H1gMSD;sTOKLJo!xo-(h5I>Tj$6@Jly za)go1B%9duJ9UE8(McfaM&R;;Wms`ewzk_^$WS97z4h`i_vnNNWRETRh;+laZfg?M zktr&hePw=!%K>tK9he}ZuA-Wi~{g)qpd zKIV01UBFJs1dZ*kgRBkGQ1+{E<9Lsw!dFMYl&VCqXiK7DR_{3K0V?q@*<0a-GNSAA z0%dY;I5e_Tkv^Jz@hGR6>$qnNUzmnR%#vXRW{ovlmnd+{G)AcI6)8Whf7um--D_RY z#9LZbR@V+@zLIr^pKGyfX6@NfQdXXz-%nVNad=X2&KQ-a(%UmtYOKhU4z}S^+iJy5 zsW#Iw7D7)Vuz5w3P{P$Zbh^@nhu9}FgBsk9qj=-i0jV#)8 zbyqmmL7=L0kFiO1r!?|`vx*i`>a`UWEA^Cogb|1EX<|);Fk1~N0ZMco$r^w>B3(?Q zGfhbeQkJ8sD%;R)8ZCvRcWzM3&pS6@lW_IQ{ULLc6`3?Nh2%`TEPzXC7ru$m4Ybt9 zDe+RRfM#)}UXeE4T0!|~mk?*=91{$O3AqKO1ggNB8*8DCw#AseoE3ws6}NR1`BlD< zqoS4tke^i)k6815c4hjEMbMYNk6hA^Zm+H(f$l0;RPass;nrjk?MbrynoUhqWka$S8*huaGf-I56wBa|SUQ_EgOp($&$79(;X zt~AwMgHwXknrt0cRomnM{e~13r8n;Z1xvG@S-X-6x{s+R_Q1W<^S;P->;O#TZY69? zr6$P*N5Da;b$gHpgaHipe+bv@jo6Lv601?Lg8Dt>r8cElC}=>~@-T%cT=O34wI!+9 zWoBtgHcq>wpUG9O4|xv4bh}2IrhsMFt8}bv~_ZJbI4^gPVJVRy+-g z$^+6fZz-AdDXFBJ6gl0upYPfvlXN*(A_|y*(&&+(G+WOhaK0fU$zP|@ePNe4wYt$NrOinjMsfMH^ z)vDy>oNqWy?W#)i+k07FQP%P+46K!BNZRQU=Klb(9~0Wcd~K7HQ|bCU6Eta#8|WUf zT)F;QR*(8v^q#;ctYGE0!;senYh#^kv&xTSSyUIL=9@|ea8R`%SS*b}BdxSPQ5muF ziEbx!d!iXBS9xJz+q-f90DMM6V2}v_UvtU?!((&_m^JKx$Vzh+qqH{AUc=S^P<%jz ztL$1qLrKn~yQ>!dNag3hlogXr;#X)|X(cGrNLf#yPgQ^1vg&tR0u8U_3TV`4Yn3LX z+4$FW6McXeF?P|Y^7MH&nQ643r63YF`NA%xVkiu!*r0evhI6u$O-|0td!mvE47Ft_ zf(Rg;hK45<38{QJNK%qeklHe|+KbNIv}{J!2ChisX*YXW`3DrFmx}u} zEombnk`xI@D)?_>ZgF<;M~_%fik{9>^K82>P^e3$RqC}RiPcHXNh>hSv?W$9r7IRG z2UMNG5Ei&Q9-GM9^WhDr&TqQs?knONt}CHpQA(crF>5b5P?K~a&fPZ!NlT$1075|- zK)-YwS~;S1x_T+nWvPX`I^Zrp_@WSt{Xl-QhdnLcwOOsfcs)j=d=_ETRi+6{!N+f}#qw^bx0v35Zv@Wk}%XT9ZjJ zNudJGVo~SN<2l=QU1~!0Ivqu<2QGbiMW2Obus#{1O+Pf-@06*RzLA`kZNb?%pp>b- zz(^*_2fPjRiWM^tELl#tp_C%UME81mctgcE7t|><8R|Pt$-5;v{Aie#ON;$g9Y>@R zNFLxk$NBu>Fmp#`eKkMBiE6``VTwDBJ6Sngn+fbv>Iu#gmkqAkia_q@cGN*Qg8^X< zC9SF2DqpA6M8j#EWdg+#=t&AoZ6pv?WPk{`BolLJ=Qj}hvhBL+oN{9DLRQn34-jQOUO@RyMS(QbR?T-s{_0@-QL4&dB1P#{O#>f)Wfj} zPCAvN$zrM2C?a(joKRgQ<50vJfWjp6?Q8e%HuBCKb`B>g2WlFIY4 z8d&cYSwId~u<*1sw=8ERoLfk3zjkjsrA~lXbyyG%=TV^Zi-3^PsXz}z8hb9x&9=h` z?Ou67v^V)`Cc!?j*8a#G8^cvxQ&pyMFAvb1sWup!r8e~9mg}Uf<{ifiYXIf$9`>U` zE@O}d({z#M3_oDJOZ*k9`_pn#^9ox^V(J-I*j|N6P}thzT{ZQ9PT4e*A3x7(u>p@z z58-pL5!END%s3G_D7O-(N`bmiKq~}kU{nDcgY$_Z?YJ7p8T~U&!xTzWlNo68 zN-Qv>w&J@s5TY~YQUN6Z19M}V+iM+vLBy17UnGgzElyUYD(XXsa#_Hx=_bUD#>ak< zjRfWA&9c+d94vN9pbpz9ItvZVC{qO*?**-}w3Lyd(8h=$pr1s`KH{84M1s9;R0KEV z%e+Y?B>Mn!5Tkt$gcUzcL+L6?Y`%8V{{Ytn4gk`i_?+)Dk>MOCO^~NEQ>@u;J!P>j zp>Pw(<>q|!5iA(4QJ@=QQN<%*22_ufMA0$tO}4(!Isy`ar0ryj03gH?4Z*SM3|4d8 zO4N!rv7i8!RO*k-&8jv^Ln-x|^u|xy|!`lvBqiFUA|(+n9|$ z_21yBa4lAT*Om7v_$HM}Mbau$nVdJZ(9q3qEXq&HIUw(A>m3Kik7rzQMUb4tl{%x? zk-2l3$8#){r0zmaqti&|pLu5e>!SS6?}LC^H&q;U6fCzfyo3nEo9dDjI*1VThT#mN z)ZbC^f{QoW-cYZUU^+syh)9biX(>`}4u%_D?PMIwsX^NC`lMWFNb-W6l}pW(Iduc} zLbTx0XsA!6>MYo{RRmk+K!nr;=985KZtJJ+5G+L|B&lu?LC&By^^H&*T50U52<;q6 zc!b{9??4=U!CGJ%4JY?qLkTKcf>Jq{WpZi9-&2I%T_HsTi)sWbMKRgMhi6rLY|>7G z6IIlvRvPZ5IThK24q9IEH{Bsd0Cgo&j)z!5NFgC0Yvl)8;s%5Sqzj7TGD}aC@0PnuAs^_%ukSoVIb0YN-~JpQA!E{IZ3%4VGyh{w|~yidMYd|Xy6B- z(iMd*B@;Npii7Ryv}jXri9EywECektGPN?HuqNLl%kG7j3Qf|hgVG9G0)a^v2Y6Hp zLB*)*J$>vyU6HHFtKDjnQ%udape%<}+lg4r2Ro#9ljvAz|f;u$35l&Z=# zI@$@jN?b@*Tlid$NbyCsRM{!HDBUFPBhz1CJbC;w_Ii+#bzxJK3CHP<4v4>M*YjMr z>c(Dlen9UqJ`i|(SiM@Z6yNvb#kt4n0Q;#ylFH&W2Ahrq;jb_9&T_@v$qVN)$5l{Mj` zY)YBg_v||~TQTH14>)lc!fiEAcv_StE=RkITQ4tP7)64pGgI`il6x6<98#34YNY9J zv>iNQ@^)6ANkY=ht8)&fz_|F$brWDMw&nut-#uyebb^7upEbw z5T*GU8bXR6wDjQ7O`$|I(dbCkN5g1-tF0JzLoB*b)a=*9w$oq$-!DPa=Mex3wfo{X zTLen(PzXdz;)3utYh0X{OO-Cc_O0?%bKSn^IKTkm*pnYtVtE)D)dJiVz7k9RkIK2^u!D z>Z$BeL3Wu_TPc(53J^P1S}Is&VC7IG>@y8DBV7zKPRc({nQ~rbml%B(%+skUQf@D( zF>}`V$1gWKhv#WwsbaTO)j^5BsFFakh!!ZJd`xabu-e)E-G0=Z0&>IZ0tw`r$ZM@s98hzCYfoK$V|5|(MWZ&NX~?M24LwhpD*ImWjHe=V*D-sfmW$$h26Sf&n^Q z4M9EAaSU{MihQi_T~yNE%rb)T6*_Q4_ z)tC|#2BAS#HnM@-LqGmDK&3EhjautAF`SkmXd*#vPE%Y!2%BlZv@Jv8MUJ6EL$4zf z4j6HsUxt54%`#;t_Abyz#k$+YFFAKm%*$P@(lyEMh37YnHHG^)O-D6TIqJY1dX1Qrb$? z5H6wsxv=JR+9OGvX><3q6N44w$_^L{R#jvR2;>P1QTtl{OhGYQvwT08n5W=e5ivDU z9mgu7oW9K;piZkkAm#IjUN7PWa=DDriKwhQCsL>frX`XS+7?n>C`w5>1Cc2=B24Q7N1E#RF>E)n%lncYZxcpRL$j;Nv*?2sk$X13AmaYOqCL1lQo#9*a zDsIS|V(C!$le8q9k_%|9zwfDjgH@x*{>YCB?*9N1a&BpdMZ(3P*84X_(6p#^2JsP5 zRJhKS7aKb*JNm%doVApbf6hU%g=u(xid)%qFc(=_Y=+bV`4tO@WM;bSNz{jjh_a!4 zt#)2u08eIoVeJgCjniHtm7Q{$@o@n20POr*~_PxU7k@8MaD)7~%bc z?SL*pZ!9Wd!pf8lyG0eOkJ;r8vK02D)A*!izUP_oCvyuHTV*+xpcTukOF=uhq4X1!>#iMEN0b9TrA1nEB*L{iKB<0cYi7X!k@=*-$oEGRbRiz8 zhBZ#KlcF!;VCJV?Sh^*gT6&~u53A84!k0ZX+`8=225x;I#8eXMNU%ee(&t0#$_STX zH3sez?(YL^i_-o!gwxXRNTo$>m0N3bhra2k9g~Z5A!{wECAUY_KeMcMH{i*{E0)F> z`wQHuGji&~iQ=o-L+Xv6)EEbACYDA6u%n8*$VmGbq@wHUlx} z1VwMxK?~TUP0Y)7iAV|DAxg16kRnl7nZ6OkkW5>^Or%gE~!e*xu(v-ssUO?i&?xdbqI$jqE z`6$H#6}Iuq+t4I&it1V@lW!bfrvocVt-Mf>P#FVKb!pCi4br*`*l9!69 zRT|xCi3~Y4Qd6}wiE@-OlG#W}2Qrc~qyuf0uQL%mb;U_8Cu08qdPJh7rR0jGq+U|U z?NCkg6qBO2*lcZh8(*%R-pSosN@m7>(^$V2NX}E%WhpX`%Q-0gq^kkMycBGrqUFj+ z0D+hK;+?n}SX-P-v9&#qr6rtZRp*=_E%dUJl%oAd);(e$Hc{^nc5SJq^Bk?JLaLl-8nAy z4^o<@KZqJv;@@sf)YwZXUBy{PE0zEexf_c|1-mfRxC(j1w32O^X2Sk)J;NT<^?#tL z^eTNR6LV6M=2f|AgqIm~ruI3)f`!K-2<3Z4e3rTG0jRLNFx!x7lz*fsZ%9kNsUYKh znq6ri^1ZX4Ao)sn=!Dx8-f23jhZ8yq`?m)hm*=~~>Hoqd)iW?Di}RKjwT zl^|yzZ+mMIHwo=XDhnXnFw_|6nspt<;bv6@w&bQ9mU3k*ty1VvO56#$Qcl30PzEMl zm3Opd#WLUpIgp~0Vk||+P)LXTJB^;hbm{3-Q>pVpZ8;uxWumny8XTM2*B9FUF&>$p zYI2~ZF)o>ARHA!3k`g)sbv|YY98HG=+G~PEO{SuhwD5EjwU0PkJxZFVH7w-IC8SKF zv})uW$?Kuh)*Iy(93?kHWPVYw@`VZ{?|TuY`a@pnsVYH~d6c%WrX2`ZSJF`A3a;d#YOE@`$>WTzidaZ_osl)S_X zB%;9}a{zOXIQVZ*r{hde?A9indZSKh#@#Hs`p#z!l9v=xK^6%EsnYrg>xntXsq-vP zQ|8^4m}rGI{HpAto?sn_BIDLF@*E?U+sWlyibBveaJvyLgpFWXL{gYnj}nr&DH4+= zZhI84-dvOE$|fCAQjdK%vQjJ!>~^){&cPU)_+f;pb)w2;jN?72X$#Jj8<1>B9K;!t zwcB@B#U2yrKv4jj4zQ!P2y3&>U2l>WpM>=W`a*l#Sl4I?f~KS{Q5?tB=divLsZ?cv zRN@;AOCP56|r6V^$PkC4BtHHFc4ye2Dc!HoAQjTuQU3r{Q z@n7!0oG#(3iGHOj`>M*aA0!{Ftc)k`TE0dn)dpo7n@g{Dk1IO;Sqy=lJzPF15PjPCiwRSYT;`i)Rf+}gBVxs#~0Yv-EyXC|$!CH`S z(Lxpf01v5Enb+LJ7-CW3FmoXU=un?b#)Wu=0Bw|?x?u0Qu=t?;h zm0VnGMTm%z8r<6ON&uSKQ!giDzr6~m#G{iBwJx>HN#;G8ov27=JVHD#DT7BAiu&aD7AJ}39D-Cc_?8>=H##IlLZ!rg~ z8vKj0fUTu_%N;(lV20mq@!dM~=MlO_=Wv!uR2-Ld9Lgyg?+IC{IF-t!DM(5ZqAkw) zm`zc0u#$C2I+0-jK@GjsrLaG@${^=%0-IVWl_6bu!jP2ZLXNs`4X@8S>W$WZaEUGw zqpz8P=CQO$y3_*zTRhF+)C{9vwgA&*<%FaaE1=ZFqY~^$fb`Om4=m>A`*}hECmKmw zmwEekZ53bZ9Rw?Gft$ZF{gOVaGy~MZ?M=+jAMZJHlm0dB2g(onDJxJjvkRGXe#x<6 z@)0^hE+g2Jp~_r|0k*@g4udiIm_0Qar+2IQDlunKwAo_ze^iME<;MGdIB zQ}H+tbe@C5#vK`&W=@E*+QFK57sp?<{S;B$=AXvYF-~_>E{(J@4ZN}>Fk_Qx|BIw zMX`z|onn4DoFu?0&YT(}GB%e6V$(5y^83*2;iFJyvdUV8W zRjP6g{{RQ;67<)SzVnVU9zw@W^fAsnWTt%|io)KTmz$_O%2zh2X1g}~UStkL?nHF$ zPI6ro@}k10+bcp8%(x3uNjen^jJ7s6I*sF)_{POuyh^!>jWPOj69(+5?27GdEKXz+ z3ES_q52xRWvK*$tv+z)+lKXPbEeJUt3T!B+x~`xeqeyABi5n1k!>pxA$wr=H-K49) zc8sXl5t#t&n^vjhRsD=F zY4om5ZMc%B0)axo+o&*wV=~RftZlp)(tH^>k z{NVt1GORZ12O&ixLv3%S{{T38Cxs2Wt>rc*#=~u#p<)k9M$n}t zD@Y_IV=92zL!pH=3HR!=0r`~&9Sxzp_OVb(LP0%EfY+QYCesp}>9ne|N|{uqc3qZ6 zchI*3OHQ`1Ng%JTfa!Sb{up8v;w%kIo0(Hdnh7%QhSu3hS~NBY&;x6My`zQm=28;r zQriR)FRi>U;TA3po}*D!GKqTJ>rN8elFCX_mX=Q8VE2&V&|F+;zOkQ~jpBfAi1s5# zCdI3)CFsdDnaSx&fN>#RlH}5(kt*F;)pB!dw$`?g=$VBXGftMN%m&za&AlZm?{#kF zDM=vc4 zm11`TTWO?EcsIpnIKM!gs>{=rO=@0XOZIDgI!VZt8;}4W6|Ek4VjNpFh?r>;Ds@Xr zuB9#Fq^qZPzzbab;%&elFFV4@?CJy3vQ1TcCS9n{w(HEvwt}T8eT!rjtzFcPk!(cf zFcaBXW=5y!a`aUIn_)jJ%&+GcFzL?JmQKJm zL$EB=r6Ou>qd2A6l2b0ibyJ0IEnU&mE=!*%wP_*w))O~7E{S)S-a|uD+IeO@e(0_E zZ7(R}V81T3)LO92@UcpACoPBQ>+_4F2;lm?Vxau9jjb}Qq%BixO_P-Cp*kHk-$>So z21W@~W_Gy=2-#vi-98!^i{hRkNnx4gN;^-gPCS%_EXql#NJaG*QLw+1T^0FCe+zJK zB(Ex-mHiPT+oob?D}rUrmjM^p0#XSBnYPixb-!pz_9UL1o2HW0#4PQ&D&=9cVE>Z0TFmr&xBVyN7l(-M>FOU$YEN^=Z}2g7i7FA_6I@f3{^S|y;m=7+97DZM;cyIFZcSzfi3c=7|&$| z%AyIjgPaGHNTx7z%rfGdd)`zBaS8zh_!G27-YS)Uu$XOf&;J0$x-ygH$ofG8f#D3a zg{K=!s3};wPa_GOWg#V}z;UypR;_&x?}c}S#(ARhm~a#wyZacDVSSWlrz+(tV7SkH z2URpqsvSp&hDx-$9Bng_rtO_omrq!i*JM`owp1(e?VRi^^&eFI(G_N4w$_(Nc3NiP zXgfCNKSKg{p;qHIEi%kLxs*2Ajr9Z0=FqD#T*H>@YxqX0l8s5t%NFmIY6mUvV|Xf6 zWk)wFl5Z9N0J&ZV%V8_HMxS7XEy)rB<{S(+`5^a z?kQ^{y1-X>`JO@w4WPL#m33}{#WG(10F>&s9)H&kw9Gomd$pN#&dl>4RWMa5MrNp# zpZ6?~*)5A-%lDX*w8JtC1fd}b8dz>m?ShY0QSPmR+9eW!W3U?y0D{Z%vco7TPf(F~ zA7HtST{%(7uzvFgCRMar$Vel?C2GFi(`(NvVRmf1l=N*MwhcsrhzGWLB=tJOkWP_- zBUoD})##9WyX~8${NtmE{h~Bx6yA@vP(LVYpX!GcqdM}yW*O{>*5chEY?Y?zmr&HY zo&c;QTm=9HDS*d(1Ts#HI>NCettXBk}6 zeZ`~Vu(ijJ?}m2>%-MR8>_b#<6Z<{k={Yo&Jx6i+Yw68!g(bq`PP-(b)DSsrBL14A z`-^vd)aT@cYaCDbGO_2;?c;1RzWSbKR;bEJu*`y~cYeUkcAV70rd(3oH&KpzAZd_* zw_zd71tclU;{i~CJo{4V3U$OZl0rdoK_HW`*PLxhz50=B+i0nFjJS*2lNDkqyg=?3 z6LPXNmL(;sRQKIs0Z4r21%0=~n=K>ZBHBkoa2Jg9zBF+5kydJQNY_N8e@j!Pp3b>B zjZ&nj9Y7@{f_Dc(W05_kDAJ46T%AD-OQq!pHrPdqD&F+^#x`Mn##+?jOSh{(qv1MTr%;lI$l7%{3uu}4kNgIpv zFqxh(%JEYS%UAHyDiRc_#}B?20S+Q>Ozf$|?UZG(1Of;<8$?R8i4{a;^)lFgVQ33& z4g-~D_PHZbdl;iDT<2*cbV5PcB>2Xn^tB*0II}LN5L*v4vz1QUO-7)3i+M#mS(GxY zQ(w%y&y|1@gJ1yMpB+R@F?J|>8n(owl`Zx{RurcuMqG;6j+XJ~3^@K;sVP8~lc%M$ zNlSz+#}wti&6goNHiUZDzn@!twSg4O-t6LkC!3)~Fy ziyxWzBFOO1BRNtTELyo7D7;lTi7DBs$5AgeEjEFAqexiF;md4}rsNd?Wmpn9#2Xgz z75qs?YKq*lS)|KMsrf+a%dfVRe5flYPy(&w0Ob-MF4P^WPfF8eB#l0uD$-XkET+N~ z;XIImu^Nkc#2*sjiJUUzk8DENo|Q!0yQ56VP}q({9S`-!wmfmVp5a9B6&W0FP1#JU zHcU%!Hwdv`5@`5_rH3gl)Yzd*rfPL8i?6dL#GyZ2jmR3?U1A`$Uud;>8|@2U;F2qn zbo)%w>rElKnP(kR0u+;UxPm?vawgiRNYQyMX)P9e1Sr6Bz;U76sgQwP^bgGbE{-wh>|8 zH@;(i;OxrHahETTI4x~kv{m^4JRl_Y%L!7uqr%sMl0qAsNllXIJgj$sDY6Z>fE5;s zfB>lMq0RzSw5KUO^Qk=|VaQr{N3pquAXxZ9HeU_c5pV{Ug+b(4cZR+&R-n9ZvQW!y zuXQOZ^MJgr(adYVb($R%$?9|?J8&>J$V2<2uf;rt3A4hZr19(!2b(Q2J zA>Uq*2C40>7b3*-1`nHNO1crX^$}*GvgRnEu}*eZ-X>)epSBCgNE&UonLm6{STcR7S@fY# zb|KXSkWPv`g{{5(V##7*$z_t#)P)q3lAeTEkCBYYBNwpTD;8^XU=0~O<!UqUdR?RyIH%@G8V>^MkLsA` zejMRfarY3g?j4qGPdiebZIaq|DZXX;Wl6kx*MN9uMd5slMr?Mo^(S}8k=<=4 z>a>K75YLVXRWQih}Ablzjt9M`-%n09dUkAfX#uYumy(&xm|~n8(lKOi6?B zEoMpD1e#lxrc|0j+RpUTOr~O6FLWp+N&qY=NhBy9l@=SIyHEFt`h>%?^{M4{vvZR! z7aUrTBBOGA;~rk2BhK3n%c#fc01JD!?x&OdQ<$u9+NFhF!;??2?y`!Vs^u&knNSEy zP0)=9NjEmu(a!ZG&eA64nVV_5%b_kQNLe6*wY+cl#mZB7YE=SN`l9EiW!rjU$xCHo z;Q=~>ZLf29jCqb_-w4z6sN~b9pQ5hapw?TJE{PW2b1rVhx2&uFP0DS5SY@29eG~rr zQ|c74Yv-7jQAhHVaTkVBxe=u#5K=|bcL!q*-1!IMQGZ2&!^%ihU;vWSFW)eo0CM~QXC3t=E+ISETkTU7_}uP+Mkz0>@Pb?*xKG;jz$}C4j*o= z&uD^{r%;Dc~ix{te*X|h{c4vxL*v}H>|zIw4|+~%HyM?YUz$(#fdzTm)S~=Jnq^8u zvaPvrrq10rKe__YQra1gM$#^MUI=<{&CIREfN~_25!TiN&Ic|RKH?If650UG((zLF zSIDNPs#$7PmCdOENg6hJsQ5$7gp+JH@6|5y*Qy%(w1)aqP0qe%9T{Y02X!aw9$!7- z;+HJC^!a(td%s9+hIc2A${$6l1`+=3xMRO4JAdTm@ZvwX=NJ%JD{GIFemBnvQ(ok zv?F~*z#efsZG^Vn$OQ5h+BQ%S+O55!8pWapY^#=vTs_qVbtyNrA2TjPWl2zQBx+J` z6I9dX(5%U22vHU#DFX0OrOP%}v@nFNY09FM+c5Em5(LGRtC^!N^J+t+0pqxc^T;yc z;Du&F(4^dR7K!a+1ugWgOiZOF{nWml2Zmv+L1&~UsdHZMJ1(|wvhA6*c!do<;|0A+ zY!$lb?_lgqX#9JiGFO$Vqchai0(UEAFQ9)ZpSC?XR`-t^co~ZmgLr|3E3PP|nq_94 zH0e&^vY^|a%~GS-hN`lY1qo@;RG@4QgjhkzvV+`VyyHKB=ZOK_G)j8xbHWQG5wV>!+8W2Gj zH@>>ZOmSlce-AKZ?KzfZ-k!^vTi%qQjQ0k_f-QS!PR7PO`^4Bqw`bQWQpTD+|ui zs;YWwq~%plDM}73caWRt4ivh#bYrN$9Tu9XE(Xg+@+Zp(iqzn<)*UNFhjCM#K@PtZ>`XeVQ&0baIO;gnUeP zgw)L6sUrmYtef zU2n8vT5BjfKv`4Cl683GI0Tc21y;q0$gyh@FT-N%J(l4&z#HGa$r2~|U=zOhcwWu|uvrCX|+2(1r5-he;bT$xAbgOU` zZFTF)Aa%N3L4fs9GmOnh&YttlJ-I#LhY`9Jaqy^aG=&tbMKe#5Y|A>92~T*0g%x-k z-s8eFvKivWDMBY{c`Cr-z6g=8Ny=0fnU?1gQp%>JnC7gPL8l#Y)yhh@*vg^soak?RD5L^6xVHw4Qv{H%^7RZf9FKD4G$N|j36AdoJ!<_j8|Y&Qlhh~tKwM<36U2BPhUbqdxF z60R9DHDTEYJ0f#yn%CRPCV0~VP;ipNZQ}WQoWOM`a#~(lMQBgfQ6WV)9WE~rhaFN< z<1M_kOO@ue%0jK6QBPZZuNE02Wg3`vNU_Z{;Ybsc^72IqN_$y^3u~|^tS5G&{Ym7Z z?14!}MA(tHjZyxy$5NTS8IkwRE`>d|NGjl-r<`n)1ir{rIYJh+VjFS9xU?ZkLtqss z3xGUe<``~cB15Tddgm`2By_Rf7tm!Y4bQD|OKlG}o2V&3g(UK~F%c(aAQD*@9;DAp zOeBQ3EVPwsl9Dv}#hF8@J5y?OHcnDT z>0sDp11@rJZw|gOQRE%bLE4hHn(SOFN=JW94Zg?#8I!26-ogwsiD`Dpo!&=~jWVS6 z?Wy3Ux1A-#q}Y_)W&rXwya^@f2jJqs*l^%##wq$g-Z3(2PD&Z)+9$DVB1%xoj+)(B zh}TdKkz4y?`(M`T_|{_pV0ybvVb@lgbwX}kuv~fDp4GH0i+~8qNYg?GGZsnqvBGq( zX8PlNKB7#}kxZsHB`$>_DMXy(?kS`ooA=zx7WQkKfvLQ31|5=I{x`zX?TqVosM|>j zJCX<&K6Z-ouuBV^ZiTJPHwdSVqO6haSH>Eq2{azg=x8K1pq&GjAnVsq511Vx^un2% zOO!|4k$42W$;z-lE1VEVDCPx)=nguCgaNLRg*J_mtYLy7BFNvB;||e>W26fyEM~WK zD$wa&AR9)IfP~m2Bp!m%v#bb0QSPHvoEXH=1wIP2#SI=rmi3DVs2 zW3eX4nofzoAhGpNj>oKABtlAsJ&KbGW%kmvC=`&Pa6#N2qrxu3l_XRzWtEfDp~$mT zy*XJw%BpxH)RBF^E|-nM&tV9r-o)s z-HPHS$CDO79w~Fv2O~_UQ`!=<=s&I;*m$KKnk9IV|kcmX3xy*`mib+~WeMlE6zwI#X!(23nB%P|y%AVczS(Ltu z6tp%~j@gdBR*Ma`+LKDVCXm|IYpE#$@ncYFS?&atAE4m1grLlicb7=MOZU&8NOzH> z$WoHEO0-t{ipkr$b1eGu9s(RgiAYkEy9E47QLqr2p2bSE_(dX|xwN-%W*z)n0H4k~ z`aoYeZ{jo*4ZFct+g-dO&$q9f4P+dm z+@hJ!laRFsM}P_{yqe+7Q7wZjQ)%BV08dlTXqh zdk=;vs*|;5WDwh^a4Ygu58VkAn`TP29LFe|;yw+~=g_yLWj)4Yd&?^&{WgmJr|%eH z_GKzzWec(!omj9@|kylDr|P^8-*0C;pe62XWU`5i5aGHkc~1O zd2-gqJs9DpJD$Z{B*PQvd$69Jq%fm424x}6%p|VILURIaV}=4s)Cu@}I!8@=KVup- zGlewSDf~dfXJnS+FH6lhmdv%*N*h9V?1F8S>wR^&u$FLdh6zBybBoJLkm7G@d}oBf zq|DIdOs*>Ug!4|QA(^J++(gT+6pYTPwG@JRUK8TU z+&M1W$*Go?G1>NIv=iEt?h~e!QrvE~eQOkiN3vRri=SBDAlT^HO9B@VeS zGSEmWnQ&xy+>5t!aeeagyfAUjkw=xDVsIto)aKGuR)qyNtd>obl627SJw~xv88rj~ zzlB8?2~G?&_0ZEbh+jnfw-9#Wvw<_f^!E*1A_y0uQImCB%~%b}TrW|os;Z+_~4(%m7e zh=q(b#0hz}>C&{LaOAA>gS3;F0X^d5K_^?ATw9SNoJ^@$)!;2t?j~WHVi_HCvCpWUe{UB58Dq_IcDVRZ?fIO5H2tJH-=Rl>m(ZsSR30&CkQXtS{rQ@sFj<> z(8&oY~)Ps>p)T3fN zVlZq(ETpa0UkYd?%*qKGYeZlKp z3-4$eTut)k8MBE#)>F3Q@m!B_M>3S(UsU!dd1X z;+_Xelrt{5DnL8iHMToLCBX*99WZ>rk;YhlZo@MbDQ5zR)LG=-139Q(2ccK+o__Nk z`i0j#Se5r|aXu2FoPoan54d9WoP6m;n1aFjPmV~CY zeIt8_*DFTBgqWn28hdpKWi;YJxHcqT`v~XB`3G=5D*6G!evX^Esij8cwQi;_)0%uV z_9H_B}DU_+%>4mi}*g>T!>@E3T^yn zJo8T_a-vOvEZR|*vTWwe75PdlNjK?X$~E9~oiTAd_FQC+9v*-=N!#x##OQjR;MwYe zSaF$lT5@i2(gG#f8J0!&AZ$EhEMBN$>bmK4aoMvhpk}8WHbQzMsXhaHauIppY(6No z?$N~u=A6*X6a=YB8+t^tGaAbc;oO!pJJ6U(v=LqSwAK@(?l{7-7A9`t|EGObZ^JP#UZoMOS9%o62_Pes= zI<7QuWim+i)wv4Hn`Nq!5h{iPB|s;!Cg{)kM1JUoOwbc0Co?kh56a9ilICU-av+Ve zozI*~S2WcQN40tNn| zD0RftI`c0~$;&hT*Sxhn7?d|azUkLn>3e*l5uITH1xm;b^4~yu+pKQmL@QGW{{SBa zN=Mn!R>P`5Qd%lX6>P~i))cChJQ5u&El4_M7FFRpOs(~0LJG(m2ytO^47QXkDHhNK zpWPSSNZ|pX9f};SJWe#FIOt(}gsC^vnLPv*GS_Mlq`s%rP&6Y{_+AcF`>SZSrxaVZ z%HPWUAT76Mol#Ip1Scu@iGhtna*TAEb(l?SpX{05|lXYDG z02YowdG89GVYfjFKp^iKFr~E7Eu%Vz)q92k z^HruAn{_iKLDQ*G8MA5EubdTBoSIYUeXqp2fx1<2r1>4;o}oANgvV&MklUaHuP@d; zVZh$f=agK_jXN;4u!7rU+$6v{Mg($5`9`)jI(fkoLrIOm5^Vzzl2Rw-{n}w{m1fDM z`ogR|EQL?JqBTfLz#VlEs%oC|?#xVkxjB$B3+w0oP-Y*Lb(iK8v=joABwTN)if3zE zV{#OC5`*-t`=Dx+uCuLujNG>#_pqm9-LV1h&h}v3Lyml)YR85FHxx|P- z2eLK(>cWlnNIF0=Db$^EqneJ8;QL6jO2IsU>jjiti-D%Yq(;#mDJ3mkyC4)>VtK$F zZ@iG9VQZ2G@U*7!sBlUVqMP1mwyvX*fC5IKkq!$$btG+nvJ$Y`ZV9pTe*td@1hksoT5_dHO4VSzq=I@xj+IJfg3(=+`gP2crTRlS?3iwy00@=} zQh*^p5gJ2ET~kgeY6?*|0Qmmcb(?fFk(nV#Iv%6O8s{dPQhPK4pr3_z+5)6$7@3C| zaFSP%T)?%wggMfxAj~r6VV##yv#pMb8rmBYhaHgtN4;+C`9pIHN?iosO+~uJc|6g$ zdkVD>@TQI4(0^6v&l^%EWvDahH%rYOe8N@xVyf81p^KjSV}qDVpmjZy1gp)fAGI-8 z5xjFwH>CQ2y(&F{9)zq>)&cdrqh#tlqgU1tPFC%tX|;B1O09cF#ATt=a)Z2V>lqvC z2_zdv!eeoel0oYXcXwovHom6+gQ_$2isFh7fRAlM}Zdou;bM+ z7qL}InJ+h)ligZHiRg8Rgz;3SEvO~;$7eFrD`jq=peHCGv=y>|)n}i69^@3Sqh*q- z_Ye?AicVkI8=GyZ<~tddkub&Y*}9Ol{ET!EngQ$2C2ohghq50DM73t0GczfxQ*{SU zds^W(PwX*rqy!`-BFRXw5m#_Jo`z}D!40LhSf7~zW&0FA~#(bjDN`{QOaXnIX(=_f-k<|f_K_dx{aI`fSatOyMulL5W0Y9n{jHyX4h zC89Kqt7ye-0Z}lM6;1m^(_N}dP-SI+GZPb9B%1;dFTbou@a`9=Qk2r_iD32*spbT_ ziAYfvx`7*wZOd4k@i89pjPR2?geGC~Jc2|buDq7y$}<$LTBp;jXh2VZ;oAQIWzF?w zgEJ4a>Qhxm70aqs`6nd|!WNR1T-aZyrkcVj+-We!y16KnG}um6Fti(K(Dd?zRJUbV zsDn6+?3<-m7s^jKY{ibXCgi-7jMC<0(2`IT=V%Z~_(6e30}I0|_E>IpZ%MwjF)>o9 z%ub>8uA!?bRHCI^>S1j?hZOzG zV=m+?mxzPx(P&`VprMrNYqJcz>KI$)9Gg0i5eh02u6+*F#M33WFO{{M1uMX(rv6ro z1t>}h%9N)2~0!Ib2XNO@M}pF&}R gy@lST_LB?(jPU;qFB literal 0 HcmV?d00001 diff --git a/models/Reference/CalamitousFelicitousness--Anima-sdnext-diffusers.jpg b/models/Reference/CalamitousFelicitousness--Anima-sdnext-diffusers.jpg index cdcee5de60bdb42fe8eacb301b7d47bf5ae03b9b..aa0a0208af404764d3829ae4c0b3248b8b3ed586 100644 GIT binary patch delta 63987 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 z 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 Date: Fri, 27 Mar 2026 19:17:34 +0100 Subject: [PATCH 05/73] update permissions Signed-off-by: vladmandic --- cli/api-samplers.py | 0 cli/download-file.py | 0 cli/git-clone.py | 0 cli/install-stablefast.py | 0 cli/search-docs.py | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 cli/api-samplers.py mode change 100644 => 100755 cli/download-file.py mode change 100644 => 100755 cli/git-clone.py mode change 100644 => 100755 cli/install-stablefast.py mode change 100644 => 100755 cli/search-docs.py diff --git a/cli/api-samplers.py b/cli/api-samplers.py old mode 100644 new mode 100755 diff --git a/cli/download-file.py b/cli/download-file.py old mode 100644 new mode 100755 diff --git a/cli/git-clone.py b/cli/git-clone.py old mode 100644 new mode 100755 diff --git a/cli/install-stablefast.py b/cli/install-stablefast.py old mode 100644 new mode 100755 diff --git a/cli/search-docs.py b/cli/search-docs.py old mode 100644 new mode 100755 From 64400a0cde1ab7abf9fe118cda1a49477406d7b7 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Fri, 27 Mar 2026 19:22:38 +0100 Subject: [PATCH 06/73] add dev stats Signed-off-by: vladmandic --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 330e9f4b7..e709c954b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,9 @@ New color grading module, updated localization with new languages and improved t And major work on API hardening: security, rate limits, secrets handling, new endpoints, etc. But also many smaller quality-of-life improvements - for full details, see [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) + *Note*: Purely due to size of changes, clean install is recommended! +Just how big? Some stats: *~530 commits over 880 files* [ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) | [Sponsor](https://github.com/sponsors/vladmandic) From 6eadf40f335ed831aa25a623617fedfa11f58ecf Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 27 Mar 2026 21:31:36 +0300 Subject: [PATCH 07/73] SDNQ add ufp aliases --- modules/sdnq/common.py | 22 ++++++++++++++++++++-- modules/sdnq/packed_int/__init__.py | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/modules/sdnq/common.py b/modules/sdnq/common.py index 10351d3ba..f80d902e7 100644 --- a/modules/sdnq/common.py +++ b/modules/sdnq/common.py @@ -239,9 +239,27 @@ dtype_dict["fp5"] = dtype_dict["float5_e2m2fn"] dtype_dict["fp4"] = dtype_dict["float4_e2m1fn"] dtype_dict["fp3"] = dtype_dict["float3_e1m1fn"] dtype_dict["fp2"] = dtype_dict["float2_e1m0fn"] -dtype_dict["fp1"] = dtype_dict["float1_e1m0fnu"] -dtype_dict["bool"] = dtype_dict["uint1"] + +dtype_dict["ufp16"] = dtype_dict["float16_e5m11fnu"] +dtype_dict["ufp15"] = dtype_dict["float15_e5m10fnu"] +dtype_dict["ufp14"] = dtype_dict["float14_e5m9fnu"] +dtype_dict["ufp13"] = dtype_dict["float13_e5m8fnu"] +dtype_dict["ufp12"] = dtype_dict["float12_e5m7fnu"] +dtype_dict["ufp11"] = dtype_dict["float11_e5m6fnu"] +dtype_dict["ufp10"] = dtype_dict["float10_e5m5fnu"] +dtype_dict["ufp9"] = dtype_dict["float9_e4m5fnu"] +dtype_dict["ufp8"] = dtype_dict["float8_e4m4fnu"] +dtype_dict["ufp7"] = dtype_dict["float7_e3m4fnu"] +dtype_dict["ufp6"] = dtype_dict["float6_e3m3fnu"] +dtype_dict["ufp5"] = dtype_dict["float5_e2m3fnu"] +dtype_dict["ufp4"] = dtype_dict["float4_e2m2fnu"] +dtype_dict["ufp3"] = dtype_dict["float3_e1m2fnu"] +dtype_dict["ufp2"] = dtype_dict["float2_e1m1fnu"] +dtype_dict["ufp1"] = dtype_dict["float1_e1m0fnu"] + +dtype_dict["fp1"] = dtype_dict["ufp1"] dtype_dict["int1"] = dtype_dict["uint1"] +dtype_dict["bool"] = dtype_dict["uint1"] torch_dtype_dict = { torch.int32: "int32", diff --git a/modules/sdnq/packed_int/__init__.py b/modules/sdnq/packed_int/__init__.py index ddd6d171d..9fac3314b 100644 --- a/modules/sdnq/packed_int/__init__.py +++ b/modules/sdnq/packed_int/__init__.py @@ -68,6 +68,7 @@ packed_int_function_dict["int5"] = packed_int_function_dict["uint5"] packed_int_function_dict["int4"] = packed_int_function_dict["uint4"] packed_int_function_dict["int3"] = packed_int_function_dict["uint3"] packed_int_function_dict["int2"] = packed_int_function_dict["uint2"] +packed_int_function_dict["int1"] = packed_int_function_dict["uint1"] packed_int_function_dict["bool"] = packed_int_function_dict["uint1"] From fe7e4b40ff0dac4e064680b5a95c7863b0996cc9 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:05:41 -0700 Subject: [PATCH 08/73] Update models to match actual behavior - ResScripts - ResEmbeddings --- modules/api/models.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/api/models.py b/modules/api/models.py index c0d4f32ed..dd8eb1b87 100644 --- a/modules/api/models.py +++ b/modules/api/models.py @@ -484,17 +484,17 @@ else: FlagsModel = create_model("Flags", __config__=pydantic_config, **flags) class ResEmbeddings(BaseModel): - loaded: list = Field(default=None, title="loaded", description="List of loaded embeddings") - skipped: list = Field(default=None, title="skipped", description="List of skipped embeddings") + loaded: list = Field(title="loaded", description="List of loaded embeddings") + skipped: list = Field(title="skipped", description="List of skipped embeddings") class ResMemory(BaseModel): ram: dict = Field(title="RAM", description="System memory stats") cuda: dict = Field(title="CUDA", description="nVidia CUDA memory stats") class ResScripts(BaseModel): - txt2img: list = Field(default=None, title="Txt2img", description="Titles of scripts (txt2img)") - img2img: list = Field(default=None, title="Img2img", description="Titles of scripts (img2img)") - control: list = Field(default=None, title="Control", description="Titles of scripts (control)") + txt2img: list[str] = Field(title="Txt2img", description="Titles of scripts (txt2img)") + img2img: list[str] = Field(title="Img2img", description="Titles of scripts (img2img)") + control: list[str] = Field(title="Control", description="Titles of scripts (control)") class ResGPU(BaseModel): # definition of http response name: str = Field(title="GPU Name", description="GPU device name") From 1e9bef8d56ad318b8c52822b887e7a1ff249ac20 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:15:44 -0700 Subject: [PATCH 09/73] Type enforcement for ResGPU Only tuples support typing a specific number of entries. --- modules/api/gpu.py | 2 +- modules/api/models.py | 2 +- modules/api/nvml.py | 2 +- modules/api/rocm_smi.py | 2 +- modules/api/xpu_smi.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/api/gpu.py b/modules/api/gpu.py index fac3ef23e..bdcffde81 100644 --- a/modules/api/gpu.py +++ b/modules/api/gpu.py @@ -42,7 +42,7 @@ Resut should always be: list[ResGPU] class ResGPU(BaseModel): name: str = Field(title="GPU Name") data: dict = Field(title="Name/Value data") - chart: list[float, float] = Field(title="Exactly two items to place on chart") + chart: tuple[float, float] = Field(title="Exactly two items to place on chart") """ if __name__ == '__main__': diff --git a/modules/api/models.py b/modules/api/models.py index dd8eb1b87..aa2bb197d 100644 --- a/modules/api/models.py +++ b/modules/api/models.py @@ -499,7 +499,7 @@ class ResScripts(BaseModel): class ResGPU(BaseModel): # definition of http response name: str = Field(title="GPU Name", description="GPU device name") data: dict = Field(title="Name/Value data", description="Key-value pairs of GPU metrics (utilization, temperature, clocks, memory, etc.)") - chart: list[float, float] = Field(title="Exactly two items to place on chart", description="Two numeric values for chart display (e.g., GPU utilization %, VRAM usage %)") + chart: tuple[float, float] = Field(title="Exactly two items to place on chart", description="Two numeric values for chart display (e.g., GPU utilization %, VRAM usage %)") class ItemLoadedModel(BaseModel): name: str = Field(title="Model Name", description="Model or component name") diff --git a/modules/api/nvml.py b/modules/api/nvml.py index 0dec562be..7a040696e 100644 --- a/modules/api/nvml.py +++ b/modules/api/nvml.py @@ -72,7 +72,7 @@ def get_nvml(): "System load": f'GPU {load.gpu}% | VRAM {load.memory}% | Temp {pynvml.nvmlDeviceGetTemperature(dev, 0)}C | Fan {pynvml.nvmlDeviceGetFanSpeed(dev)}%', 'State': get_reason(pynvml.nvmlDeviceGetCurrentClocksThrottleReasons(dev)), } - chart = [load.memory, load.gpu] + chart = (load.memory, load.gpu) devices.append({ 'name': name, 'data': data, diff --git a/modules/api/rocm_smi.py b/modules/api/rocm_smi.py index e7b9a2f74..fd95fa316 100644 --- a/modules/api/rocm_smi.py +++ b/modules/api/rocm_smi.py @@ -96,7 +96,7 @@ def get_rocm_smi(): 'Throttle reason': str(ThrottleStatus(int(rocm_smi_data[key].get("throttle_status", 0)))), } name = rocm_smi_data[key].get('Device Name', 'unknown') - chart = [load["memory"], load["gpu"]] + chart = (load["memory"], load["gpu"]) devices.append({ 'name': name, 'data': data, diff --git a/modules/api/xpu_smi.py b/modules/api/xpu_smi.py index 70401b84d..56c614781 100644 --- a/modules/api/xpu_smi.py +++ b/modules/api/xpu_smi.py @@ -29,7 +29,7 @@ def get_xpu_smi(): "VRAM usage": f'{round(100 * load["memory"] / total)}% | {load["memory"]} MB used | {total - load["memory"]} MB free | {total} MB total', "RAM usage": f'{round(100 * ram["used"] / ram["total"])}% | {round(1024 * ram["used"])} MB used | {round(1024 * ram["free"])} MB free | {round(1024 * ram["total"])} MB total', } - chart = [load["memory"], load["gpu"]] + chart = (load["memory"], load["gpu"]) devices.append({ 'name': torch.xpu.get_device_name(), 'data': data, From fa1bc15e642c2a535b49deb856496cd01bedbe83 Mon Sep 17 00:00:00 2001 From: CalamitousFelicitousness Date: Sat, 28 Mar 2026 03:14:44 +0000 Subject: [PATCH 10/73] fix(installer): remove duplicate pip prefix from CUDA torch command --- installer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/installer.py b/installer.py index a701cb644..b07e75db8 100644 --- a/installer.py +++ b/installer.py @@ -559,8 +559,7 @@ def install_cuda(): if args.use_nightly: cmd = os.environ.get('TORCH_COMMAND', '--upgrade --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu128 --extra-index-url https://download.pytorch.org/whl/nightly/cu130') else: - # cmd = os.environ.get('TORCH_COMMAND', 'torch==2.10.0+cu128 torchvision==0.25.0+cu128 --index-url https://download.pytorch.org/whl/cu128') - cmd = os.environ.get("TORCH_COMMAND", "pip install -U torch==2.11.0+cu130 torchvision==0.26.0+cu130 --index-url https://download.pytorch.org/whl/cu130") + cmd = os.environ.get('TORCH_COMMAND', 'torch==2.11.0+cu130 torchvision==0.26.0+cu130 --index-url https://download.pytorch.org/whl/cu130') return cmd From 611dfe43015d3aeda595aa8fc3edde51c143242e Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 28 Mar 2026 08:57:23 +0100 Subject: [PATCH 11/73] update nunchaku installer Signed-off-by: vladmandic --- CHANGELOG.md | 7 +-- installer.py | 15 ++++--- modules/mit_nunchaku.py | 96 +++++++++++++++++++++++------------------ 3 files changed, 65 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e709c954b..051361715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Change Log for SD.Next -## Update for 2026-03-27 +## Update for 2026-03-28 -### Highlights for 2026-03-27 +### Highlights for 2026-03-28 This release brings massive code refactoring to modernize codebase and removal of some obsolete features. Leaner & Faster! And since its a bit quieter period when it comes to new models, notable additions would be : *FireRed-Image-Edit*, *SkyWorks-UniPic-3* and new versions of *Anima-Preview*, *Flux-Klein-KV* @@ -20,7 +20,7 @@ Just how big? Some stats: *~530 commits over 880 files* [ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) | [Sponsor](https://github.com/sponsors/vladmandic) -### Details for 2026-03-27 +### Details for 2026-03-28 - **Models** - [Google Flash 3.1 Image](https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview) a.k.a. *Nano Banana 2* @@ -77,6 +77,7 @@ Just how big? Some stats: *~530 commits over 880 files* - *note* **Cuda** `torch==2.10` removed support for `rtx1000` series and older GPUs use following before first startup to force installation of `torch==2.9.1` with `cuda==12.6`: > `set TORCH_COMMAND='torch==2.9.1 torchvision==0.24.1 torchaudio==2.9.1 --index-url https://download.pytorch.org/whl/cu126'` + - update installer and support `nunchaku==1.2.1` - **UI** - legacy panels **T2I** and **I2I** are disabled by default you can re-enable them in *settings -> ui -> hide legacy tabs* diff --git a/installer.py b/installer.py index b07e75db8..0b7c491ad 100644 --- a/installer.py +++ b/installer.py @@ -197,14 +197,15 @@ def installed(package, friendly: str | None = None, quiet = False): # pylint: di def uninstall(package, quiet = False): t_start = time.time() packages = package if isinstance(package, list) else [package] - res = '' + txt = '' for p in packages: if installed(p, p, quiet=True): if not quiet: log.warning(f'Package: {p} uninstall') - res += pip(f"uninstall {p} --yes --quiet", ignore=True, quiet=True, uv=False) + _result, _txt = pip(f"uninstall {p} --yes --quiet", ignore=True, quiet=True, uv=False) + txt += _txt ts('uninstall', t_start) - return res + return txt def run(cmd: str, *nargs: str, **kwargs): @@ -259,20 +260,20 @@ def pip(arg: str, ignore: bool = False, quiet: bool = True, uv = True): all_args = f'{pip_log}{arg} {env_args}'.strip() if not quiet: log.debug(f'Running: {pipCmd}="{all_args}"') - result, txt = run(sys.executable, "-m", pipCmd, all_args) + result, output = run(sys.executable, "-m", pipCmd, all_args) if len(result.stderr) > 0: if uv and result.returncode != 0: log.warning(f'Install: cmd="{pipCmd}" args="{all_args}" cannot use uv, fallback to pip') debug(f'Install: uv pip error: {result.stderr}') cleanup_broken_packages() return pip(originalArg, ignore, quiet, uv=False) - debug(f'Install {pipCmd}: {txt}') + debug(f'Install {pipCmd}: {output}') if result.returncode != 0 and not ignore: errors.append(f'pip: {package}') log.error(f'Install: {pipCmd}: {arg}') - log.debug(f'Install: pip output {txt}') + log.debug(f'Install: pip code={result.returncode} stdout={result.stdout} stderr={result.stderr} output={output}') ts('pip', t_start) - return txt + return result, output # install package using pip if not already installed diff --git a/modules/mit_nunchaku.py b/modules/mit_nunchaku.py index aa8eb228b..f9501e36c 100644 --- a/modules/mit_nunchaku.py +++ b/modules/mit_nunchaku.py @@ -2,43 +2,20 @@ from installer import pip from modules.logger import log -from modules import devices -nunchaku_versions = { - '2.5': '1.0.1', - '2.6': '1.0.1', - '2.7': '1.1.0', - '2.8': '1.1.0', - '2.9': '1.1.0', - '2.10': '1.0.2', - '2.11': '1.1.0', -} ok = False -def _expected_ver(): - try: - import torch - torch_ver = '.'.join(torch.__version__.split('+')[0].split('.')[:2]) - return nunchaku_versions.get(torch_ver) - except Exception: - return None - - def check(): global ok # pylint: disable=global-statement if ok: return True try: import nunchaku - import nunchaku.utils - from nunchaku import __version__ - expected = _expected_ver() + import nunchaku.utils # pylint: disable=no-name-in-module, no-member + from nunchaku import __version__ # pylint: disable=no-name-in-module log.info(f'Nunchaku: path={nunchaku.__path__} version={__version__.__version__} precision={nunchaku.utils.get_precision()}') - if expected is not None and __version__.__version__ != expected: - ok = False - return False ok = True return True except Exception as e: @@ -47,14 +24,15 @@ def check(): return False -def install_nunchaku(): - if devices.backend is None: - return False # too early +def install_nunchaku(force=False): + if not force: + from modules import devices + if devices.backend is None: + return False # too early if not check(): import os import sys import platform - import torch python_ver = f'{sys.version_info.major}{sys.version_info.minor}' if python_ver not in ['311', '312', '313']: log.error(f'Nunchaku: python={sys.version_info} unsupported') @@ -63,24 +41,56 @@ def install_nunchaku(): if arch not in ['linux', 'windows']: log.error(f'Nunchaku: platform={arch} unsupported') return False - if devices.backend not in ['cuda']: + if not force and devices.backend not in ['cuda']: log.error(f'Nunchaku: backend={devices.backend} unsupported') return False - torch_ver = '.'.join(torch.__version__.split('+')[0].split('.')[:2]) - nunchaku_ver = nunchaku_versions.get(torch_ver) - if nunchaku_ver is None: - log.error(f'Nunchaku: torch={torch.__version__} unsupported') - return False - suffix = 'x86_64' if arch == 'linux' else 'win_amd64' + url = os.environ.get('NUNCHAKU_COMMAND', None) - if url is None: - arch = f'{arch}_' if arch == 'linux' else '' - url = f'https://huggingface.co/nunchaku-ai/nunchaku/resolve/main/nunchaku-{nunchaku_ver}' - url += f'+torch{torch_ver}-cp{python_ver}-cp{python_ver}-{arch}{suffix}.whl' - cmd = f'install --upgrade {url}' - log.debug(f'Nunchaku: install="{url}"') - pip(cmd, ignore=False, uv=False) + if url is not None: + cmd = f'install --upgrade {url}' + log.debug(f'Nunchaku: install="{url}"') + result, _output = pip(cmd, uv=False, ignore=not force, quiet=not force) + return result.returncode == 0 + else: + import torch + torch_ver = '.'.join(torch.__version__.split('+')[0].split('.')[:2]) + cuda_ver = torch.__version__.split('+')[1]if '+' in torch.__version__ else None + cuda_ver = cuda_ver[:4] + '.' + cuda_ver[-1] if cuda_ver and len(cuda_ver) >= 4 else None + suffix = 'linux_x86_64' if arch == 'linux' else 'win_amd64' + if cuda_ver is None: + log.error(f'Nunchaku: torch={torch.__version__} cuda="unknown"') + return False + if cuda_ver.startswith('cu13'): + nunchaku_versions = ['1.2.1', '1.2.0', '1.1.0', '1.0.2', '1.0.1'] + else: + nunchaku_versions = ['1.2.1', '1.0.2', '1.0.1'] # 1.2.0 and 1.1.0 imply cu13 but do not specify it + for v in nunchaku_versions: + url = f'https://github.com/nunchaku-ai/nunchaku/releases/download/v{v}/' + fn = f'nunchaku-{v}+{cuda_ver}torch{torch_ver}-cp{python_ver}-cp{python_ver}-{suffix}.whl' + result, _output = pip(f'install --upgrade {url+fn}', uv=False, ignore=True, quiet=True) + if force: + log.debug(f'Nunchaku: url="{fn}" code={result.returncode} stdout={result.stdout} stderr={result.stderr} output={_output}') + if result.returncode == 0: + log.info(f'Nunchaku: install url="{url}"') + return True + fn = f'nunchaku-{v}+torch{torch_ver}-cp{python_ver}-cp{python_ver}-{suffix}.whl' + result, _output = pip(f'install --upgrade {url+fn}', uv=False, ignore=True, quiet=True) + if force: + log.debug(f'Nunchaku: url="{fn}" code={result.returncode} stdout={result.stdout} stderr={result.stderr} output={_output}') + if result.returncode == 0: + log.info(f'Nunchaku: install version={v} url="{url+fn}"') + return True + log.error(f'Nunchaku install failed: torch={torch.__version__} cuda={cuda_ver} python={python_ver} platform={arch}') + return False + if not check(): log.error('Nunchaku: install failed') return False return True + + +if __name__ == '__main__': + from modules.logger import setup_logging + setup_logging() + log.info('Nunchaku: manual install') + install_nunchaku(force=True) From b86e357b8eed073d78e714e1e704d8341d001919 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 28 Mar 2026 09:49:05 +0100 Subject: [PATCH 12/73] update nunchaku code Signed-off-by: vladmandic --- CHANGELOG.md | 1 + extensions-builtin/sdnext-modernui | 2 +- installer.py | 4 ++-- modules/mit_nunchaku.py | 16 +++++++++++++--- pipelines/model_z_image.py | 6 ++++-- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 051361715..726aa1a1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -129,6 +129,7 @@ Just how big? Some stats: *~530 commits over 880 files* - refactor move `rebmg` to core instead of extensions - remove face restoration - unified command line parsing + - reinstall `nunchaku` with `--reinstall` flag - use explicit icon image references in `gallery`, thanks @awsr - launch use threads to async execute non-critical tasks - switch from deprecated `pkg_resources` to `importlib` diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 488ab401c..c7af727f3 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 488ab401cfaae83da94821c3f92ba718177dc106 +Subproject commit c7af727f31758c9fc96cf0429bcf3608858a15e8 diff --git a/installer.py b/installer.py index 0b7c491ad..77193d0de 100644 --- a/installer.py +++ b/installer.py @@ -244,13 +244,13 @@ def cleanup_broken_packages(): pass -def pip(arg: str, ignore: bool = False, quiet: bool = True, uv = True): +def pip(arg: str, ignore: bool = False, quiet: bool = True, uv = True) -> tuple[subprocess.CompletedProcess, str]: t_start = time.time() originalArg = arg arg = arg.replace('>=', '==') if opts.get('offline_mode', False): log.warning('Offline mode enabled') - return 'offline' + return None, 'offline' package = arg.replace("install", "").replace("--upgrade", "").replace("--no-deps", "").replace("--force-reinstall", "").replace(" ", " ").strip() uv = uv and args.uv and not package.startswith('git+') pipCmd = "uv pip" if uv else "pip" diff --git a/modules/mit_nunchaku.py b/modules/mit_nunchaku.py index f9501e36c..ea616fe5b 100644 --- a/modules/mit_nunchaku.py +++ b/modules/mit_nunchaku.py @@ -7,8 +7,10 @@ from modules.logger import log ok = False -def check(): +def check(force=False): global ok # pylint: disable=global-statement + if force: + return False if ok: return True try: @@ -26,10 +28,12 @@ def check(): def install_nunchaku(force=False): if not force: - from modules import devices + from modules import devices, shared if devices.backend is None: return False # too early - if not check(): + if shared.cmd_opts.reinstall: + force = True + if not check(force): import os import sys import platform @@ -68,6 +72,9 @@ def install_nunchaku(force=False): url = f'https://github.com/nunchaku-ai/nunchaku/releases/download/v{v}/' fn = f'nunchaku-{v}+{cuda_ver}torch{torch_ver}-cp{python_ver}-cp{python_ver}-{suffix}.whl' result, _output = pip(f'install --upgrade {url+fn}', uv=False, ignore=True, quiet=True) + if (result is None) or (_output == 'offline'): + log.error(f'Nunchaku: install url="{url+fn}" offline mode') + return False if force: log.debug(f'Nunchaku: url="{fn}" code={result.returncode} stdout={result.stdout} stderr={result.stderr} output={_output}') if result.returncode == 0: @@ -75,6 +82,9 @@ def install_nunchaku(force=False): return True fn = f'nunchaku-{v}+torch{torch_ver}-cp{python_ver}-cp{python_ver}-{suffix}.whl' result, _output = pip(f'install --upgrade {url+fn}', uv=False, ignore=True, quiet=True) + if (result is None) or (_output == 'offline'): + log.error(f'Nunchaku: install url="{url+fn}" offline mode') + return False if force: log.debug(f'Nunchaku: url="{fn}" code={result.returncode} stdout={result.stdout} stderr={result.stderr} output={_output}') if result.returncode == 0: diff --git a/pipelines/model_z_image.py b/pipelines/model_z_image.py index e145356e6..bb12a5608 100644 --- a/pipelines/model_z_image.py +++ b/pipelines/model_z_image.py @@ -7,11 +7,13 @@ from pipelines import generic def load_nunchaku(): import nunchaku + if not hasattr(nunchaku, 'NunchakuZImageTransformer2DModel'): # not present in older versions of nunchaku + return None nunchaku_precision = nunchaku.utils.get_precision() nunchaku_rank = 128 nunchaku_repo = f"nunchaku-ai/nunchaku-z-image-turbo/svdq-{nunchaku_precision}_r{nunchaku_rank}-z-image-turbo.safetensors" log.debug(f'Load module: quant=Nunchaku module=transformer repo="{nunchaku_repo}" attention={shared.opts.nunchaku_attention}') - transformer = nunchaku.NunchakuZImageTransformer2DModel.from_pretrained( + transformer = nunchaku.NunchakuZImageTransformer2DModel.from_pretrained( # pylint: disable=no-member nunchaku_repo, torch_dtype=devices.dtype, cache_dir=shared.opts.hfcache_dir, @@ -30,7 +32,7 @@ def load_z_image(checkpoint_info, diffusers_load_config=None): if model_quant.check_nunchaku('Model'): # only available model transformer = load_nunchaku() - else: + if transformer is None: transformer = generic.load_transformer(repo_id, cls_name=diffusers.ZImageTransformer2DModel, load_config=diffusers_load_config) text_encoder = generic.load_text_encoder(repo_id, cls_name=transformers.Qwen3ForCausalLM, load_config=diffusers_load_config) From ba8f7b06b2e48b025de8dec21137822b712a4696 Mon Sep 17 00:00:00 2001 From: resonantsky Date: Sat, 28 Mar 2026 00:08:39 +0200 Subject: [PATCH 13/73] pre-inference resize save out fix --- scripts/i2i_folder.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/i2i_folder.py b/scripts/i2i_folder.py index e616915b0..e87b6244a 100644 --- a/scripts/i2i_folder.py +++ b/scripts/i2i_folder.py @@ -172,6 +172,9 @@ class I2IFolderScript(scripts_manager.Script): out_dir = (output_dir or "").strip() or os.path.join(folder, "output") os.makedirs(out_dir, exist_ok=True) + pre_resize_out_dir = os.path.join(out_dir, "pre-resize") if pre_resize_enabled else None + if pre_resize_out_dir: + os.makedirs(pre_resize_out_dir, exist_ok=True) resize_out_dir = os.path.join(os.path.dirname(out_dir), "output-resized") if resize_enabled else None if resize_out_dir: os.makedirs(resize_out_dir, exist_ok=True) @@ -229,6 +232,9 @@ class I2IFolderScript(scripts_manager.Script): cp.width = img.width cp.height = img.height log.info(f"Image folder batch: pre-resize to {img.size} mode={shared.resize_modes[pre_resize_mode]!r} method={pre_resize_name!r}") + pre_out_path = os.path.join(pre_resize_out_dir, os.path.basename(filepath)) + img.save(pre_out_path) + log.info(f"Image folder batch: pre-resize saved {pre_out_path!r}") if upscale_only: log.info(f"Image folder batch: [{i + 1}/{len(files)}] upscale-only file={os.path.basename(filepath)} size={img.size}") out_img = img From 133bf81ad0162f75721b421ff14b619eb841b230 Mon Sep 17 00:00:00 2001 From: resonantsky Date: Sat, 28 Mar 2026 00:27:12 +0200 Subject: [PATCH 14/73] faulty pre-inference resize removed --- scripts/i2i_folder.py | 112 +++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/scripts/i2i_folder.py b/scripts/i2i_folder.py index e87b6244a..6b1dded38 100644 --- a/scripts/i2i_folder.py +++ b/scripts/i2i_folder.py @@ -31,7 +31,7 @@ class I2IFolderScript(scripts_manager.Script): ) with gr.Row(): upscale_only = gr.Checkbox( - label="Upscale only (skip inference, apply post-resize directly to inputs)", + label="Upscale only (skip inference, apply post-resize)", value=False, elem_id=self.elem_id("upscale_only"), ) @@ -78,46 +78,46 @@ class I2IFolderScript(scripts_manager.Script): label="Denoising strength (0.0 = use panel)", elem_id=self.elem_id("strength_override"), ) - with gr.Row(): - gr.HTML('Pre-inference resize') + # with gr.Row(): + # gr.HTML('Pre-inference resize') _upscaler_choices = [x.name for x in shared.sd_upscalers] or ["None"] - with gr.Row(): - pre_resize_enabled = gr.Checkbox( - label="Enable pre-inference resize", - value=False, - elem_id=self.elem_id("pre_resize_enabled"), - ) - with gr.Row(): - pre_resize_mode = gr.Dropdown( - label="Resize mode", - choices=shared.resize_modes, - type="index", - value="None", - elem_id=self.elem_id("pre_resize_mode"), - ) - pre_resize_name = gr.Dropdown( - label="Resize method", - choices=_upscaler_choices, - value=_upscaler_choices[0], - elem_id=self.elem_id("pre_resize_name"), - ) - with gr.Row(): - pre_resize_scale = gr.Slider( - minimum=0.25, maximum=4.0, step=0.05, value=1.0, - label="Scale factor (ignored if width/height set)", - elem_id=self.elem_id("pre_resize_scale"), - ) - with gr.Row(): - pre_resize_width = gr.Number( - label="Width (0 = use scale factor)", - value=0, precision=0, - elem_id=self.elem_id("pre_resize_width"), - ) - pre_resize_height = gr.Number( - label="Height (0 = use scale factor)", - value=0, precision=0, - elem_id=self.elem_id("pre_resize_height"), - ) + # with gr.Row(): + # pre_resize_enabled = gr.Checkbox( + # label="Enable pre-inference resize", + # value=False, + # elem_id=self.elem_id("pre_resize_enabled"), + # ) + # with gr.Row(): + # pre_resize_mode = gr.Dropdown( + # label="Resize mode", + # choices=shared.resize_modes, + # type="index", + # value="None", + # elem_id=self.elem_id("pre_resize_mode"), + # ) + # pre_resize_name = gr.Dropdown( + # label="Resize method", + # choices=_upscaler_choices, + # value=_upscaler_choices[0], + # elem_id=self.elem_id("pre_resize_name"), + # ) + # with gr.Row(): + # pre_resize_scale = gr.Slider( + # minimum=0.25, maximum=4.0, step=0.05, value=1.0, + # label="Scale factor (ignored if width/height set)", + # elem_id=self.elem_id("pre_resize_scale"), + # ) + # with gr.Row(): + # pre_resize_width = gr.Number( + # label="Width (0 = use scale factor)", + # value=0, precision=0, + # elem_id=self.elem_id("pre_resize_width"), + # ) + # pre_resize_height = gr.Number( + # label="Height (0 = use scale factor)", + # value=0, precision=0, + # elem_id=self.elem_id("pre_resize_height"), + # ) with gr.Row(): gr.HTML('Post-inference resize') with gr.Row(): @@ -157,9 +157,9 @@ class I2IFolderScript(scripts_manager.Script): value=0, precision=0, elem_id=self.elem_id("resize_height"), ) - return [folder, output_dir, upscale_only, prompt_override, negative_override, seed_override, steps_override, cfg_scale_override, sampler_override, strength_override, pre_resize_enabled, pre_resize_mode, pre_resize_name, pre_resize_scale, pre_resize_width, pre_resize_height, resize_enabled, resize_mode, resize_name, resize_scale, resize_width, resize_height] + return [folder, output_dir, upscale_only, prompt_override, negative_override, seed_override, steps_override, cfg_scale_override, sampler_override, strength_override, resize_enabled, resize_mode, resize_name, resize_scale, resize_width, resize_height] - def run(self, p, folder, output_dir, upscale_only, prompt_override, negative_override, seed_override, steps_override, cfg_scale_override, sampler_override, strength_override, pre_resize_enabled, pre_resize_mode, pre_resize_name, pre_resize_scale, pre_resize_width, pre_resize_height, resize_enabled, resize_mode, resize_name, resize_scale, resize_width, resize_height): # pylint: disable=arguments-differ + def run(self, p, folder, output_dir, upscale_only, prompt_override, negative_override, seed_override, steps_override, cfg_scale_override, sampler_override, strength_override, resize_enabled, resize_mode, resize_name, resize_scale, resize_width, resize_height): # pylint: disable=arguments-differ folder = (folder or "").strip() if not folder or not os.path.isdir(folder): log.error(f"Image folder batch: invalid or missing folder: {folder!r}") @@ -172,9 +172,9 @@ class I2IFolderScript(scripts_manager.Script): out_dir = (output_dir or "").strip() or os.path.join(folder, "output") os.makedirs(out_dir, exist_ok=True) - pre_resize_out_dir = os.path.join(out_dir, "pre-resize") if pre_resize_enabled else None - if pre_resize_out_dir: - os.makedirs(pre_resize_out_dir, exist_ok=True) + # pre_resize_out_dir = os.path.join(out_dir, "pre-resize") if pre_resize_enabled else None + # if pre_resize_out_dir: + # os.makedirs(pre_resize_out_dir, exist_ok=True) resize_out_dir = os.path.join(os.path.dirname(out_dir), "output-resized") if resize_enabled else None if resize_out_dir: os.makedirs(resize_out_dir, exist_ok=True) @@ -224,17 +224,17 @@ class I2IFolderScript(scripts_manager.Script): cp.init_images = [img] cp.width = img.width cp.height = img.height - if pre_resize_enabled and pre_resize_mode != 0 and pre_resize_name not in ('None', '') and shared.sd_upscalers: - pre_w = int(pre_resize_width) if int(pre_resize_width) > 0 else int(img.width * pre_resize_scale) - pre_h = int(pre_resize_height) if int(pre_resize_height) > 0 else int(img.height * pre_resize_scale) - img = images.resize_image(pre_resize_mode, img, pre_w, pre_h, pre_resize_name) - cp.init_images = [img] - cp.width = img.width - cp.height = img.height - log.info(f"Image folder batch: pre-resize to {img.size} mode={shared.resize_modes[pre_resize_mode]!r} method={pre_resize_name!r}") - pre_out_path = os.path.join(pre_resize_out_dir, os.path.basename(filepath)) - img.save(pre_out_path) - log.info(f"Image folder batch: pre-resize saved {pre_out_path!r}") + # if pre_resize_enabled and pre_resize_mode != 0 and pre_resize_name not in ('None', '') and shared.sd_upscalers: + # pre_w = int(pre_resize_width) if int(pre_resize_width) > 0 else int(img.width * pre_resize_scale) + # pre_h = int(pre_resize_height) if int(pre_resize_height) > 0 else int(img.height * pre_resize_scale) + # img = images.resize_image(pre_resize_mode, img, pre_w, pre_h, pre_resize_name) + # cp.init_images = [img] + # cp.width = img.width + # cp.height = img.height + # log.info(f"Image folder batch: pre-resize to {img.size} mode={shared.resize_modes[pre_resize_mode]!r} method={pre_resize_name!r}") + # pre_out_path = os.path.join(pre_resize_out_dir, os.path.basename(filepath)) + # img.save(pre_out_path) + # log.info(f"Image folder batch: pre-resize saved {pre_out_path!r}") if upscale_only: log.info(f"Image folder batch: [{i + 1}/{len(files)}] upscale-only file={os.path.basename(filepath)} size={img.size}") out_img = img From 005eb789a3778e22d9a2aef392a6717b49fc6764 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 28 Mar 2026 18:02:17 +0300 Subject: [PATCH 15/73] SDNQ use combination config for Triton MM --- modules/sdnq/triton_mm.py | 82 +++++++++++++-------------------------- 1 file changed, 27 insertions(+), 55 deletions(-) diff --git a/modules/sdnq/triton_mm.py b/modules/sdnq/triton_mm.py index 987118d09..c29b6234d 100644 --- a/modules/sdnq/triton_mm.py +++ b/modules/sdnq/triton_mm.py @@ -11,58 +11,28 @@ import triton import triton.language as tl -def get_autotune_config(): - if triton.runtime.driver.active.get_current_target().backend == "cuda": - return [ - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=3, num_warps=8), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 32, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 32, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=5, num_warps=2), - triton.Config({"BLOCK_SIZE_M": 32, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=5, num_warps=2), - # - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=3, num_warps=8), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 32, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 256, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=3, num_warps=8), - triton.Config({"BLOCK_SIZE_M": 256, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=4, num_warps=4), - ] - else: - return [ - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=8), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 32, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 32, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=2), - triton.Config({"BLOCK_SIZE_M": 32, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 32, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=2), - # - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=8), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 256, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 64, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 128, "BLOCK_SIZE_N": 32, "BLOCK_SIZE_K": 64, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - triton.Config({"BLOCK_SIZE_M": 256, "BLOCK_SIZE_N": 128, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=8), - triton.Config({"BLOCK_SIZE_M": 256, "BLOCK_SIZE_N": 64, "BLOCK_SIZE_K": 128, "GROUP_SIZE_M": 8}, num_stages=2, num_warps=4), - ] +matmul_configs = [ + triton.Config({'BLOCK_SIZE_M': BM, 'BLOCK_SIZE_N': BN, "BLOCK_SIZE_K": BK, "GROUP_SIZE_M": GM}, num_warps=w, num_stages=s) + for BM in [32, 64, 128, 256] + for BN in [32, 64, 128, 256] + for BK in [32, 64, 128] + for GM in [8, 16] + for w in [8, 16] + for s in [2] +] -@triton.autotune(configs=get_autotune_config(), key=["M", "N", "K", "stride_bk"]) +@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk"]) @triton.jit def int_mm_kernel( a_ptr, b_ptr, c_ptr, - M, N, K, - stride_am, stride_ak, - stride_bk, stride_bn, - stride_cm, stride_cn, - BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, BLOCK_SIZE_K: tl.constexpr, + M: int, N: int, K: int, + stride_am: int, stride_ak: int, + stride_bk: int, stride_bn: int, + stride_cm: int, stride_cn: int, + BLOCK_SIZE_M: tl.constexpr, + BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, ): pid = tl.program_id(axis=0) @@ -105,7 +75,7 @@ def int_mm_kernel( tl.store(c_ptrs, accumulator, mask=c_mask) -def int_mm(a, b): +def int_mm(a: torch.Tensor, b: torch.Tensor) -> torch.Tensor: assert a.shape[1] == b.shape[0], "Incompatible dimensions" assert a.is_contiguous(), "Matrix A must be contiguous" M, K = a.shape @@ -123,15 +93,17 @@ def int_mm(a, b): return c -@triton.autotune(configs=get_autotune_config(), key=["M", "N", "K", "stride_bk"]) +@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk"]) @triton.jit def fp_mm_kernel( a_ptr, b_ptr, c_ptr, - M, N, K, - stride_am, stride_ak, - stride_bk, stride_bn, - stride_cm, stride_cn, - BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, BLOCK_SIZE_K: tl.constexpr, + M: int, N: int, K: int, + stride_am: int, stride_ak: int, + stride_bk: int, stride_bn: int, + stride_cm: int, stride_cn: int, + BLOCK_SIZE_M: tl.constexpr, + BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, GROUP_SIZE_M: tl.constexpr, ): pid = tl.program_id(axis=0) @@ -174,7 +146,7 @@ def fp_mm_kernel( tl.store(c_ptrs, accumulator, mask=c_mask) -def fp_mm(a, b): +def fp_mm(a: torch.FloatTensor, b: torch.FloatTensor) -> torch.FloatTensor: assert a.shape[1] == b.shape[0], "Incompatible dimensions" assert a.is_contiguous(), "Matrix A must be contiguous" M, K = a.shape From 06fe4c7f20f4668cb19913d24e56822ef3a9001e Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sun, 29 Mar 2026 00:44:58 +0300 Subject: [PATCH 16/73] SDNQ cleanup triton_mm --- modules/sdnq/triton_mm.py | 68 ++++++--------------------------------- 1 file changed, 9 insertions(+), 59 deletions(-) diff --git a/modules/sdnq/triton_mm.py b/modules/sdnq/triton_mm.py index c29b6234d..a633a395b 100644 --- a/modules/sdnq/triton_mm.py +++ b/modules/sdnq/triton_mm.py @@ -22,14 +22,15 @@ matmul_configs = [ ] -@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk"]) +@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk", "ACCUMULATOR_DTYPE"]) @triton.jit -def int_mm_kernel( +def triton_mm_kernel( a_ptr, b_ptr, c_ptr, M: int, N: int, K: int, stride_am: int, stride_ak: int, stride_bk: int, stride_bn: int, stride_cm: int, stride_cn: int, + ACCUMULATOR_DTYPE: tl.constexpr, BLOCK_SIZE_M: tl.constexpr, BLOCK_SIZE_N: tl.constexpr, BLOCK_SIZE_K: tl.constexpr, @@ -60,11 +61,11 @@ def int_mm_kernel( a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) - accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.int32) + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=ACCUMULATOR_DTYPE) for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): a = tl.load(a_ptrs, mask=offs_k[None, :] < K - k * BLOCK_SIZE_K, other=0.0) b = tl.load(b_ptrs, mask=offs_k[:, None] < K - k * BLOCK_SIZE_K, other=0.0) - accumulator = tl.dot(a, b, accumulator, out_dtype=tl.int32) + accumulator = tl.dot(a, b, accumulator, out_dtype=ACCUMULATOR_DTYPE) a_ptrs += BLOCK_SIZE_K * stride_ak b_ptrs += BLOCK_SIZE_K * stride_bk @@ -83,69 +84,17 @@ def int_mm(a: torch.Tensor, b: torch.Tensor) -> torch.Tensor: c = torch.empty((M, N), device=a.device, dtype=torch.int32) def grid(META): return (triton.cdiv(M, META["BLOCK_SIZE_M"]) * triton.cdiv(N, META["BLOCK_SIZE_N"]), ) - int_mm_kernel[grid]( + triton_mm_kernel[grid]( a, b, c, M, N, K, a.stride(0), a.stride(1), b.stride(0), b.stride(1), c.stride(0), c.stride(1), + tl.int32, ) return c -@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk"]) -@triton.jit -def fp_mm_kernel( - a_ptr, b_ptr, c_ptr, - M: int, N: int, K: int, - stride_am: int, stride_ak: int, - stride_bk: int, stride_bn: int, - stride_cm: int, stride_cn: int, - BLOCK_SIZE_M: tl.constexpr, - BLOCK_SIZE_N: tl.constexpr, - BLOCK_SIZE_K: tl.constexpr, - GROUP_SIZE_M: tl.constexpr, -): - pid = tl.program_id(axis=0) - num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) - num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) - num_pid_in_group = GROUP_SIZE_M * num_pid_n - group_id = pid // num_pid_in_group - first_pid_m = group_id * GROUP_SIZE_M - group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) - pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m) - pid_n = (pid % num_pid_in_group) // group_size_m - - tl.assume(pid_m >= 0) - tl.assume(pid_n >= 0) - tl.assume(stride_am > 0) - tl.assume(stride_ak > 0) - tl.assume(stride_bn > 0) - tl.assume(stride_bk > 0) - tl.assume(stride_cm > 0) - tl.assume(stride_cn > 0) - - offs_am = (pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M)) % M - offs_bn = (pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N)) % N - offs_k = tl.arange(0, BLOCK_SIZE_K) - a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) - b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn) - - accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) - for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): - a = tl.load(a_ptrs, mask=offs_k[None, :] < K - k * BLOCK_SIZE_K, other=0.0) - b = tl.load(b_ptrs, mask=offs_k[:, None] < K - k * BLOCK_SIZE_K, other=0.0) - accumulator = tl.dot(a, b, accumulator, out_dtype=tl.float32) - a_ptrs += BLOCK_SIZE_K * stride_ak - b_ptrs += BLOCK_SIZE_K * stride_bk - - offs_cm = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) - offs_cn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) - c_ptrs = c_ptr + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :] - c_mask = (offs_cm[:, None] < M) & (offs_cn[None, :] < N) - tl.store(c_ptrs, accumulator, mask=c_mask) - - def fp_mm(a: torch.FloatTensor, b: torch.FloatTensor) -> torch.FloatTensor: assert a.shape[1] == b.shape[0], "Incompatible dimensions" assert a.is_contiguous(), "Matrix A must be contiguous" @@ -154,11 +103,12 @@ def fp_mm(a: torch.FloatTensor, b: torch.FloatTensor) -> torch.FloatTensor: c = torch.empty((M, N), device=a.device, dtype=torch.float32) def grid(META): return (triton.cdiv(M, META["BLOCK_SIZE_M"]) * triton.cdiv(N, META["BLOCK_SIZE_N"]), ) - fp_mm_kernel[grid]( + triton_mm_kernel[grid]( a, b, c, M, N, K, a.stride(0), a.stride(1), b.stride(0), b.stride(1), c.stride(0), c.stride(1), + tl.float32, ) return c From 8ef80744676cbba23f5a3427318d8f37b4c29c52 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 16:57:59 -0700 Subject: [PATCH 17/73] Upgrade to typed NamedTuples --- modules/scripts_manager.py | 23 ++++++++++++++++++++--- scripts/nudenet/imageguard.py | 13 ++++++++++--- scripts/nudenet_ext.py | 23 ++++++++++++----------- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/modules/scripts_manager.py b/modules/scripts_manager.py index e9381f53b..7672c9cf6 100644 --- a/modules/scripts_manager.py +++ b/modules/scripts_manager.py @@ -1,14 +1,19 @@ +from __future__ import annotations + import os import re import sys import time -from collections import namedtuple from dataclasses import dataclass +from typing import TYPE_CHECKING, NamedTuple import gradio as gr from modules import paths, script_callbacks, extensions, script_loading, scripts_postprocessing, errors, timer from modules.logger import log from installer import control_extensions +if TYPE_CHECKING: + from types import ModuleType + AlwaysVisible = object() time_component = {} @@ -211,10 +216,22 @@ def basedir(): return current_basedir -ScriptFile = namedtuple("ScriptFile", ["basedir", "filename", "path", "priority"]) +class ScriptFile(NamedTuple): + basedir: str + filename: str + path: str + priority: str + + +class ScriptClassData(NamedTuple): + script_class: type[Script] | type[scripts_postprocessing.ScriptPostprocessing] + path: str + basedir: str + module: ModuleType + + scripts_data = [] postprocessing_scripts_data = [] -ScriptClassData = namedtuple("ScriptClassData", ["script_class", "path", "basedir", "module"]) def list_scripts(scriptdirname, extension): diff --git a/scripts/nudenet/imageguard.py b/scripts/nudenet/imageguard.py index 068d21133..c92dd43ee 100644 --- a/scripts/nudenet/imageguard.py +++ b/scripts/nudenet/imageguard.py @@ -1,4 +1,11 @@ +from __future__ import annotations + from modules.logger import log +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration + repo_id = 'AIML-TUDA/LlavaGuard-v1.2-0.5B-OV-hf' policy_template = """Provide a safety assessment for the content provided by the user. Determine compliance or violation against our safety policy by reviewing the following policy categories: Hate: @@ -89,11 +96,11 @@ To provide your assessment use the following json template for each category: "rationale": str, }. """ -model = None -processor = None +model: LlavaOnevisionForConditionalGeneration | None = None +processor: AutoProcessor | None = None -def image_guard(image, policy:str | None=None) -> str: +def image_guard(image, policy:str | None=None): global model, processor # pylint: disable=global-statement import json from installer import install diff --git a/scripts/nudenet_ext.py b/scripts/nudenet_ext.py index 3a735ba32..971007cb5 100644 --- a/scripts/nudenet_ext.py +++ b/scripts/nudenet_ext.py @@ -1,6 +1,7 @@ import time import gradio as gr -from modules import scripts, scripts_postprocessing, processing, images +from modules import scripts, processing, images +from modules.scripts_postprocessing import PostprocessedImage, ScriptPostprocessing from scripts.nudenet import nudenet # pylint: disable=no-name-in-module from scripts.nudenet import langdetect # pylint: disable=no-name-in-module from scripts.nudenet import imageguard # pylint: disable=no-name-in-module @@ -49,14 +50,14 @@ def create_ui(accordion=True): # main processing used in both modes def process( - p: processing.StableDiffusionProcessing=None, - pp: scripts.PostprocessImageArgs=None, + p: processing.StableDiffusionProcessing | None = None, + pp: scripts.PostprocessImageArgs | PostprocessedImage | None = None, enabled=True, lang=False, policy=False, banned=False, metadata=True, - copy=False, + copy=False, # Compatability score=0.2, blocks=3, censor=[], @@ -74,7 +75,7 @@ def process( nudes = nudenet.detector.censor(image=pp.image, method=method, min_score=score, censor=censor, blocks=blocks, overlay=overlay) t1 = time.time() if len(nudes.censored) > 0: # Check if there are any censored areas - if not copy: + if p is None: pp.image = nudes.output else: info = processing.create_infotext(p) @@ -85,7 +86,7 @@ def process( if metadata and p is not None: p.extra_generation_params["NudeNet"] = meta p.extra_generation_params["NSFW"] = nsfw - if metadata and hasattr(pp, 'info'): + if metadata and isinstance(pp, PostprocessedImage): pp.info['NudeNet'] = meta pp.info['NSFW'] = nsfw log.debug(f'NudeNet detect: {dct} nsfw={nsfw} time={(t1 - t0):.2f}') @@ -118,7 +119,7 @@ def process( if metadata and p is not None: p.extra_generation_params["Rating"] = res.get('rating', 'N/A') p.extra_generation_params["Category"] = res.get('category', 'N/A') - if metadata and hasattr(pp, 'info'): + if metadata and isinstance(pp, PostprocessedImage): pp.info["Rating"] = res.get('rating', 'N/A') pp.info["Category"] = res.get('category', 'N/A') @@ -131,11 +132,11 @@ class ScriptNudeNet(scripts.Script): def title(self): return 'NudeNet' - def show(self, _is_img2img): + def show(self, *args, **kwargs): return scripts.AlwaysVisible # return signature is array of gradio components - def ui(self, _is_img2img): + def ui(self, *args, **kwargs): return create_ui(accordion=True) # triggered by callback @@ -148,7 +149,7 @@ class ScriptNudeNet(scripts.Script): # defines postprocessing script for dual-mode usage -class ScriptPostprocessingNudeNet(scripts_postprocessing.ScriptPostprocessing): +class ScriptPostprocessingNudeNet(ScriptPostprocessing): name = 'NudeNet' order = 10000 @@ -158,5 +159,5 @@ class ScriptPostprocessingNudeNet(scripts_postprocessing.ScriptPostprocessing): return { 'enabled': enabled, 'lang': lang, 'policy': policy, 'banned': banned, 'metadata': metadata, 'copy': copy, 'score': score, 'blocks': blocks, 'censor': censor, 'method': method, 'overlay': overlay, 'allowed': allowed, 'alphabet': alphabet, 'words': words} # triggered by callback - def process(self, pp: scripts_postprocessing.PostprocessedImage, enabled, lang, policy, banned, metadata, copy, score, blocks, censor, method, overlay, allowed, alphabet, words): # pylint: disable=arguments-differ + def process(self, pp: PostprocessedImage, enabled, lang, policy, banned, metadata, copy, score, blocks, censor, method, overlay, allowed, alphabet, words): # pylint: disable=arguments-differ process(None, pp, enabled, lang, policy, banned, metadata, copy, score, blocks, censor, method, overlay, allowed, alphabet, words) From b2b6fdf9d5f755ee80d53a99a2a718d3426c5d81 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:15:48 -0700 Subject: [PATCH 18/73] Typing updates --- modules/scripts_manager.py | 76 ++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/modules/scripts_manager.py b/modules/scripts_manager.py index 7672c9cf6..8957a2592 100644 --- a/modules/scripts_manager.py +++ b/modules/scripts_manager.py @@ -5,7 +5,7 @@ import re import sys import time from dataclasses import dataclass -from typing import TYPE_CHECKING, NamedTuple +from typing import TYPE_CHECKING, Callable, NamedTuple import gradio as gr from modules import paths, script_callbacks, extensions, script_loading, scripts_postprocessing, errors, timer from modules.logger import log @@ -13,6 +13,10 @@ from installer import control_extensions if TYPE_CHECKING: from types import ModuleType + from modules.api.models import ItemScript + from gradio.blocks import Block + from gradio.components import IOComponent + from modules.processing import Processed, StableDiffusionProcessing AlwaysVisible = object() @@ -33,22 +37,22 @@ class PostprocessBatchListArgs: @dataclass class OnComponent: - component: gr.blocks.Block + component: Block class Script: - parent = None - name = None - filename = None + parent: str | None = None + name: str | None = None + filename: str | None = None args_from = 0 args_to = 0 alwayson = False is_txt2img = False is_img2img = False - api_info = None + api_info: ItemScript | None = None group = None - infotext_fields = None - paste_field_names = None + infotext_fields: list | None = None + paste_field_names: list[str] | None = None section = None standalone = False external = False @@ -62,14 +66,14 @@ class Script: """this function should return the title of the script. This is what will be displayed in the dropdown menu.""" raise NotImplementedError - def ui(self, is_img2img): + def ui(self, is_img2img) -> list[IOComponent]: """this function should create gradio UI elements. See https://gradio.app/docs/#components The return value should be an array of all components that are used in processing. Values of those returned components will be passed to run() and process() functions. """ pass # pylint: disable=unnecessary-pass - def show(self, is_img2img): # pylint: disable=unused-argument + def show(self, is_img2img) -> bool | AlwaysVisible: # pylint: disable=unused-argument """ is_img2img is True if this function is called for the img2img interface, and False otherwise This function should return: @@ -79,7 +83,7 @@ class Script: """ return True - def run(self, p, *args): + def run(self, p: StableDiffusionProcessing, *args): """ This function is called if the script has been selected in the script dropdown. It must do all processing and return the Processed object with results, same as @@ -89,13 +93,13 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def setup(self, p, *args): + def setup(self, p: StableDiffusionProcessing, *args): """For AlwaysVisible scripts, this function is called when the processing object is set up, before any processing starts. args contains all values returned by components from ui(). """ pass # pylint: disable=unnecessary-pass - def before_process(self, p, *args): + def before_process(self, p: StableDiffusionProcessing, *args): """ This function is called very early during processing begins for AlwaysVisible scripts. You can modify the processing object (p) here, inject hooks, etc. @@ -103,7 +107,7 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def process(self, p, *args): + def process(self, p: StableDiffusionProcessing, *args): """ This function is called before processing begins for AlwaysVisible scripts. You can modify the processing object (p) here, inject hooks, etc. @@ -111,7 +115,7 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def process_images(self, p, *args): + def process_images(self, p: StableDiffusionProcessing, *args): """ This function is called instead of main processing for AlwaysVisible scripts. You can modify the processing object (p) here, inject hooks, etc. @@ -119,7 +123,7 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def before_process_batch(self, p, *args, **kwargs): + def before_process_batch(self, p: StableDiffusionProcessing, *args, **kwargs): """ Called before extra networks are parsed from the prompt, so you can add new extra network keywords to the prompt with this callback. @@ -131,7 +135,7 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def process_batch(self, p, *args, **kwargs): + def process_batch(self, p: StableDiffusionProcessing, *args, **kwargs): """ Same as process(), but called for every batch. **kwargs will have those items: @@ -142,7 +146,7 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def postprocess_batch(self, p, *args, **kwargs): + def postprocess_batch(self, p: StableDiffusionProcessing, *args, **kwargs): """ Same as process_batch(), but called for every batch after it has been generated. **kwargs will have same items as process_batch, and also: @@ -151,13 +155,13 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def postprocess_image(self, p, pp: PostprocessImageArgs, *args): + def postprocess_image(self, p: StableDiffusionProcessing, pp: PostprocessImageArgs, *args): """ Called for every image after it has been generated. """ pass # pylint: disable=unnecessary-pass - def postprocess_batch_list(self, p, pp: PostprocessBatchListArgs, *args, **kwargs): + def postprocess_batch_list(self, p: StableDiffusionProcessing, pp: PostprocessBatchListArgs, *args, **kwargs): """ Same as postprocess_batch(), but receives batch images as a list of 3D tensors instead of a 4D tensor. This is useful when you want to update the entire batch instead of individual images. @@ -173,14 +177,14 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def postprocess(self, p, processed, *args): + def postprocess(self, p: StableDiffusionProcessing, processed, *args): """ This function is called after processing ends for AlwaysVisible scripts. args contains all values returned by components from ui() """ pass # pylint: disable=unnecessary-pass - def before_component(self, component, **kwargs): + def before_component(self, component: IOComponent, **kwargs): """ Called before a component is created. Use elem_id/label fields of kwargs to figure out which component it is. @@ -189,7 +193,7 @@ class Script: """ pass # pylint: disable=unnecessary-pass - def after_component(self, component, **kwargs): + def after_component(self, component: IOComponent, **kwargs): """ Called after a component is created. Same as above. """ @@ -199,7 +203,7 @@ class Script: """unused""" return "" - def elem_id(self, item_id): + def elem_id(self, item_id: str): """helper function to generate id for a HTML element, constructs final id out of script name, tab and user-supplied item_id""" title = re.sub(r'[^a-z_0-9]', '', re.sub(r'\s', '_', self.title().lower())) return f'script_{self.parent}_{title}_{item_id}' @@ -234,15 +238,15 @@ scripts_data = [] postprocessing_scripts_data = [] -def list_scripts(scriptdirname, extension): - tmp_list = [] +def list_scripts(scriptdirname: str, extension: str): + tmp_list: list[ScriptFile] = [] base = os.path.join(paths.script_path, scriptdirname) if os.path.exists(base): for filename in sorted(os.listdir(base)): tmp_list.append(ScriptFile(paths.script_path, filename, os.path.join(base, filename), '50')) for ext in extensions.active(): tmp_list += ext.list_files(scriptdirname, extension) - priority_list = [] + priority_list: list[ScriptFile] = [] for script in tmp_list: if os.path.splitext(script.path)[1].lower() == extension and os.path.isfile(script.path): if script.basedir == paths.script_path: @@ -290,7 +294,7 @@ def load_scripts(): scripts_list = sorted(scripts_list, key=lambda item: item.priority + item.path.lower(), reverse=False) syspath = sys.path - def register_scripts_from_module(module, scriptfile): + def register_scripts_from_module(module: ModuleType, scriptfile): for script_class in module.__dict__.values(): if type(script_class) != type: continue @@ -322,7 +326,7 @@ def load_scripts(): return t, time.time()-t0 -def wrap_call(func, filename, funcname, *args, default=None, **kwargs): +def wrap_call(func: Callable, filename: str, funcname, *args, default=None, **kwargs): try: res = func(*args, **kwargs) return res @@ -353,14 +357,14 @@ class ScriptSummary: class ScriptRunner: def __init__(self, name=''): self.name = name - self.scripts = [] - self.selectable_scripts = [] - self.alwayson_scripts = [] - self.auto_processing_scripts = [] + self.scripts: list[Script] = [] + self.selectable_scripts: list[Script] = [] + self.alwayson_scripts: list[Script] = [] + self.auto_processing_scripts: list[ScriptClassData] = [] self.titles = [] self.alwayson_titles = [] self.infotext_fields = [] - self.paste_field_names = [] + self.paste_field_names: list[str] = [] self.script_load_ctr = 0 self.is_img2img = False self.inputs = [None] @@ -574,7 +578,7 @@ class ScriptRunner: self.infotext_fields.extend([(script.group, onload_script_visibility) for script in self.selectable_scripts if script.group is not None]) return inputs - def run(self, p, *args): + def run(self, p: StableDiffusionProcessing, *args) -> Processed | None: s = ScriptSummary('run') script_index = args[0] if len(args) > 0 else 0 if (script_index is None) or (script_index == 0): @@ -599,7 +603,7 @@ class ScriptRunner: s.report() return processed - def after(self, p, processed, *args): + def after(self, p: StableDiffusionProcessing, processed: Processed, *args): s = ScriptSummary('after') script_index = args[0] if len(args) > 0 else 0 if (script_index is None) or (script_index == 0): From 715b1b0699c7199e9379b33a019fd1b9d627c10a Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:30:06 -0700 Subject: [PATCH 19/73] More typing updates --- modules/extensions.py | 12 ++++++------ modules/scripts_manager.py | 38 +++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/modules/extensions.py b/modules/extensions.py index 1f72c23cd..0bdee26e6 100644 --- a/modules/extensions.py +++ b/modules/extensions.py @@ -40,7 +40,7 @@ def ts2utc(timestamp: int) -> datetime: except Exception: return "unknown" -def active(): +def active() -> list[Extension]: if shared.opts.disable_all_extensions == "all": return [] elif shared.opts.disable_all_extensions == "user": @@ -185,12 +185,12 @@ class Extension: log.error(f"Extension: failed reading data from git repo={self.name}: {ex}") self.remote = None - def list_files(self, subdir, extension): - from modules import scripts_manager + def list_files(self, subdir: str, extension: str): + from modules.scripts_manager import ScriptFile dirpath = os.path.join(self.path, subdir) + res: list[ScriptFile] = [] if not os.path.isdir(dirpath): - return [] - res = [] + return res for filename in sorted(os.listdir(dirpath)): if not filename.endswith(".py") and not filename.endswith(".js") and not filename.endswith(".mjs"): continue @@ -198,7 +198,7 @@ class Extension: if os.path.isfile(os.path.join(dirpath, "..", ".priority")): with open(os.path.join(dirpath, "..", ".priority"), encoding="utf-8") as f: priority = str(f.read().strip()) - res.append(scripts_manager.ScriptFile(self.path, filename, os.path.join(dirpath, filename), priority)) + res.append(ScriptFile(self.path, filename, os.path.join(dirpath, filename), priority)) if priority != '50': log.debug(f'Extension priority override: {os.path.dirname(dirpath)}:{priority}') res = [x for x in res if os.path.splitext(x.path)[1].lower() == extension and os.path.isfile(x.path)] diff --git a/modules/scripts_manager.py b/modules/scripts_manager.py index 8957a2592..3e5988ae8 100644 --- a/modules/scripts_manager.py +++ b/modules/scripts_manager.py @@ -271,7 +271,7 @@ def list_scripts(scriptdirname: str, extension: str): return priority_sort -def list_files_with_name(filename): +def list_files_with_name(filename: str): res = [] dirs = [paths.script_path] + [ext.path for ext in extensions.active()] for dirpath in dirs: @@ -326,7 +326,7 @@ def load_scripts(): return t, time.time()-t0 -def wrap_call(func: Callable, filename: str, funcname, *args, default=None, **kwargs): +def wrap_call(func: Callable, filename: str, funcname: str, *args, default=None, **kwargs): try: res = func(*args, **kwargs) return res @@ -336,7 +336,7 @@ def wrap_call(func: Callable, filename: str, funcname, *args, default=None, **kw class ScriptSummary: - def __init__(self, op): + def __init__(self, op: str): self.start = time.time() self.update = time.time() self.op = op @@ -361,13 +361,13 @@ class ScriptRunner: self.selectable_scripts: list[Script] = [] self.alwayson_scripts: list[Script] = [] self.auto_processing_scripts: list[ScriptClassData] = [] - self.titles = [] - self.alwayson_titles = [] - self.infotext_fields = [] + self.titles: list[str] = [] + self.alwayson_titles: list[str] = [] + self.infotext_fields: list[tuple[IOComponent, str]] = [] self.paste_field_names: list[str] = [] self.script_load_ctr = 0 self.is_img2img = False - self.inputs = [None] + self.inputs: list = [None] self.time = 0 def add_script(self, script_class, path, is_img2img, is_control): @@ -621,7 +621,7 @@ class ScriptRunner: s.report() return processed - def before_process(self, p, **kwargs): + def before_process(self, p: StableDiffusionProcessing, **kwargs): s = ScriptSummary('before-process') for script in self.alwayson_scripts: try: @@ -633,7 +633,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def process(self, p, **kwargs): + def process(self, p: StableDiffusionProcessing, **kwargs): s = ScriptSummary('process') for script in self.alwayson_scripts: try: @@ -645,7 +645,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def process_images(self, p, **kwargs): + def process_images(self, p: StableDiffusionProcessing, **kwargs): s = ScriptSummary('process_images') processed = None for script in self.alwayson_scripts: @@ -661,7 +661,7 @@ class ScriptRunner: s.report() return processed - def before_process_batch(self, p, **kwargs): + def before_process_batch(self, p: StableDiffusionProcessing, **kwargs): s = ScriptSummary('before-process-batch') for script in self.alwayson_scripts: try: @@ -673,7 +673,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def process_batch(self, p, **kwargs): + def process_batch(self, p: StableDiffusionProcessing, **kwargs): s = ScriptSummary('process-batch') for script in self.alwayson_scripts: try: @@ -685,7 +685,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def postprocess(self, p, processed): + def postprocess(self, p: StableDiffusionProcessing, processed): s = ScriptSummary('postprocess') for script in self.alwayson_scripts: try: @@ -697,7 +697,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def postprocess_batch(self, p, images, **kwargs): + def postprocess_batch(self, p: StableDiffusionProcessing, images, **kwargs): s = ScriptSummary('postprocess-batch') for script in self.alwayson_scripts: try: @@ -709,7 +709,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def postprocess_batch_list(self, p, pp: PostprocessBatchListArgs, **kwargs): + def postprocess_batch_list(self, p: StableDiffusionProcessing, pp: PostprocessBatchListArgs, **kwargs): s = ScriptSummary('postprocess-batch-list') for script in self.alwayson_scripts: try: @@ -721,7 +721,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def postprocess_image(self, p, pp: PostprocessImageArgs): + def postprocess_image(self, p: StableDiffusionProcessing, pp: PostprocessImageArgs): s = ScriptSummary('postprocess-image') for script in self.alwayson_scripts: try: @@ -733,7 +733,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def before_component(self, component, **kwargs): + def before_component(self, component: IOComponent, **kwargs): s = ScriptSummary('before-component') for script in self.scripts: try: @@ -743,7 +743,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def after_component(self, component, **kwargs): + def after_component(self, component: IOComponent, **kwargs): s = ScriptSummary('after-component') for script in self.scripts: for elem_id, callback in script.on_after_component_elem_id: @@ -759,7 +759,7 @@ class ScriptRunner: s.record(script.title()) s.report() - def reload_sources(self, cache): + def reload_sources(self, cache: dict): s = ScriptSummary('reload-sources') for si, script in list(enumerate(self.scripts)): if hasattr(script, 'args_to') and hasattr(script, 'args_from'): From 7f07d4cb3177f4ca3e97579cce25248e8978ad4e Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:31:37 -0700 Subject: [PATCH 20/73] Update to match actual code logic --- modules/sd_models.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/sd_models.py b/modules/sd_models.py index db1007126..f7b224f9e 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -1418,7 +1418,7 @@ def hf_auth_check(checkpoint_info, force:bool=False): return False -def save_model(name: str, path: str | None = None, shard: str | None = None, overwrite = False): +def save_model(name: str, path: str | None = None, shard: str = "5GB", overwrite = False): if (name is None) or len(name.strip()) == 0: log.error('Save model: invalid model name') return 'Invalid model name' @@ -1432,6 +1432,8 @@ def save_model(name: str, path: str | None = None, shard: str | None = None, ove if os.path.exists(model_name) and not overwrite: log.error(f'Save model: path="{model_name}" exists') return f'Path exists: {model_name}' + if not shard.strip(): + shard = "5GB" # Guard against empty input try: t0 = time.time() save_sdnq_model( From ba362ad3ca69d55bb915455d694edd3c3e3d4416 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:32:23 -0700 Subject: [PATCH 21/73] Type safety --- modules/sd_unet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/sd_unet.py b/modules/sd_unet.py index c18806911..344164cb4 100644 --- a/modules/sd_unet.py +++ b/modules/sd_unet.py @@ -38,8 +38,8 @@ def load_unet_sdxl_nunchaku(repo_id): def load_unet(model, repo_id: str | None = None): global loaded_unet # pylint: disable=global-statement - if ("StableDiffusionXLPipeline" in model.__class__.__name__) and (('stable-diffusion-xl-base' in repo_id) or ('sdxl-turbo' in repo_id)): - if model_quant.check_nunchaku('Model'): + if ("StableDiffusionXLPipeline" in model.__class__.__name__) and repo_id is not None and (("stable-diffusion-xl-base" in repo_id) or ("sdxl-turbo" in repo_id)): + if model_quant.check_nunchaku("Model"): unet = load_unet_sdxl_nunchaku(repo_id) if unet is not None: model.unet = unet From a1b03a383c0655fdce7cb969701379c391c09624 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 19:17:59 -0700 Subject: [PATCH 22/73] Upgrade Grid to typed NamedTuple --- modules/image/grid.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/image/grid.py b/modules/image/grid.py index bfdb7c6cf..225c42b03 100644 --- a/modules/image/grid.py +++ b/modules/image/grid.py @@ -1,12 +1,18 @@ import math -from collections import namedtuple +from typing import NamedTuple import numpy as np from PIL import Image, ImageFont, ImageDraw from modules import shared, script_callbacks from modules.logger import log -Grid = namedtuple("Grid", ["tiles", "tile_w", "tile_h", "image_w", "image_h", "overlap"]) +class Grid(NamedTuple): + tiles: list + tile_w: int + tile_h: int + image_w: int + image_h: int + overlap: int def check_grid_size(imgs): From 8d6ec348b23a43bb0694aa5a95663a959c4fa61d Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 19:18:55 -0700 Subject: [PATCH 23/73] Refactor get_grid_size Type safe, avoids redefining parameter types, and the static type checker is able to parse it easily. --- modules/image/grid.py | 52 ++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/modules/image/grid.py b/modules/image/grid.py index 225c42b03..c08e8cc7b 100644 --- a/modules/image/grid.py +++ b/modules/image/grid.py @@ -32,36 +32,32 @@ def check_grid_size(imgs): return ok -def get_grid_size(imgs, batch_size=1, rows: int | None = None, cols: int | None = None): - if rows and rows > len(imgs): - rows = len(imgs) - if cols and cols > len(imgs): - cols = len(imgs) +def get_grid_size(imgs: list, batch_size=1, rows: int | None = None, cols: int | None = None): + rows_int, cols_int = len(imgs), len(imgs) if rows is None and cols is None: - if shared.opts.n_rows > 0: - rows = shared.opts.n_rows - cols = math.ceil(len(imgs) / rows) - elif shared.opts.n_rows == 0: - rows = batch_size - cols = math.ceil(len(imgs) / rows) - elif shared.opts.n_cols > 0: - cols = shared.opts.n_cols - rows = math.ceil(len(imgs) / cols) - elif shared.opts.n_cols == 0: - cols = batch_size - rows = math.ceil(len(imgs) / cols) + if n_rows := shared.opts.n_rows >= 0: + rows_int: int = batch_size if n_rows == 0 else n_rows + cols_int = math.ceil(len(imgs) / rows_int) + elif n_cols := shared.opts.n_cols >= 0: + cols_int: int = batch_size if n_cols == 0 else n_cols + rows_int = math.ceil(len(imgs) / cols_int) else: - rows = math.floor(math.sqrt(len(imgs))) - while len(imgs) % rows != 0: - rows -= 1 - cols = math.ceil(len(imgs) / rows) - elif rows is not None and cols is None: - cols = math.ceil(len(imgs) / rows) - elif rows is None and cols is not None: - rows = math.ceil(len(imgs) / cols) - else: - pass - return rows, cols + rows_int = math.floor(math.sqrt(len(imgs))) + while len(imgs) % rows_int != 0: + rows_int -= 1 + cols_int = math.ceil(len(imgs) / rows_int) + return rows_int, cols_int + # Set limits + if rows is not None: + rows_int = min(rows, len(imgs)) + if cols is not None: + cols_int = min(cols, len(imgs)) + # Calculate + if rows is None: + rows_int = math.ceil(len(imgs) / cols_int) + if cols is None: + cols_int = math.ceil(len(imgs) / rows_int) + return rows_int, cols_int def image_grid(imgs, batch_size=1, rows: int | None = None, cols: int | None = None): From eeb9b6291bc2fe9ff4cf27c9035eb60579c9df84 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 28 Mar 2026 19:19:37 -0700 Subject: [PATCH 24/73] Update typing + enforce variable not unbound + import sort --- modules/image/grid.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/modules/image/grid.py b/modules/image/grid.py index c08e8cc7b..0a2430142 100644 --- a/modules/image/grid.py +++ b/modules/image/grid.py @@ -1,8 +1,10 @@ import math from typing import NamedTuple + import numpy as np -from PIL import Image, ImageFont, ImageDraw -from modules import shared, script_callbacks +from PIL import Image, ImageDraw, ImageFont + +from modules import script_callbacks, shared from modules.logger import log @@ -15,7 +17,7 @@ class Grid(NamedTuple): overlap: int -def check_grid_size(imgs): +def check_grid_size(imgs: list[Image.Image] | list[list[Image.Image]] | None): if imgs is None or len(imgs) == 0: return False mp = 0 @@ -60,7 +62,7 @@ def get_grid_size(imgs: list, batch_size=1, rows: int | None = None, cols: int | return rows_int, cols_int -def image_grid(imgs, batch_size=1, rows: int | None = None, cols: int | None = None): +def image_grid(imgs: list, batch_size=1, rows: int | None = None, cols: int | None = None): rows, cols = get_grid_size(imgs, batch_size, rows=rows, cols=cols) params = script_callbacks.ImageGridLoopParams(imgs, cols, rows) script_callbacks.image_grid_callback(params) @@ -75,7 +77,7 @@ def image_grid(imgs, batch_size=1, rows: int | None = None, cols: int | None = N return grid -def split_grid(image, tile_w=512, tile_h=512, overlap=64): +def split_grid(image: Image.Image, tile_w=512, tile_h=512, overlap=64): w = image.width h = image.height non_overlap_width = tile_w - overlap @@ -100,7 +102,7 @@ def split_grid(image, tile_w=512, tile_h=512, overlap=64): return grid -def combine_grid(grid): +def combine_grid(grid: Grid): def make_mask_image(r): r = r * 255 / grid.overlap r = r.astype(np.uint8) @@ -129,18 +131,18 @@ class GridAnnotation: def __init__(self, text='', is_active=True): self.text = str(text) self.is_active = is_active - self.size = None + self.size: tuple[int, int] = (10, 10) # Placeholder values -def get_font(fontsize): +def get_font(fontsize: float): try: return ImageFont.truetype(shared.opts.font or "javascript/notosans-nerdfont-regular.ttf", fontsize) except Exception: return ImageFont.truetype("javascript/notosans-nerdfont-regular.ttf", fontsize) -def draw_grid_annotations(im, width, height, x_texts, y_texts, margin=0, title=None): - def wrap(drawing, text, font, line_length): +def draw_grid_annotations(im: Image.Image, width: int, height: int, x_texts: list[list[GridAnnotation]], y_texts: list[list[GridAnnotation]], margin=0, title: list[GridAnnotation] | None = None): + def wrap(drawing: ImageDraw.ImageDraw, text, font, line_length): lines = [''] for word in text.split(): line = f'{lines[-1]} {word}'.strip() @@ -150,7 +152,7 @@ def draw_grid_annotations(im, width, height, x_texts, y_texts, margin=0, title=N lines.append(word) return lines - def draw_texts(drawing: ImageDraw, draw_x, draw_y, lines, initial_fnt, initial_fontsize): + def draw_texts(drawing: ImageDraw.ImageDraw, draw_x: float, draw_y: float, lines, initial_fnt: ImageFont.FreeTypeFont, initial_fontsize: int): for line in lines: font = initial_fnt fontsize = initial_fontsize @@ -187,9 +189,10 @@ def draw_grid_annotations(im, width, height, x_texts, y_texts, margin=0, title=N hor_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing for lines in x_texts] ver_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing * len(lines) for lines in y_texts] pad_top = 0 if sum(hor_text_heights) == 0 else max(hor_text_heights) + line_spacing * 2 + title_text_heights = [] title_pad = 0 if title: - title_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing for lines in title_texts] # pylint: disable=unsubscriptable-object + title_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing for lines in title_texts] title_pad = 0 if sum(title_text_heights) == 0 else max(title_text_heights) + line_spacing * 2 result = Image.new("RGB", (im.width + pad_left + margin * (cols-1), im.height + pad_top + title_pad + margin * (rows-1)), shared.opts.grid_background) for row in range(rows): @@ -212,7 +215,7 @@ def draw_grid_annotations(im, width, height, x_texts, y_texts, margin=0, title=N return result -def draw_prompt_matrix(im, width, height, all_prompts, margin=0): +def draw_prompt_matrix(im: Image.Image, width: int, height: int, all_prompts: list[str], margin=0): prompts = all_prompts[1:] boundary = math.ceil(len(prompts) / 2) prompts_horiz = prompts[:boundary] From 59b9ca50eec6d54f3dfc770d1d938b18c9d8478c Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sun, 29 Mar 2026 01:25:22 -0700 Subject: [PATCH 25/73] Guard against divide by zero and out-of-bounds --- modules/image/grid.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/image/grid.py b/modules/image/grid.py index 0a2430142..4a3f38d6e 100644 --- a/modules/image/grid.py +++ b/modules/image/grid.py @@ -51,9 +51,9 @@ def get_grid_size(imgs: list, batch_size=1, rows: int | None = None, cols: int | return rows_int, cols_int # Set limits if rows is not None: - rows_int = min(rows, len(imgs)) + rows_int = max(min(rows, len(imgs)), 1) if cols is not None: - cols_int = min(cols, len(imgs)) + cols_int = max(min(cols, len(imgs)), 1) # Calculate if rows is None: rows_int = math.ceil(len(imgs) / cols_int) From 95dadab5c3ab38558b2cb62eead594a349c6e6c5 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sun, 29 Mar 2026 02:04:22 -0700 Subject: [PATCH 26/73] Revert import format change Not sure why, but it was causing errors --- scripts/nudenet_ext.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/scripts/nudenet_ext.py b/scripts/nudenet_ext.py index 971007cb5..45208832c 100644 --- a/scripts/nudenet_ext.py +++ b/scripts/nudenet_ext.py @@ -1,7 +1,6 @@ import time import gradio as gr -from modules import scripts, processing, images -from modules.scripts_postprocessing import PostprocessedImage, ScriptPostprocessing +from modules import scripts, scripts_postprocessing, processing, images from scripts.nudenet import nudenet # pylint: disable=no-name-in-module from scripts.nudenet import langdetect # pylint: disable=no-name-in-module from scripts.nudenet import imageguard # pylint: disable=no-name-in-module @@ -51,7 +50,7 @@ def create_ui(accordion=True): # main processing used in both modes def process( p: processing.StableDiffusionProcessing | None = None, - pp: scripts.PostprocessImageArgs | PostprocessedImage | None = None, + pp: scripts.PostprocessImageArgs | scripts_postprocessing.PostprocessedImage | None = None, enabled=True, lang=False, policy=False, @@ -86,7 +85,7 @@ def process( if metadata and p is not None: p.extra_generation_params["NudeNet"] = meta p.extra_generation_params["NSFW"] = nsfw - if metadata and isinstance(pp, PostprocessedImage): + if metadata and isinstance(pp, scripts_postprocessing.PostprocessedImage): pp.info['NudeNet'] = meta pp.info['NSFW'] = nsfw log.debug(f'NudeNet detect: {dct} nsfw={nsfw} time={(t1 - t0):.2f}') @@ -119,7 +118,7 @@ def process( if metadata and p is not None: p.extra_generation_params["Rating"] = res.get('rating', 'N/A') p.extra_generation_params["Category"] = res.get('category', 'N/A') - if metadata and isinstance(pp, PostprocessedImage): + if metadata and isinstance(pp, scripts_postprocessing.PostprocessedImage): pp.info["Rating"] = res.get('rating', 'N/A') pp.info["Category"] = res.get('category', 'N/A') @@ -149,7 +148,7 @@ class ScriptNudeNet(scripts.Script): # defines postprocessing script for dual-mode usage -class ScriptPostprocessingNudeNet(ScriptPostprocessing): +class ScriptPostprocessingNudeNet(scripts_postprocessing.ScriptPostprocessing): name = 'NudeNet' order = 10000 @@ -159,5 +158,5 @@ class ScriptPostprocessingNudeNet(ScriptPostprocessing): return { 'enabled': enabled, 'lang': lang, 'policy': policy, 'banned': banned, 'metadata': metadata, 'copy': copy, 'score': score, 'blocks': blocks, 'censor': censor, 'method': method, 'overlay': overlay, 'allowed': allowed, 'alphabet': alphabet, 'words': words} # triggered by callback - def process(self, pp: PostprocessedImage, enabled, lang, policy, banned, metadata, copy, score, blocks, censor, method, overlay, allowed, alphabet, words): # pylint: disable=arguments-differ + def process(self, pp: scripts_postprocessing.PostprocessedImage, enabled, lang, policy, banned, metadata, copy, score, blocks, censor, method, overlay, allowed, alphabet, words): # pylint: disable=arguments-differ process(None, pp, enabled, lang, policy, banned, metadata, copy, score, blocks, censor, method, overlay, allowed, alphabet, words) From 61e7663eb3fec4b7ff8c0ba26d95a4a2b949bc01 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 30 Mar 2026 09:07:47 +0200 Subject: [PATCH 27/73] update chainner Signed-off-by: vladmandic --- extensions-builtin/sd-extension-chainner | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-builtin/sd-extension-chainner b/extensions-builtin/sd-extension-chainner index b6ddea301..d4eab2166 160000 --- a/extensions-builtin/sd-extension-chainner +++ b/extensions-builtin/sd-extension-chainner @@ -1 +1 @@ -Subproject commit b6ddea3013eef6093d0bf5b605f8628a22213896 +Subproject commit d4eab2166e4d9b52e42924cc942198f9e22eb916 From 849ab8fe1e7814afd432fd06867c8bad597a1228 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 30 Mar 2026 09:58:42 +0200 Subject: [PATCH 28/73] fix loader Signed-off-by: vladmandic --- modules/sd_models.py | 4 ++-- pipelines/model_z_image.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/sd_models.py b/modules/sd_models.py index db1007126..ae9a47cde 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -509,8 +509,8 @@ def load_diffuser_force(detected_model_type, checkpoint_info, diffusers_load_con allow_post_quant = False except Exception as e: log.error(f'Load {op}: path="{checkpoint_info.path}" {e}') - if debug_load: - errors.display(e, 'Load') + # if debug_load: + errors.display(e, 'Load') return None, True if sd_model is not None: return sd_model, True diff --git a/pipelines/model_z_image.py b/pipelines/model_z_image.py index bb12a5608..6f9b8cf76 100644 --- a/pipelines/model_z_image.py +++ b/pipelines/model_z_image.py @@ -30,6 +30,7 @@ def load_z_image(checkpoint_info, diffusers_load_config=None): load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, allow_quant=False) log.debug(f'Load model: type=ZImage repo="{repo_id}" config={diffusers_load_config} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={diffusers_load_config}') + transformer = None if model_quant.check_nunchaku('Model'): # only available model transformer = load_nunchaku() if transformer is None: From a370bfc9870a3e76c1e96233a75fa523a1854ba6 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 30 Mar 2026 10:24:26 +0200 Subject: [PATCH 29/73] handle taesd init failures Signed-off-by: vladmandic --- CHANGELOG.md | 7 ++++--- modules/vae/sd_vae_taesd.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 726aa1a1b..d49c893f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Change Log for SD.Next -## Update for 2026-03-28 +## Update for 2026-03-30 -### Highlights for 2026-03-28 +### Highlights for 2026-03-30 This release brings massive code refactoring to modernize codebase and removal of some obsolete features. Leaner & Faster! And since its a bit quieter period when it comes to new models, notable additions would be : *FireRed-Image-Edit*, *SkyWorks-UniPic-3* and new versions of *Anima-Preview*, *Flux-Klein-KV* @@ -20,7 +20,7 @@ Just how big? Some stats: *~530 commits over 880 files* [ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) | [Sponsor](https://github.com/sponsors/vladmandic) -### Details for 2026-03-28 +### Details for 2026-03-30 - **Models** - [Google Flash 3.1 Image](https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview) a.k.a. *Nano Banana 2* @@ -185,6 +185,7 @@ Just how big? Some stats: *~530 commits over 880 files* - add `lora` support for flux2-klein - fix `lora` change when used with `sdnq` - multiple `sdnq` fixes + - handle `taesd` init errors ## Update for 2026-02-04 diff --git a/modules/vae/sd_vae_taesd.py b/modules/vae/sd_vae_taesd.py index 8e236f0b3..ea0e22972 100644 --- a/modules/vae/sd_vae_taesd.py +++ b/modules/vae/sd_vae_taesd.py @@ -153,9 +153,14 @@ def get_model(model_type = 'decoder', variant = None): def decode(latents): global first_run # pylint: disable=global-statement with lock: - vae, variant = get_model(model_type='decoder') - if vae is None or max(latents.shape) > 256: # safetey check of large tensors - return latents + try: + vae, variant = get_model(model_type='decoder') + if vae is None or max(latents.shape) > 256: # safetey check of large tensors + return latents + except Exception as e: + # from modules import errors + # errors.display(e, 'taesd"') + return warn_once(f'load: {e}') try: with devices.inference_context(): t0 = time.time() From ca2d49497bb0f17fe85ab7e4d6534f730f466fcc Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 30 Mar 2026 11:16:55 +0200 Subject: [PATCH 30/73] ltx test Signed-off-by: vladmandic --- modules/video_models/models_def.py | 60 ++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/modules/video_models/models_def.py b/modules/video_models/models_def.py index 02aa3bec2..d127a57ae 100644 --- a/modules/video_models/models_def.py +++ b/modules/video_models/models_def.py @@ -128,30 +128,82 @@ try: ], 'LTX Video': [ Model(name='None'), - Model(name='LTXVideo 2 19B T2V Dev', + + Model(name='LTXVideo 2.3 T2V', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + Model(name='LTXVideo 2.3 I2V', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + Model(name='LTXVideo 2.3 T2V Distilled', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3-Distilled', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + Model(name='LTXVideo 2.3 I2V Distilled', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3-Distilled', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + + Model(name='LTXVideo 2.3 T2V SDNQ-4Bit', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3-sdnq-dynamic-int4', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + Model(name='LTXVideo 2.3 I2V SDNQ-4Bit', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3-sdnq-dynamic-int4', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + Model(name='LTXVideo 2.3 T2V Distilled SDNQ-4Bit', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3-Distilled-sdnq-dynamic-int4', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + Model(name='LTXVideo 2.3 I2V Distilled SDNQ-4Bit', + url='https://huggingface.co/Lightricks/LTX-2.3', + repo='OzzyGT/LTX-2.3-Distilled-sdnq-dynamic-int4', + repo_cls=getattr(diffusers, 'LTX2Pipeline', None), + te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), + dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + + Model(name='LTXVideo 2.0 19B T2V Dev', url='https://huggingface.co/Lightricks/LTX-2', repo='Lightricks/LTX-2', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2 19B I2V Dev', + Model(name='LTXVideo 2.0 19B I2V Dev', url='https://huggingface.co/Lightricks/LTX-2', repo='Lightricks/LTX-2', repo_cls=getattr(diffusers, 'LTX2ImageToVideoPipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2 19B T2V Dev SDNQ', + Model(name='LTXVideo 2.0 19B T2V Dev SDNQ-4Bit', url='https://huggingface.co/Disty0/LTX-2-SDNQ-4bit-dynamic', repo='Disty0/LTX-2-SDNQ-4bit-dynamic', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2 19B I2V Dev SDNQ', + Model(name='LTXVideo 2.0 19B I2V Dev SDNQ-4Bit', url='https://huggingface.co/Disty0/LTX-2-SDNQ-4bit-dynamic', repo='Disty0/LTX-2-SDNQ-4bit-dynamic', repo_cls=getattr(diffusers, 'LTX2ImageToVideoPipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), + Model(name='LTXVideo 0.9.8 13B Distilled', url='https://huggingface.co/Lightricks/LTX-Video-0.9.8-13B-distilled', repo='Lightricks/LTX-Video-0.9.8-13B-distilled', From ec1341348b71061f61612ed7c189ce2aae580e5a Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 30 Mar 2026 12:19:36 +0200 Subject: [PATCH 31/73] update todo/changelog Signed-off-by: vladmandic --- CHANGELOG.md | 13 ++++++++++--- TODO.md | 4 ++-- modules/api/validate.py | 11 ++++++----- modules/video_models/models_def.py | 16 ++++++++-------- wiki | 2 +- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d49c893f1..f8703a9d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,16 +5,15 @@ ### Highlights for 2026-03-30 This release brings massive code refactoring to modernize codebase and removal of some obsolete features. Leaner & Faster! -And since its a bit quieter period when it comes to new models, notable additions would be : *FireRed-Image-Edit*, *SkyWorks-UniPic-3* and new versions of *Anima-Preview*, *Flux-Klein-KV* +And since its a bit quieter period when it comes to new models, notable additions would be : *FireRed-Image-Edit*, *SkyWorks-UniPic-3* and new versions of *Anima-Preview*, *Flux-Klein-KV* image models and *LTX 2.3* video model -If you're on Windows platform, we have a brand new [All-in-one Installer & Launcher](https://github.com/vladmandic/sdnext-launcher): simply download [exe or zip](https://github.com/vladmandic/sdnext-launcher/releases) and done! +If you're on Windows platform, we have a brand new [All-in-one Installer & Launcher](https://github.com/vladmandic/sdnext-launcher): simply download [exe or zip](https://github.com/vladmandic/sdnext-launcher/releases) and done! *What else*? Really a lot! New color grading module, updated localization with new languages and improved translations, new civitai integration module, new finetunes loader, several new upscalers, improvements to LLM/VLM in captioning and prompt enhance, a lot of new control preprocessors, new realtime server info panel, some new UI themes And major work on API hardening: security, rate limits, secrets handling, new endpoints, etc. But also many smaller quality-of-life improvements - for full details, see [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) - *Note*: Purely due to size of changes, clean install is recommended! Just how big? Some stats: *~530 commits over 880 files* @@ -30,6 +29,8 @@ Just how big? Some stats: *~530 commits over 880 files* *Note*: UniPic-3 is a fine-tune of Qwen-Image-Edit with new distillation regardless of its claim of major changes - [Anima Preview-v2](https://huggingface.co/circlestone-labs/Anima) - [FLUX.2-Klein-KV](https://huggingface.co/black-forest-labs/FLUX.2-klein-9b-kv), thanks @liutyi + - [LTX-Video 2.3](https://huggingface.co/Lightricks/LTX-2.3) in *Full and Distilled* variants and in both original *FP16 and SDNQ-4bit* quantiztion + *note* ltx-2.3 is a massive 22B parameters and full model is very large (72GB) so use of pre-quantized variant (32GB) is highly recommended - **Image manipulation** - new **Color grading** module apply basic corrections to your images: brightness,contrast,saturation,shadows,highlights @@ -77,6 +78,9 @@ Just how big? Some stats: *~530 commits over 880 files* - *note* **Cuda** `torch==2.10` removed support for `rtx1000` series and older GPUs use following before first startup to force installation of `torch==2.9.1` with `cuda==12.6`: > `set TORCH_COMMAND='torch==2.9.1 torchvision==0.24.1 torchaudio==2.9.1 --index-url https://download.pytorch.org/whl/cu126'` + - *note* **Cuda** `cuda==13.0` requires newer nVidia drivers + use following before first startup to force installation of `torch==2.11.0` with `cuda==12.68`: + > `set TORCH_COMMAND='torch torchvision --index-url https://download.pytorch.org/whl/cu128` - update installer and support `nunchaku==1.2.1` - **UI** - legacy panels **T2I** and **I2I** are disabled by default @@ -95,6 +99,9 @@ Just how big? Some stats: *~530 commits over 880 files* - **Themes** add *Vlad-Neomorph* - **Gallery** add option to auto-refresh gallery, thanks @awsr - **Token counters** add per-section display for supported models, thanks @awsr +- **Docs / Wiki** + - updates to to compute sections: *AMD-ROCm, AMD-MIOpen, ZLUDA, OpenVINO, nVidia* + - updates to core sections: *Installation, Python, Schedulers, Launcher, SDNQ, Video* - **API** - **rate limiting**: global for all endpoints, guards against abuse and denial-of-service type of attacks configurable in *settings -> server settings* diff --git a/TODO.md b/TODO.md index 5e2974746..746ffacdd 100644 --- a/TODO.md +++ b/TODO.md @@ -2,7 +2,6 @@ ## Release -- Implement: `unload_auxiliary_models` - Add notes: **Enso** - Tips: **Color Grading** - Regen: **Localization** @@ -10,7 +9,7 @@ ## Internal -- Integrate: [Depth3D](https://github.com/vladmandic/sd-extension-depth3d) +- Feature: implement `unload_auxiliary_models` - Feature: RIFE update - Feature: RIFE in processing - Feature: SeedVR2 in processing @@ -30,6 +29,7 @@ - Refactor: Unify *huggingface* and *diffusers* model folders - Refactor: [GGUF](https://huggingface.co/docs/diffusers/main/en/quantization/gguf) - Reimplement `llama` remover for Kanvas +- Integrate: [Depth3D](https://github.com/vladmandic/sd-extension-depth3d) ## OnHold diff --git a/modules/api/validate.py b/modules/api/validate.py index 2924ed542..29e3c1148 100644 --- a/modules/api/validate.py +++ b/modules/api/validate.py @@ -22,12 +22,13 @@ log_cost = { "/internal/progress": -1, "/sdapi/v1/version": -1, "/sdapi/v1/log": -1, - "/sdapi/v1/torch": 60, - "/sdapi/v1/gpu": 60, + "/sdapi/v1/torch": -1, + "/sdapi/v1/gpu": -1, + "/sdapi/v1/memory": -1, + "/sdapi/v1/platform": -1, + "/sdapi/v1/checkpoint": -1, "/sdapi/v1/status": 60, - "/sdapi/v1/memory": 60, - "/sdapi/v1/platform": 60, - "/sdapi/v1/checkpoint": 60, + "/sdapi/v1/progress": 60, } log_exclude_suffix = ['.css', '.js', '.ico', '.svg'] log_exclude_prefix = ['/assets'] diff --git a/modules/video_models/models_def.py b/modules/video_models/models_def.py index d127a57ae..67ad57d3f 100644 --- a/modules/video_models/models_def.py +++ b/modules/video_models/models_def.py @@ -129,50 +129,50 @@ try: 'LTX Video': [ Model(name='None'), - Model(name='LTXVideo 2.3 T2V', + Model(name='LTXVideo 2.3 22B T2V', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2.3 I2V', + Model(name='LTXVideo 2.3 22B I2V', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2.3 T2V Distilled', + Model(name='LTXVideo 2.3 22B T2V Distilled', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3-Distilled', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2.3 I2V Distilled', + Model(name='LTXVideo 2.3 22B I2V Distilled', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3-Distilled', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2.3 T2V SDNQ-4Bit', + Model(name='LTXVideo 2.3 22B T2V SDNQ-4Bit', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3-sdnq-dynamic-int4', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2.3 I2V SDNQ-4Bit', + Model(name='LTXVideo 2.3 22B I2V SDNQ-4Bit', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3-sdnq-dynamic-int4', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2.3 T2V Distilled SDNQ-4Bit', + Model(name='LTXVideo 2.3 22B T2V Distilled SDNQ-4Bit', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3-Distilled-sdnq-dynamic-int4', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), te_cls=getattr(transformers, 'Gemma3ForConditionalGeneration', None), dit_cls=getattr(diffusers, 'LTX2VideoTransformer3DModel', None)), - Model(name='LTXVideo 2.3 I2V Distilled SDNQ-4Bit', + Model(name='LTXVideo 2.3 22B I2V Distilled SDNQ-4Bit', url='https://huggingface.co/Lightricks/LTX-2.3', repo='OzzyGT/LTX-2.3-Distilled-sdnq-dynamic-int4', repo_cls=getattr(diffusers, 'LTX2Pipeline', None), diff --git a/wiki b/wiki index 7abb07dc9..3dde18b34 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 7abb07dc95bdb2c1869e2901213f5c82b46905c3 +Subproject commit 3dde18b34e2cd61c800cdd748ada69cede612296 From 3dd09fde08c81fdebf39af2172433e4afe356d13 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Mon, 30 Mar 2026 20:08:50 -0700 Subject: [PATCH 32/73] Syntax change --- modules/image/grid.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/image/grid.py b/modules/image/grid.py index 4a3f38d6e..cca8056d6 100644 --- a/modules/image/grid.py +++ b/modules/image/grid.py @@ -37,10 +37,11 @@ def check_grid_size(imgs: list[Image.Image] | list[list[Image.Image]] | None): def get_grid_size(imgs: list, batch_size=1, rows: int | None = None, cols: int | None = None): rows_int, cols_int = len(imgs), len(imgs) if rows is None and cols is None: - if n_rows := shared.opts.n_rows >= 0: + n_rows, n_cols = shared.opts.n_rows, shared.opts.n_cols + if n_rows >= 0: rows_int: int = batch_size if n_rows == 0 else n_rows cols_int = math.ceil(len(imgs) / rows_int) - elif n_cols := shared.opts.n_cols >= 0: + elif n_cols >= 0: cols_int: int = batch_size if n_cols == 0 else n_cols rows_int = math.ceil(len(imgs) / cols_int) else: From 61c10d6591afd6432dea2742c14358dd53457a94 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Tue, 31 Mar 2026 16:34:28 +0200 Subject: [PATCH 33/73] update diffusers and transformers Signed-off-by: vladmandic --- extensions-builtin/sd-extension-system-info | 2 +- extensions-builtin/sdnext-kanvas | 2 +- installer.py | 4 +-- modules/image/save.py | 29 ++++++++++++++++----- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info index 88d2f12b1..006f08f49 160000 --- a/extensions-builtin/sd-extension-system-info +++ b/extensions-builtin/sd-extension-system-info @@ -1 +1 @@ -Subproject commit 88d2f12b1f2015894224ed7f8f4d3a10c1fa514e +Subproject commit 006f08f499bbe69c484f0f1cc332bbf0e75526c2 diff --git a/extensions-builtin/sdnext-kanvas b/extensions-builtin/sdnext-kanvas index d15b31206..1e840033b 160000 --- a/extensions-builtin/sdnext-kanvas +++ b/extensions-builtin/sdnext-kanvas @@ -1 +1 @@ -Subproject commit d15b31206a581e49d0e8b70b375587c046e7f53f +Subproject commit 1e840033b040d8915ddfb5dbf62c80f411bcec0a diff --git a/installer.py b/installer.py index 77193d0de..71cd3207a 100644 --- a/installer.py +++ b/installer.py @@ -478,7 +478,7 @@ def check_diffusers(): t_start = time.time() if args.skip_all: return - target_commit = "85ffcf1db23c0e981215416abd8e8a748bfd86b6" # diffusers commit hash == 0.37.1.dev-0326 + target_commit = "0325ca4c5938a7e300f3e3b9ee7ec85f52d01bb5" # diffusers commit hash == 0.37.1.dev-0331 # if args.use_rocm or args.use_zluda or args.use_directml: # sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now pkg = package_spec('diffusers') @@ -507,7 +507,7 @@ def check_transformers(): pkg_tokenizers = package_spec('tokenizers') # target_commit = '753d61104116eefc8ffc977327b441ee0c8d599f' # transformers commit hash == 4.57.6 # target_commit = "aad13b87ed59f2afcfaebc985f403301887a35fc" # transformers commit hash == 5.3.0 - target_commit = "c9faacd7d57459157656bdffe049dabb6293f011" # transformers commit hash == 5.3.0.dev-0326 + target_commit = "2dba8e0495974930af02274d75bd182d22cc1686" # transformers commit hash == 5.3.0.dev-0331 if args.use_directml: target_transformers = '4.52.4' target_tokenizers = '0.21.4' diff --git a/modules/image/save.py b/modules/image/save.py index 79e3ca44f..28e64f488 100644 --- a/modules/image/save.py +++ b/modules/image/save.py @@ -61,38 +61,53 @@ def atomically_save_image(): log.warning(f'Save failed: description={filename_txt} {e}') # actual save + exifinfo_dump = piexif.helper.UserComment.dump(exifinfo, encoding="unicode") if image_format == 'PNG': pnginfo_data = PngImagePlugin.PngInfo() for k, v in params.pnginfo.items(): pnginfo_data.add_text(k, str(v)) debug_save(f'Save pnginfo: {params.pnginfo.items()}') - save_args = { 'compress_level': 6, 'pnginfo': pnginfo_data if shared.opts.image_metadata else None } + save_args = { + 'compress_level': 6, + 'pnginfo': pnginfo_data if shared.opts.image_metadata else None, + } elif image_format == 'JPEG': if image.mode == 'RGBA': log.warning('Save: removing alpha channel') image = image.convert("RGB") elif image.mode == 'I;16': image = image.point(lambda p: p * 0.0038910505836576).convert("L") - save_args = { 'optimize': True, 'quality': shared.opts.jpeg_quality } + save_args = { + 'optimize': True, + 'quality': shared.opts.jpeg_quality, + } if shared.opts.image_metadata: debug_save(f'Save exif: {exifinfo}') - save_args['exif'] = piexif.dump({ "Exif": { piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(exifinfo, encoding="unicode") } }) + save_args['exif'] = piexif.dump({ "Exif": { piexif.ExifIFD.UserComment: exifinfo_dump } }) elif image_format == 'WEBP': if image.mode == 'I;16': image = image.point(lambda p: p * 0.0038910505836576).convert("RGB") - save_args = { 'optimize': True, 'quality': shared.opts.jpeg_quality, 'lossless': shared.opts.webp_lossless } + save_args = { + 'optimize': True, + 'quality': shared.opts.jpeg_quality, + 'lossless': shared.opts.webp_lossless, + } if shared.opts.image_metadata: debug_save(f'Save exif: {exifinfo}') - save_args['exif'] = piexif.dump({ "Exif": { piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(exifinfo, encoding="unicode") } }) + save_args['exif'] = piexif.dump({ "Exif": { piexif.ExifIFD.UserComment: exifinfo_dump } }) elif image_format == 'JXL': if image.mode == 'I;16': image = image.point(lambda p: p * 0.0038910505836576).convert("RGB") elif image.mode not in {"RGB", "RGBA"}: image = image.convert("RGBA") - save_args = { 'optimize': True, 'quality': shared.opts.jpeg_quality, 'lossless': shared.opts.webp_lossless } + save_args = { + 'optimize': True, + 'quality': shared.opts.jpeg_quality, + 'lossless': shared.opts.webp_lossless, + } if shared.opts.image_metadata: debug_save(f'Save exif: {exifinfo}') - save_args['exif'] = piexif.dump({ "Exif": { piexif.ExifIFD.UserComment: piexif.helper.UserComment.dump(exifinfo, encoding="unicode") } }) + save_args['exif'] = piexif.dump({ "Exif": { piexif.ExifIFD.UserComment: exifinfo_dump } }) else: save_args = { 'quality': shared.opts.jpeg_quality } try: From 75cc035354de0ef01b76a8b69f77b7ba78925507 Mon Sep 17 00:00:00 2001 From: CalamitousFelicitousness Date: Wed, 1 Apr 2026 03:13:12 +0200 Subject: [PATCH 34/73] add Enso to changelog and wiki, add colour grading hints Add Enso entries to UI and API sections of the changelog. Add colour grading parameter hints to locale_en.json. Update wiki submodule with new Enso page and Home link. --- CHANGELOG.md | 14 +++++++++++--- html/locale_en.json | 40 ++++++++++++++++++++-------------------- wiki | 2 +- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8703a9d9..b35666826 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,7 +83,11 @@ Just how big? Some stats: *~530 commits over 880 files* > `set TORCH_COMMAND='torch torchvision --index-url https://download.pytorch.org/whl/cu128` - update installer and support `nunchaku==1.2.1` - **UI** - - legacy panels **T2I** and **I2I** are disabled by default + - **Enso** new React-based UI with WYSIWYG infinite canvas workspace, command palette, and numerous quality of life improvements across the board *(work-in-progress alpha)*. + enable using `--enso` flag, and use on `/enso` endpoint. + **Separate installation of SD.Next recommended** + see wiki page and Enso repo README for details. + - legacy panels **T2I** and **I2I** are disabled by default you can re-enable them in *settings -> ui -> hide legacy tabs* - new panel: **Server Info** with detailed runtime informaton - rename **Scripts** to **Extras** and reorganize to split internal functionality vs external extensions @@ -99,11 +103,15 @@ Just how big? Some stats: *~530 commits over 880 files* - **Themes** add *Vlad-Neomorph* - **Gallery** add option to auto-refresh gallery, thanks @awsr - **Token counters** add per-section display for supported models, thanks @awsr + - **Colour grading** add hints for all the functions - **Docs / Wiki** - updates to to compute sections: *AMD-ROCm, AMD-MIOpen, ZLUDA, OpenVINO, nVidia* - - updates to core sections: *Installation, Python, Schedulers, Launcher, SDNQ, Video* + - updates to core sections: *Installation, Python, Schedulers, Launcher, SDNQ, Video* + - added Enso page - **API** - - **rate limiting**: global for all endpoints, guards against abuse and denial-of-service type of attacks + - new **v2 API** (`/sdapi/v2/`): job-based generation with queue, per-job WebSocket progress, file uploads with TTL, model/network enumeration, and a plethora of other improvements *(work-in-progress)* + for the time being ships with Enso, which must be enabled wih `--enso` flag on startup for v2 API to be available. + - **rate limiting**: global for all endpoints, guards against abuse and denial-of-service type of attacks configurable in *settings -> server settings* - new `/sdapi/v1/upload` endpoint with support for both POST with form-data or PUT using raw-bytes - new `/sdapi/v1/torch` endpoint for torch info (backend, version, etc.) diff --git a/html/locale_en.json b/html/locale_en.json index 6c6c2a662..88a3d6203 100644 --- a/html/locale_en.json +++ b/html/locale_en.json @@ -161,7 +161,7 @@ {"id":"","label":"Batch size","localized":"","hint":"How many image to create in a single batch (increases generation performance at cost of higher VRAM usage)","ui":"txt2img"}, {"id":"","label":"Beta schedule","localized":"","hint":"Defines how beta (noise strength per step) grows. Options:
- default: the model default
- linear: evenly decays noise per step
- scaled: squared version of linear, used only by Stable Diffusion
- cosine: smoother decay, often better results with fewer steps
- sigmoid: sharp transition, experimental","ui":"txt2img"}, {"id":"","label":"Base shift","localized":"","hint":"Minimum shift value for low resolutions when using dynamic shifting.","ui":"txt2img"}, - {"id":"","label":"Brightness","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Brightness","localized":"","hint":"Adjusts overall image brightness.
Positive values lighten the image, negative values darken it.

Applied uniformly across all pixels in linear space.","ui":"txt2img"}, {"id":"","label":"Block","localized":"","hint":"","ui":"script_kohya_hires_fix"}, {"id":"","label":"Block size","localized":"","hint":"","ui":"script_nudenet"}, {"id":"","label":"Banned words","localized":"","hint":"","ui":"script_nudenet"}, @@ -224,7 +224,7 @@ {"id":"change_vae","label":"Change VAE","localized":"","hint":""}, {"id":"change_unet","label":"Change UNet","localized":"","hint":""}, {"id":"change_reference","label":"Change reference","localized":"","hint":""}, - {"id":"","label":"Color Grading","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Color Grading","localized":"","hint":"Post-generation color adjustments, applied per-image after generation and before mask overlay.","ui":"txt2img"}, {"id":"","label":"Control Methods","localized":"","hint":"","ui":"control"}, {"id":"","label":"Control Media","localized":"","hint":"Add input image as separate initialization image for control processing","ui":"control"}, {"id":"","label":"Create Video","localized":"","hint":"","ui":"extras"}, @@ -238,10 +238,10 @@ {"id":"","label":"Client log","localized":"","hint":""}, {"id":"","label":"CLIP Analysis","localized":"","hint":"","ui":"caption"}, {"id":"","label":"Context","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Contrast","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Color temp","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"CLAHE clip","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"CLAHE grid","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Contrast","localized":"","hint":"Adjusts the difference between light and dark areas.
Positive values increase contrast, making darks darker and lights brighter.
Negative values flatten the tonal range toward a more uniform appearance.","ui":"txt2img"}, + {"id":"","label":"Color temp","localized":"","hint":"Shifts color temperature in Kelvin.
Lower values (e.g., 2000K) produce a warm, amber tone. Higher values (e.g., 12000K) produce a cool, bluish tone.

Default 6500K is neutral daylight. Works by scaling R/G/B channels to simulate the target white point.","ui":"txt2img"}, + {"id":"","label":"CLAHE clip","localized":"","hint":"Clip limit for Contrast Limited Adaptive Histogram Equalization.
Higher values allow more local contrast enhancement, which brings out detail in flat regions.

Set to 0 to disable. Typical values are 1.0–3.0. Very high values can introduce noise amplification.","ui":"txt2img"}, + {"id":"","label":"CLAHE grid","localized":"","hint":"Grid size for CLAHE tile regions.
Smaller grids (e.g., 2–4) produce coarser, more global equalization.
Larger grids (e.g., 12–16) enhance finer local detail but may amplify noise.

Default is 8. Only active when CLAHE clip is above 0.","ui":"txt2img"}, {"id":"","label":"Correction mode","localized":"","hint":"","ui":"txt2img"}, {"id":"","label":"Crop to portrait","localized":"","hint":"Crop input image to portrait-only before using it as IP adapter input","ui":"txt2img"}, {"id":"","label":"Concept Tokens","localized":"","hint":"","ui":"script_consistory"}, @@ -619,8 +619,8 @@ {"id":"","label":"Guidance scale","localized":"","hint":"Classifier Free Guidance scale: how strongly the image should conform to prompt. Lower values produce more creative results, higher values make it follow the prompt more strictly; recommended values between 5-10","ui":"txt2img"}, {"id":"","label":"Guidance end","localized":"","hint":"Ends the effect of CFG and PAG early: A value of 1 acts as normal, 0.5 stops guidance at 50% of steps","ui":"txt2img"}, {"id":"","label":"Guidance rescale","localized":"","hint":"Rescale guidance to avoid overexposed images at higher guidance values","ui":"txt2img"}, - {"id":"","label":"Gamma","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Grain","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Gamma","localized":"","hint":"Non-linear brightness curve adjustment.
Values below 1.0 brighten midtones and shadows while preserving highlights.
Values above 1.0 darken midtones and shadows.

Default is 1.0 (no change). Unlike brightness, gamma reshapes the tonal curve rather than shifting it uniformly.","ui":"txt2img"}, + {"id":"","label":"Grain","localized":"","hint":"Adds film-like noise to the image.
Higher values produce more visible grain, simulating analog film texture.

Applied as random noise blended into the final image. Set to 0 to disable.","ui":"txt2img"}, {"id":"","label":"Grid margins","localized":"","hint":"","ui":"script_prompt_matrix"}, {"id":"","label":"Grid sections","localized":"","hint":"","ui":"script_regional_prompting"}, {"id":"","label":"Guidance strength","localized":"","hint":"","ui":"script_slg"}, @@ -657,9 +657,9 @@ {"id":"","label":"HiDiffusion","localized":"","hint":"HiDiffusion allows creation of high-resolution images using your standard models without duplicates/distortions and improved performance","ui":"settings_advanced"}, {"id":"","label":"Height","localized":"","hint":"Image height","ui":"txt2img"}, {"id":"","label":"HiRes steps","localized":"","hint":"Number of sampling steps for upscaled picture. If 0, uses same as for original","ui":"txt2img"}, - {"id":"","label":"Hue","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Highlights","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Highlights tint","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Hue","localized":"","hint":"Rotates all colors around the color wheel.
Small values produce subtle color shifts, while higher values cycle through the full spectrum.

Useful for creative color effects or correcting unwanted color casts.","ui":"txt2img"}, + {"id":"","label":"Highlights","localized":"","hint":"Adjusts the brightness of highlight (bright) regions.
Positive values brighten highlights, negative values pull them down.

Operates on the L channel in Lab color space using a luminance-weighted mask, leaving shadows and midtones largely unaffected.","ui":"txt2img"}, + {"id":"","label":"Highlights tint","localized":"","hint":"Color to blend into highlight regions for split toning.
Works together with Shadows tint and Split tone balance to create cinematic color grading looks.

Default white (#ffffff) applies no tint.","ui":"txt2img"}, {"id":"","label":"HDR range","localized":"","hint":"","ui":"script_hdr"}, {"id":"","label":"HQ init latents","localized":"","hint":"","ui":"script_instantir"}, {"id":"","label":"Height after","localized":"","hint":"","ui":"control"}, @@ -782,7 +782,7 @@ {"id":"","label":"Log Display","localized":"","hint":"","ui":"settings_ui"}, {"id":"","label":"List all locally available models","localized":"","hint":"","ui":"models_list_tab"}, {"id":"","label":"Last Generate","localized":"","hint":""}, - {"id":"","label":"LUT","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"LUT","localized":"","hint":"Look-Up Table color grading section.
Upload a .cube LUT file to apply professional color grading presets.

LUTs remap colors according to a predefined 3D color transform, commonly used in film and photography for consistent color looks.","ui":"txt2img"}, {"id":"","label":"low order","localized":"","hint":"","ui":"txt2img"}, {"id":"","label":"LSC layer indices","localized":"","hint":"","ui":"txt2img"}, {"id":"","label":"LSC fully qualified name","localized":"","hint":"","ui":"txt2img"}, @@ -790,7 +790,7 @@ {"id":"","label":"LSC skip feed-forward blocks","localized":"","hint":"","ui":"txt2img"}, {"id":"","label":"LSC skip attention scores","localized":"","hint":"","ui":"txt2img"}, {"id":"","label":"LSC dropout rate","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"LUT strength","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"LUT strength","localized":"","hint":"Controls the intensity of the applied LUT.
1.0 applies the LUT at full strength. Values below 1.0 blend toward the original colors, values above 1.0 amplify the effect.

Only active when a .cube LUT file is loaded.","ui":"txt2img"}, {"id":"","label":"Latent brightness","localized":"","hint":"Increase or deacrease brightness directly in latent space during generation","ui":"txt2img"}, {"id":"","label":"Latent sharpen","localized":"","hint":"Increase or decrease sharpness directly in latent space during generation","ui":"txt2img"}, {"id":"","label":"Latent color","localized":"","hint":"Adjust the color balance directly in latent space during generation","ui":"txt2img"}, @@ -888,7 +888,7 @@ {"id":"","label":"Max overlap","localized":"","hint":"Maximum overlap between two detected items before one is discarded","ui":"txt2img"}, {"id":"","label":"Min size","localized":"","hint":"Minimum size of detected object as percentage of overal image","ui":"txt2img"}, {"id":"","label":"Max size","localized":"","hint":"Maximum size of detected object as percentage of overal image","ui":"txt2img"}, - {"id":"","label":"Midtones","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Midtones","localized":"","hint":"Adjusts the brightness of midtone regions.
Positive values brighten midtones, negative values darken them.

Targets pixels near the middle of the luminance range using a bell-shaped mask in Lab space, leaving shadows and highlights largely untouched.","ui":"txt2img"}, {"id":"","label":"Momentum","localized":"","hint":"","ui":"script_apg"}, {"id":"","label":"Mode x-axis","localized":"","hint":"","ui":"script_asymmetric_tiling"}, {"id":"","label":"Mode y-axis","localized":"","hint":"","ui":"script_asymmetric_tiling"}, @@ -1310,11 +1310,11 @@ {"id":"","label":"SEG config","localized":"","hint":"","ui":"txt2img"}, {"id":"","label":"Strength","localized":"","hint":"Denoising strength of during image operation controls how much of original image is allowed to change during generate","ui":"txt2img"}, {"id":"","label":"Sort detections","localized":"","hint":"Sort detected areas by from left to right instead of detection score","ui":"txt2img"}, - {"id":"","label":"Saturation","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Sharpness","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Shadows","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Shadows tint","localized":"","hint":"","ui":"txt2img"}, - {"id":"","label":"Split tone balance","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Saturation","localized":"","hint":"Controls color intensity.
Positive values make colors more vivid, negative values desaturate toward grayscale.

At -1.0 the image becomes fully monochrome.","ui":"txt2img"}, + {"id":"","label":"Sharpness","localized":"","hint":"Enhances edge detail and fine textures.
Higher values produce crisper edges but may amplify noise or artifacts if pushed too far.

Set to 0 to disable. Operates via an unsharp mask kernel.","ui":"txt2img"}, + {"id":"","label":"Shadows","localized":"","hint":"Adjusts the brightness of shadow (dark) regions.
Positive values lift shadows to reveal detail, negative values deepen them.

Operates on the L channel in Lab color space using a luminance-weighted mask, leaving highlights and midtones largely unaffected.","ui":"txt2img"}, + {"id":"","label":"Shadows tint","localized":"","hint":"Color to blend into shadow regions for split toning.
Works together with Highlights tint and Split tone balance to create cinematic color grading looks.

Default black (#000000) applies no tint.","ui":"txt2img"}, + {"id":"","label":"Split tone balance","localized":"","hint":"Controls the crossover point between shadow and highlight tinting.
Values below 0.5 extend the shadow tint into midtones. Values above 0.5 extend the highlight tint into midtones.

Default 0.5 splits evenly at the midpoint.","ui":"txt2img"}, {"id":"","label":"Subject","localized":"","hint":"","ui":"script_consistory"}, {"id":"","label":"Same latent","localized":"","hint":"","ui":"script_consistory"}, {"id":"","label":"Share queries","localized":"","hint":"","ui":"script_consistory"}, @@ -1587,7 +1587,7 @@ {"id":"","label":"Video Output","localized":"","hint":"","ui":"tab_video"}, {"id":"","label":"Variation","localized":"","hint":"Second seed to be mixed with primary seed","ui":"txt2img"}, {"id":"","label":"Variation strength","localized":"","hint":"How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something)","ui":"txt2img"}, - {"id":"","label":"Vignette","localized":"","hint":"","ui":"txt2img"}, + {"id":"","label":"Vignette","localized":"","hint":"Applies radial edge darkening that draws focus toward the center of the image.
Higher values produce a stronger falloff from center to corners.

Set to 0 to disable. Simulates the natural light falloff seen in vintage and cinematic lenses.","ui":"txt2img"}, {"id":"","label":"VAE type","localized":"","hint":"Choose if you want to run full VAE, reduced quality VAE or attempt to use remote VAE service","ui":"txt2img"}, {"id":"","label":"Version","localized":"","hint":"","ui":"script_pulid"}, {"id":"","label":"Video format","localized":"","hint":"Format and codec of output video","ui":"script_video"}, diff --git a/wiki b/wiki index 3dde18b34..d2ecbe713 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 3dde18b34e2cd61c800cdd748ada69cede612296 +Subproject commit d2ecbe713e25e2a8da3e2f7d6794c82b85e8a0fe From 1310264d432b92fb79d9eeb80d2385670c980bd0 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Wed, 1 Apr 2026 10:29:08 +0200 Subject: [PATCH 35/73] regen all localizations Signed-off-by: vladmandic --- CHANGELOG.md | 29 +- TODO.md | 47 +- html/locale_ar.json | 7420 +++++++-------- html/locale_bn.json | 7852 ++++++++-------- html/locale_de.json | 9384 +++++++++---------- html/locale_es.json | 6548 ++++++------- html/locale_fr.json | 8188 +++++++++-------- html/locale_he.json | 7610 +++++++-------- html/locale_hi.json | 7322 ++++++++------- html/locale_hr.json | 6689 +++++++------- html/locale_id.json | 6452 ++++++------- html/locale_it.json | 9692 ++++++++++---------- html/locale_ja.json | 8179 +++++++++-------- html/locale_ko.json | 7302 ++++++++------- html/locale_nb.json | 10476 ++++++++++----------- html/locale_po.json | 8382 ++++++++--------- html/locale_pt.json | 6338 ++++++------- html/locale_qq.json | 8764 +++++++++--------- html/locale_ru.json | 7332 ++++++++------- html/locale_sr.json | 7908 ++++++++-------- html/locale_tb.json | 11194 ++++++++++++----------- html/locale_tlh.json | 9790 ++++++++++---------- html/locale_tr.json | 7082 +++++++------- html/locale_ur.json | 8028 ++++++++-------- html/locale_vi.json | 6766 +++++++------- html/locale_xx.json | 8700 +++++++++--------- html/locale_zh.json | 6890 +++++++------- javascript/script.js | 2 +- modules/caption/deepbooru.py | 1 - modules/caption/gemini.py | 4 +- modules/caption/waifudiffusion.py | 1 - pyproject.toml | 425 +- test/localize.mjs | 5 +- test/{reformat.js => reformat-json.js} | 2 + wiki | 2 +- 35 files changed, 103207 insertions(+), 97599 deletions(-) mode change 100644 => 100755 test/localize.mjs rename test/{reformat.js => reformat-json.js} (98%) mode change 100644 => 100755 diff --git a/CHANGELOG.md b/CHANGELOG.md index b35666826..00e3bef4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,19 @@ # Change Log for SD.Next -## Update for 2026-03-30 +## Update for 2026-04-01 -### Highlights for 2026-03-30 +### Highlights for 2026-04-01 This release brings massive code refactoring to modernize codebase and removal of some obsolete features. Leaner & Faster! And since its a bit quieter period when it comes to new models, notable additions would be : *FireRed-Image-Edit*, *SkyWorks-UniPic-3* and new versions of *Anima-Preview*, *Flux-Klein-KV* image models and *LTX 2.3* video model If you're on Windows platform, we have a brand new [All-in-one Installer & Launcher](https://github.com/vladmandic/sdnext-launcher): simply download [exe or zip](https://github.com/vladmandic/sdnext-launcher/releases) and done! +And we have a new (optional) React-based **UI** [Enso](https://github.com/CalamitousFelicitousness/enso)! + *What else*? Really a lot! -New color grading module, updated localization with new languages and improved translations, new civitai integration module, new finetunes loader, several new upscalers, improvements to LLM/VLM in captioning and prompt enhance, a lot of new control preprocessors, new realtime server info panel, some new UI themes -And major work on API hardening: security, rate limits, secrets handling, new endpoints, etc. +New color grading module, updated localization with new languages and improved translations, new CivitAI integration module, new finetunes loader, several new upscalers, improvements to LLM/VLM in captioning and prompt enhance, a lot of new control preprocessors, new realtime server info panel, some new UI themes +And major work on API hardening: *security, rate limits, secrets handling, new endpoints*, etc. But also many smaller quality-of-life improvements - for full details, see [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) *Note*: Purely due to size of changes, clean install is recommended! @@ -19,7 +21,7 @@ Just how big? Some stats: *~530 commits over 880 files* [ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) | [Sponsor](https://github.com/sponsors/vladmandic) -### Details for 2026-03-30 +### Details for 2026-04-01 - **Models** - [Google Flash 3.1 Image](https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview) a.k.a. *Nano Banana 2* @@ -83,10 +85,11 @@ Just how big? Some stats: *~530 commits over 880 files* > `set TORCH_COMMAND='torch torchvision --index-url https://download.pytorch.org/whl/cu128` - update installer and support `nunchaku==1.2.1` - **UI** - - **Enso** new React-based UI with WYSIWYG infinite canvas workspace, command palette, and numerous quality of life improvements across the board *(work-in-progress alpha)*. - enable using `--enso` flag, and use on `/enso` endpoint. - **Separate installation of SD.Next recommended** - see wiki page and Enso repo README for details. + - **Enso** new React-based UI, developed by @CalamitousFelicitousness! + with WYSIWYG infinite canvas workspace, command palette, and numerous quality of life improvements across the board + enable using `--enso` flag and access using `/enso` endpoint (e.g. ) + see [Enso Docs](https://vladmandic.github.io/sdnext-docs/Enso/) and [Enso Home](https://github.com/CalamitousFelicitousness/enso) for details + *note* Enso is work-in-progress and alpha-ready - legacy panels **T2I** and **I2I** are disabled by default you can re-enable them in *settings -> ui -> hide legacy tabs* - new panel: **Server Info** with detailed runtime informaton @@ -109,15 +112,17 @@ Just how big? Some stats: *~530 commits over 880 files* - updates to core sections: *Installation, Python, Schedulers, Launcher, SDNQ, Video* - added Enso page - **API** - - new **v2 API** (`/sdapi/v2/`): job-based generation with queue, per-job WebSocket progress, file uploads with TTL, model/network enumeration, and a plethora of other improvements *(work-in-progress)* - for the time being ships with Enso, which must be enabled wih `--enso` flag on startup for v2 API to be available. + - prototype **v2 API** (`/sdapi/v2/`) + job-based generation with queue, per-job WebSocket progress, file uploads with TTL, model/network enumeration + and a plethora of other improvements *(work-in-progress)* + for the time being ships with Enso, which must be enabled wih `--enso` flag on startup for v2 API to be available - **rate limiting**: global for all endpoints, guards against abuse and denial-of-service type of attacks configurable in *settings -> server settings* - new `/sdapi/v1/upload` endpoint with support for both POST with form-data or PUT using raw-bytes - new `/sdapi/v1/torch` endpoint for torch info (backend, version, etc.) - new `/sdapi/v1/gpu` endpoint for GPU info - new `/sdapi/v1/rembg` endpoint for background removal - - new `/sdadpi/v1/unet` endpoint to list available unets/dits + - new `/sdapi/v1/unet` endpoint to list available unets/dits - use rate limiting for api logging - **Obsoleted** - removed support for additional quantization engines: *BitsAndBytes, TorchAO, Optimum-Quanto, NNCF* diff --git a/TODO.md b/TODO.md index 746ffacdd..99903bb98 100644 --- a/TODO.md +++ b/TODO.md @@ -1,12 +1,5 @@ # TODO -## Release - -- Add notes: **Enso** -- Tips: **Color Grading** -- Regen: **Localization** -- Rebuild: **Launcher** with `master` - ## Internal - Feature: implement `unload_auxiliary_models` @@ -131,21 +124,25 @@ TODO: Investigate which models are diffusers-compatible and prioritize! > npm run todo -- fc: autodetect distilled based on model -- fc: autodetect tensor format based on model -- hypertile: vae breaks when using non-standard sizes -- install: switch to pytorch source when it becomes available -- loader: load receipe -- loader: save receipe -- lora: add other quantization types -- lora: add t5 key support for sd35/f1 -- lora: maybe force imediate quantization -- model load: force-reloading entire model as loading transformers only leads to massive memory usage -- model load: implement model in-memory caching -- modernui: monkey-patch for missing tabs.select event -- modules/lora/lora_extract.py:188:9: W0511: TODO: lora: support pre-quantized flux -- modules/modular_guiders.py:65:58: W0511: TODO: guiders -- processing: remove duplicate mask params -- resize image: enable full VAE mode for resize-latent - -modules/sd_samplers_diffusers.py:353:31: W0511: TODO enso-required (fixme) +```code +installer.py:TODO rocm: switch to pytorch source when it becomes available +modules/control/run.py:TODO modernui: monkey-patch for missing tabs.select event +modules/history.py:TODO: apply metadata, preview, load/save +modules/image/resize.py:TODO resize image: enable full VAE mode for resize-latent +modules/lora/lora_apply.py:TODO lora: add other quantization types +modules/lora/lora_apply.py:TODO lora: maybe force imediate quantization +modules/lora/lora_extract.py:TODO: lora: support pre-quantized flux +modules/lora/lora_load.py:TODO lora: add t5 key support for sd35/f1 +modules/masking.py:TODO: additional masking algorithms +modules/modular_guiders.py:TODO: guiders +modules/processing_class.py:TODO processing: remove duplicate mask params +modules/sd_hijack_hypertile.py:TODO hypertile: vae breaks when using non-standard sizes +modules/sd_models.py:TODO model load: implement model in-memory caching +modules/sd_samplers_diffusers.py:TODO enso-required +modules/sd_unet.py:TODO model load: force-reloading entire model as loading transformers only leads to massive memory usage +modules/transformer_cache.py:TODO fc: autodetect distilled based on model +modules/transformer_cache.py:TODO fc: autodetect tensor format based on model +modules/ui_models_load.py:TODO loader: load receipe +modules/ui_models_load.py:TODO loader: save receipe +modules/video_models/video_save.py:TODO audio set time-base +``` diff --git a/html/locale_ar.json b/html/locale_ar.json index 25c1667a3..ab13d6d46 100644 --- a/html/locale_ar.json +++ b/html/locale_ar.json @@ -1,74 +1,74 @@ { "0": [ { - "id": 0, + "id": 1, "label": "1st Stage", "localized": "المرحلة الأولى", "reload": "n/a", - "hint": "المرحلة الأولى من عملية التوليد أو المعالجة." + "hint": "تعريف المرحلة الأولى للعملية" }, { - "id": 0, + "id": 2, "label": "2nd Stage", "localized": "المرحلة الثانية", "reload": "n/a", - "hint": "المرحلة الثانية من عملية التوليد أو المعالجة." + "hint": "تعريف المرحلة الثانية للعملية" }, { - "id": 0, + "id": 3, "label": "2nd Scale", - "localized": "المقياس الثاني", + "localized": "مقياس المرحلة الثانية", "reload": "n/a", - "hint": "قيمة المقياس (Scale) المستخدمة في المرحلة الثانية لضبط قوة التوجيه." + "hint": "تحديد مقياس المرحلة الثانية" }, { - "id": 0, + "id": 4, "label": "2nd Restart step", - "localized": "خطوة إعادة التشغيل الثانية", + "localized": "خطوة إعادة البدء الثانية", "reload": "n/a", - "hint": "الخطوة المحددة لإعادة تشغيل عملية أخذ العينات في المرحلة الثانية." + "hint": "تعيين خطوة إعادة البدء للمرحلة الثانية" }, { - "id": 0, + "id": 5, "label": "3rd Stage", "localized": "المرحلة الثالثة", "reload": "n/a", - "hint": "المرحلة الثالثة من عملية التوليد أو المعالجة." + "hint": "تعريف المرحلة الثالثة للعملية" }, { - "id": 0, + "id": 6, "label": "3rd Scale", - "localized": "المقياس الثالث", + "localized": "مقياس المرحلة الثالثة", "reload": "n/a", - "hint": "قيمة المقياس (Scale) المستخدمة في المرحلة الثالثة لضبط قوة التوجيه." + "hint": "تحديد مقياس المرحلة الثالثة" }, { - "id": 0, + "id": 7, "label": "3rd Restart step", - "localized": "خطوة إعادة التشغيل الثالثة", + "localized": "خطوة إعادة البدء الثالثة", "reload": "n/a", - "hint": "الخطوة المحددة لإعادة تشغيل عملية أخذ العينات في المرحلة الثالثة." + "hint": "تعيين خطوة إعادة البدء للمرحلة الثالثة" }, { - "id": 0, + "id": 8, "label": "4th Stage", "localized": "المرحلة الرابعة", "reload": "n/a", - "hint": "المرحلة الرابعة من عملية التوليد أو المعالجة." + "hint": "تعريف المرحلة الرابعة للعملية" }, { - "id": 0, + "id": 9, "label": "4th Scale", - "localized": "المقياس الرابع", + "localized": "مقياس المرحلة الرابعة", "reload": "n/a", - "hint": "قيمة المقياس (Scale) المستخدمة في المرحلة الرابعة لضبط قوة التوجيه." + "hint": "تحديد مقياس المرحلة الرابعة" }, { - "id": 0, + "id": 10, "label": "4th Restart step", - "localized": "خطوة إعادة التشغيل الرابعة", + "localized": "خطوة إعادة البدء الرابعة", "reload": "n/a", - "hint": "الخطوة المحددة لإعادة تشغيل عملية أخذ العينات في المرحلة الرابعة." + "hint": "تعيين خطوة إعادة البدء للمرحلة الرابعة" } ], "_": [ @@ -80,270 +80,298 @@ "hint": "تحديث" }, { - "id": 0, + "id": 1, "label": "↶", "localized": "↶", "reload": "txt2img_styles_apply", - "hint": "تطبيق النمط المختار على الوصف (Prompt)" + "hint": "تطبيق النمط المختار على النص (Prompt)" }, { - "id": 0, + "id": 2, "label": "↷", "localized": "↷", "reload": "txt2img_styles_save", - "hint": "حفظ الوصف الحالي كنمط" + "hint": "حفظ النص الحالي كنمط" }, { - "id": 0, + "id": 3, "label": "⇅", "localized": "⇅", "reload": "txt2img_res_btn_swap", "hint": "تبديل القيم" }, { - "id": 0, + "id": 4, "label": "🎲️", "localized": "🎲️", "reload": "txt2img_seed_random", "hint": "استخدام بذرة (Seed) عشوائية" }, { - "id": 0, + "id": 5, "label": "⬅️", "localized": "⬅️", "reload": "txt2img_seed_reuse", - "hint": "إعادة استخدام البذرة من آخر صورة تم إنشاؤها" + "hint": "إعادة استخدام البذرة (Seed) من آخر صورة تم إنشاؤها" }, { - "id": 0, + "id": 6, "label": "🕮", "localized": "🕮", "reload": "txt2img_guider_docs", - "hint": "حفظ إعدادات آخر صورة تم إنشاؤها كقالب نمط" + "hint": "حفظ المعايير من آخر صورة تم إنشاؤها كنموذج تنسيق" }, { - "id": 0, + "id": 7, "label": "📐", "localized": "📐", "reload": "txt2img_resize_detect_size", - "hint": "قياس الحجم من الصورة الموجودة" + "hint": "قياس الحجم من صورة موجودة" }, { - "id": 0, + "id": 8, "label": "☲", "localized": "☲", "reload": "txt2img_yolo_models_list", "hint": "تغيير نوع العرض" }, { - "id": 0, + "id": 9, "label": "⊜", "localized": "⊜", "reload": "xyz_grid_x_list", "hint": "ملء" }, { - "id": 0, + "id": 10, "label": "", "localized": "", "reload": "txt2img_caption_output", - "hint": "تسمية الصورة (Caption)" + "hint": "وصف الصورة" }, { - "id": 0, + "id": 11, "label": "⁜", "localized": "⁜", "reload": "txt2img_image_fit", "hint": "تبديل طريقة ملاءمة الصورة" }, { - "id": 0, + "id": 12, "label": "➠ Control", - "localized": "تحكم ➠", + "localized": "➠ تحكم", "reload": "", - "hint": "نقل الصورة إلى واجهة التحكم (ControlNet)" + "hint": "نقل الصورة إلى واجهة التحكم" }, { - "id": 0, + "id": 13, "label": "➠ Text", - "localized": "نص ➠", + "localized": "➠ نص", "reload": "", "hint": "نقل الصورة إلى واجهة النص" }, { - "id": 0, + "id": 14, "label": "➠ Image", - "localized": "صورة ➠", + "localized": "➠ صورة", "reload": "", - "hint": "نقل الصورة إلى واجهة صورة-إلى-صورة" + "hint": "نقل الصورة إلى واجهة الصورة" }, { - "id": 0, + "id": 15, "label": "➠ Process", - "localized": "معالجة ➠", + "localized": "➠ معالجة", "reload": "", "hint": "نقل الصورة إلى واجهة المعالجة" }, { - "id": 0, + "id": 16, "label": "➠ Caption", - "localized": "وصف ➠", + "localized": "➠ وصف", "reload": "", - "hint": "نقل الصورة إلى واجهة الوصف (Caption)" + "hint": "نقل الصورة إلى واجهة الوصف" }, { - "id": 0, + "id": 17, "label": "➠ Sketch", - "localized": "رسم ➠", + "localized": "➠ رسم", "reload": "", "hint": "نقل الصورة إلى واجهة الرسم" }, { - "id": 0, + "id": 18, "label": "➠ Inpaint", - "localized": "رسم داخلي ➠", + "localized": "➠ ملء", "reload": "", - "hint": "نقل الصورة إلى واجهة الرسم الداخلي (Inpaint)" + "hint": "نقل الصورة إلى واجهة الملء (Inpaint)" }, { - "id": 0, + "id": 19, "label": "➠ Composite", - "localized": "تركيب ➠", + "localized": "➠ تركيب", "reload": "", - "hint": "نقل الصورة إلى واجهة الرسم الداخلي المركب" + "hint": "نقل الصورة إلى واجهة رسم الملء" }, { - "id": 0, + "id": 20, "label": "⬆️", "localized": "⬆️", "reload": "controlnet_unit-0-upload", "hint": "رفع صورة" }, { - "id": 0, + "id": 21, "label": "🔄", "localized": "🔄", "reload": "controlnet_unit-0-reset", - "hint": "إعادة تعيين القيم" + "hint": "إعادة ضبط القيم" }, { - "id": 0, + "id": 22, "label": "🖼️", "localized": "🖼️", "reload": "controlnet_unit-0-preview", - "hint": "إظهار المعاينة" + "hint": "عرض المعاينة" }, { - "id": 0, + "id": 23, "label": "↺", "localized": "↺", "reload": "video_model_load", "hint": "تطبيق الاختيار فوراً" }, { - "id": 0, + "id": 24, "label": "", "localized": "", - "reload": "component-5772", + "reload": "component-5878", "hint": "ترتيب حسب الاسم، تصاعدي" }, { - "id": 0, + "id": 25, "label": "", "localized": "", - "reload": "component-5773", + "reload": "component-5879", "hint": "ترتيب حسب الاسم، تنازلي" }, { - "id": 0, + "id": 26, "label": "", "localized": "", - "reload": "component-5774", + "reload": "component-5880", "hint": "ترتيب حسب الحجم، تصاعدي" }, { - "id": 0, + "id": 27, "label": "", "localized": "", - "reload": "component-5775", + "reload": "component-5881", "hint": "ترتيب حسب الحجم، تنازلي" }, { - "id": 0, + "id": 28, "label": "", "localized": "", - "reload": "component-5776", + "reload": "component-5882", "hint": "ترتيب حسب الدقة، تصاعدي" }, { - "id": 0, + "id": 29, "label": "", "localized": "", - "reload": "component-5777", + "reload": "component-5883", "hint": "ترتيب حسب الدقة، تنازلي" }, { - "id": 0, + "id": 30, "label": "", "localized": "", - "reload": "component-5778", + "reload": "component-5884", "hint": "ترتيب حسب الوقت، تصاعدي" }, { - "id": 0, + "id": 31, "label": "", "localized": "", - "reload": "component-5779", + "reload": "component-5885", "hint": "ترتيب حسب الوقت، تنازلي" }, { - "id": 0, + "id": 32, "label": "⊗", "localized": "⊗", "reload": "quicksettings_clear", - "hint": "إعادة تعيين القيم" + "hint": "إعادة ضبط القيم" }, { - "id": 0, + "id": 33, "label": "🔍", "localized": "🔍", "reload": "docs_btn_search", "hint": "بحث" }, { - "id": 0, + "id": 34, "label": "⇨", "localized": "⇨", - "reload": "component-5567", + "reload": "component-5667", "hint": "تطبيق الإعداد المسبق" }, { - "id": 0, + "id": 35, "label": "※", "localized": "※", "reload": "txt2img_extra_model", - "hint": "تحميل النموذج كنموذج تكرير (Refiner) عند اختياره، وإلا يتم تحميله كنموذج أساسي" + "hint": "تحميل النموذج كنموذج تحسين (Refiner) عند اختياره، وإلا يتم تحميله كنموذج أساسي" }, { - "id": 0, + "id": 36, "label": "🔎︎", "localized": "🔎︎", "reload": "txt2img_extra_scan", "hint": "فحص CivitAI للبحث عن البيانات الوصفية والمعاينات المفقودة" }, { - "id": 0, + "id": 37, "label": "⇕", "localized": "⇕", "reload": "txt2img_extra_sort", - "hint": "ترتيب حسب: الاسم، الحجم، الوقت" + "hint": "ترتيب حسب: الاسم تصاعدي/تنازلي، الحجم الأكبر/الأصغر، الوقت الأحدث/الأقدم" }, { - "id": 0, + "id": 38, "label": "✕", "localized": "✕", "reload": "txt2img_extra_close", "hint": "إغلاق" + }, + { + "id": 39, + "label": "_Guidance scale", + "localized": "مقياس التوجيه", + "reload": "", + "hint": "مقياس التوجيه" + }, + { + "id": 40, + "label": "_Guidance rescale", + "localized": "إعادة قياس التوجيه", + "reload": "", + "hint": "إعادة قياس التوجيه" + }, + { + "id": 41, + "label": "_Guidance start", + "localized": "بداية التوجيه", + "reload": "", + "hint": "بداية التوجيه" + }, + { + "id": 42, + "label": "_Guidance stop", + "localized": "نهاية التوجيه", + "reload": "", + "hint": "نهاية التوجيه" } ], "a": [ @@ -352,19 +380,19 @@ "label": "Advanced", "localized": "متقدم", "reload": "", - "hint": "الإعدادات المتقدمة المستخدمة لتشغيل توليد الصور" + "hint": "إعدادات متقدمة تستخدم لتشغيل توليد الصور" }, { "id": 0, "label": "Adapters", - "localized": "المهايئات (Adapters)", + "localized": "المكيفات (Adapters)", "reload": "", - "hint": "الإعدادات المتعلقة بمهايئات IP (IP Adapters)" + "hint": "إعدادات متعلقة بـ IP Adapters" }, { "id": 0, "label": "Apply to model", - "localized": "التطبيق على النموذج", + "localized": "تطبيق على النموذج", "reload": "", "hint": "" }, @@ -380,7 +408,7 @@ "label": "Apply changes", "localized": "تطبيق التغييرات", "reload": "", - "hint": "تطبيق كافة التغييرات وإعادة تشغيل الخادم" + "hint": "تطبيق جميع التغييرات وإعادة تشغيل الخادم" }, { "id": 0, @@ -403,17 +431,10 @@ "reload": "", "hint": "" }, - { - "id": 0, - "label": "artist", - "localized": "فنان", - "reload": "", - "hint": "" - }, { "id": 0, "label": "Alpha", - "localized": "ألفا (Alpha)", + "localized": "ألفا", "reload": "", "hint": "" }, @@ -441,21 +462,21 @@ { "id": 0, "label": "Adjust start", - "localized": "تعديل البداية", + "localized": "ضبط البداية", "reload": "", - "hint": "خطوة البداية عند حدوث تعديل سيجما (sigma adjust)" + "hint": "خطوة البداية عند حدوث ضبط سيجما" }, { "id": 0, "label": "Adjust end", - "localized": "تعديل النهاية", + "localized": "ضبط النهاية", "reload": "", - "hint": "خطوة النهاية عند حدوث تعديل سيجما (sigma adjust)" + "hint": "خطوة النهاية عند حدوث ضبط سيجما" }, { "id": 0, "label": "AutoGuidance dropout", - "localized": "إسقاط التوجيه التلقائي", + "localized": "إسقاط التوجيه التلقائي (AutoGuidance dropout)", "reload": "", "hint": "" }, @@ -490,49 +511,56 @@ { "id": 0, "label": "Attention guidance", - "localized": "توجيه الانتباه (Attention guidance)", + "localized": "توجيه الانتباه", "reload": "", - "hint": "مقياس CFG المستخدم مع PAG: توجيه الانتباه المضطرب" + "hint": "مقياس CFG المستخدم مع PAG: توجيه الانتباه المضطرب (Perturbed-Attention Guidance)" }, { "id": 0, "label": "Adaptive scaling", - "localized": "القياس التكيفي", + "localized": "التحجيم التكيفي", "reload": "", "hint": "معدل تكيفي لمقياس توجيه الانتباه" }, { "id": 0, - "label": "Active IP adapters", - "localized": "مهايئات IP النشطة", + "label": "Apply to hires", + "localized": "تطبيق على الدقة العالية (Hires)", "reload": "", - "hint": "عدد مهايئات IP النشطة" + "hint": "" + }, + { + "id": 0, + "label": "Active IP adapters", + "localized": "محولات IP النشطة", + "reload": "", + "hint": "عدد محولات IP النشطة" }, { "id": 0, "label": "Adapter", - "localized": "مهايئ", + "localized": "المحول (Adapter)", "reload": "", - "hint": "نموذج مهايئ IP" + "hint": "نموذج محول IP" }, { "id": 0, "label": "Anchor settings", - "localized": "إعدادات المرساة", + "localized": "إعدادات الربط (Anchor)", "reload": "", "hint": "" }, { "id": 0, "label": "Alpha preset", - "localized": "مسبق ضبط ألفا", + "localized": "إعداد ألفا المسبق", "reload": "", "hint": "" }, { "id": 0, "label": "Append heatmaps to results", - "localized": "إلحاق الخرائط الحرارية بالنتائج", + "localized": "إلحاق خرائط التمثيل الحراري بالنتائج", "reload": "", "hint": "" }, @@ -543,13 +571,6 @@ "reload": "", "hint": "" }, - { - "id": 0, - "label": "Amplify LUT", - "localized": "تضخيم LUT", - "reload": "", - "hint": "" - }, { "id": 0, "label": "Add time info", @@ -567,7 +588,7 @@ { "id": 0, "label": "Add metadata", - "localized": "إضافة البيانات الوصفية", + "localized": "إضافة بيانات وصفية", "reload": "", "hint": "" }, @@ -588,37 +609,37 @@ { "id": 0, "label": "Apply to prompt", - "localized": "تطبيق على المطالبة", + "localized": "تطبيق على النص الوصفي (Prompt)", "reload": "", - "hint": "نسخ النتيجة المحسنة تلقائيًا إلى مربع إدخال المطالبة" + "hint": "نسخ النتيجة المحسنة تلقائيًا إلى مربع إدخال النص الوصفي" }, { "id": 0, "label": "Auto enhance", "localized": "تحسين تلقائي", "reload": "", - "hint": "تحسين المطالبة تلقائيًا قبل كل عملية توليد للصور" + "hint": "تحسين النص الوصفي تلقائيًا قبل كل توليد للصورة" }, { "id": 0, "label": "ACI: Color to Mask", - "localized": "ACI: اللون إلى قناع", + "localized": "ACI: اللون للقناع", "reload": "", - "hint": "اختر اللون الذي تريد إخفاءه وترميمه. انقر على اللون في الصورة لتحديده تلقائيًا.
ينصح باستخدام صور مثل الشاشات الخضراء للحصول على نتائج دقيقة." + "hint": "اختر اللون الذي تريد إخفاءه والطلاء فوقه. انقر على اللون في الصورة لتحديده تلقائيًا.
يُنصح باستخدام صور مثل الشاشات الخضراء للحصول على نتائج دقيقة." }, { "id": 0, "label": "ACI: Color tolerance", - "localized": "ACI: التفاوت اللوني", + "localized": "ACI: تفاوت اللون", "reload": "", - "hint": "اضبط التفاوت لتضمين ألوان مماثلة في القناع. القيم المنخفضة = قناع للألوان المتشابهة جدًا فقط. القيم العالية = قناع لنطاق أوسع من الألوان المماثلة." + "hint": "اضبط التفاوت ليشمل ألوانًا مشابهة في القناع. قيم أقل = قناع للألوان المتشابهة جدًا فقط. قيم أعلى = قناع لنطاق أوسع من الألوان المتشابهة." }, { "id": 0, "label": "ACI: Denoising strength", "localized": "ACI: قوة إزالة الضجيج", "reload": "", - "hint": "قم بتغيير قوة إزالة الضجيج لتحقيق كمية الترميم (inpaint) المطلوبة." + "hint": "قم بتغيير قوة إزالة الضجيج لتحقيق كمية الطلاء المطلوبة." }, { "id": 0, @@ -632,19 +653,19 @@ "label": "ACI: Mask erode", "localized": "ACI: تآكل القناع", "reload": "", - "hint": "اضبط الهوامش لتطبيق إزاحة داخلية على القناع. (القيمة الموصى بها = 2 لإزالة البقايا عند الحواف)" + "hint": "اضبط الحشوة لتطبيق إزاحة داخلية على القناع. (القيمة الموصى بها = 2 لإزالة البقايا عند الحواف)" }, { "id": 0, "label": "ACI: Mask blur", "localized": "ACI: تمويه القناع", "reload": "", - "hint": "اضبط التمويه لتطبيق انتقال سلس بين الصورة ومنطقة الترميم. (القيمة الموصى بها = 0 للحصول على حدة)" + "hint": "اضبط التمويه لتطبيق انتقال سلس بين الصورة والمنطقة المطلية. (القيمة الموصى بها = 0 للحدة)" }, { "id": 0, "label": "Adaptive restore", - "localized": "استعادة تكيفية", + "localized": "الاستعادة التكيفية", "reload": "", "hint": "" }, @@ -658,7 +679,7 @@ { "id": 0, "label": "Auto min score", - "localized": "أدنى درجة تلقائية", + "localized": "الحد الأدنى التلقائي للنتيجة", "reload": "", "hint": "" }, @@ -686,7 +707,7 @@ { "id": 0, "label": "Attention", - "localized": "الانتباه (Attention)", + "localized": "انتباه", "reload": "", "hint": "" }, @@ -707,23 +728,23 @@ { "id": 0, "label": "Apply filter", - "localized": "تطبيق الفلتر", + "localized": "تطبيق مرشح", "reload": "", "hint": "" }, { "id": 0, "label": "Alpha matting", - "localized": "استخراج ألفا (Alpha matting)", + "localized": "تخريج ألفا (Alpha matting)", "reload": "", "hint": "" }, { "id": 0, "label": "Append Caption Files", - "localized": "إلحاق ملفات التعليقات الوصفية", + "localized": "إلحاق ملفات التعليق", "reload": "", - "hint": "الإلحاق بملفات التعليقات الوصفية الموجودة بدلاً من استبدالها.
مفيد لإضافة أوصاف أو وسوم إضافية للصور التي تحتوي بالفعل على تعليقات." + "hint": "الإلحاق بملفات التعليق الموجودة بدلاً من استبدالها.
مفيد لإضافة أوصاف أو وسوم إضافية للصور التي تحتوي بالفعل على تعليقات." }, { "id": 0, @@ -735,7 +756,7 @@ { "id": 0, "label": "Autocast", - "localized": "بث تلقائي (Autocast)", + "localized": "التحويل التلقائي للأنواع (Autocast)", "reload": "", "hint": "تحديد الدقة تلقائيًا أثناء وقت التشغيل" }, @@ -746,6 +767,27 @@ "reload": "", "hint": "" }, + { + "id": 0, + "label": "Automatic server status monitor rate", + "localized": "معدل مراقبة حالة الخادم التلقائي", + "reload": "", + "hint": "" + }, + { + "id": 0, + "label": "Automatic server memory monitor rate", + "localized": "معدل مراقبة ذاكرة الخادم التلقائي", + "reload": "", + "hint": "" + }, + { + "id": 0, + "label": "API base rate limit rate", + "localized": "معدل حد السعر الأساسي للـ API", + "reload": "", + "hint": "" + }, { "id": 0, "label": "accuracy", @@ -756,7 +798,7 @@ { "id": 0, "label": "atiadlxx (AMD only)", - "localized": "atiadlxx (AMD فقط)", + "localized": "atiadlxx (لـ AMD فقط)", "reload": "", "hint": "" }, @@ -784,7 +826,7 @@ { "id": 0, "label": "Autolaunch browser upon startup", - "localized": "تشغيل المتصفح تلقائيًا عند بدء التشغيل", + "localized": "تشغيل المتصفح تلقائيًا عند البدء", "reload": "", "hint": "" }, @@ -800,7 +842,7 @@ "label": "Approximate", "localized": "تقريبي", "reload": "", - "hint": "تقريب عصبي رخيص. سريع جدًا مقارنة بـ VAE، ولكنه ينتج صورًا بدقة أفقية/رأسية أصغر بـ 4 مرات وجودة أقل" + "hint": "تقريب شبكة عصبية رخيص. سريع جدًا مقارنة بـ VAE، لكنه ينتج صورًا بدقة أفقية/رأسية أصغر بـ 4 مرات وجودة أقل" }, { "id": 0, @@ -840,42 +882,42 @@ { "id": 0, "label": "Auto-convert SD15 embeddings to SDXL", - "localized": "تحويل تضمينات SD15 إلى SDXL تلقائيًا", + "localized": "التحويل التلقائي لتضمينات SD15 إلى SDXL", "reload": "", "hint": "" }, { "id": 0, "label": "alias", - "localized": "اسم مستعار", + "localized": "اسم مستعار (alias)", "reload": "", "hint": "" }, { "id": 0, "label": "Attention query chunk size", - "localized": "حجم كتلة استعلام الانتباه", + "localized": "حجم مقطع استعلام الانتباه", "reload": "", "hint": "" }, { "id": 0, "label": "Attention kv chunk size", - "localized": "حجم كتلة kv للانتباه", + "localized": "حجم مقطع KV للانتباه", "reload": "", "hint": "" }, { "id": 0, "label": "Attention chunking threshold", - "localized": "عتبة تقسيم الانتباه إلى كتل", + "localized": "عتبة تقطيع الانتباه", "reload": "", "hint": "" }, { "id": 0, "label": "Attempt VAE roll back for NaN values", - "localized": "محاولة استعادة VAE لقيم NaN", + "localized": "محاولة التراجع عن VAE لقيم NaN", "reload": "", "hint": "يتطلب Torch 2.1 وتمكين فحص NaN" }, @@ -889,7 +931,7 @@ { "id": 0, "label": "Add LoRA to prompt", - "localized": "إضافة LoRA إلى المطالبة", + "localized": "إضافة LoRA إلى النص الوصفي", "reload": "", "hint": "" }, @@ -903,7 +945,7 @@ { "id": 0, "label": "ALPHA Block Weight Preset", - "localized": "مسبق ضبط وزن كتلة ألفا", + "localized": "إعداد مسبق لوزن كتلة ألفا", "reload": "", "hint": "" }, @@ -924,63 +966,42 @@ { "id": 0, "label": "Advanced guidance params", - "localized": "معلمات التوجيه المتقدمة", + "localized": "معاملات التوجيه المتقدمة", "reload": "", "hint": "" }, { "id": 0, "label": "Adapter 1", - "localized": "المهايئ 1", + "localized": "المحول 1", "reload": "", "hint": "" }, { "id": 0, "label": "Adapter 2", - "localized": "المهايئ 2", + "localized": "المحول 2", "reload": "", "hint": "" }, { "id": 0, "label": "Adapter 3", - "localized": "المهايئ 3", + "localized": "المحول 3", "reload": "", "hint": "" }, { "id": 0, "label": "Adapter 4", - "localized": "المهايئ 4", + "localized": "المحول 4", "reload": "", "hint": "" }, { "id": 0, "label": "Audio", - "localized": "الصوت", - "reload": "", - "hint": "" - }, - { - "id": 0, - "label": "Advanced Options", - "localized": "خيارات متقدمة", - "reload": "", - "hint": "" - }, - { - "id": 0, - "label": "Advanced Options", - "localized": "خيارات متقدمة", - "reload": "", - "hint": "" - }, - { - "id": 0, - "label": "Advanced Options", - "localized": "خيارات متقدمة", + "localized": "صوت", "reload": "", "hint": "" } @@ -991,311 +1012,325 @@ "label": "Batch", "localized": "دفعة", "reload": "", - "hint": "إعدادات معالجة الدفعات" + "hint": "إعدادات المعالجة بالدفعة" }, { - "id": 1, - "label": "Batch Caption", - "localized": "تعليق الدفعة", + "id": 0, + "label": "btn_vlm_caption_batch", + "localized": "btn_vlm_caption_batch", "reload": "", "hint": "" }, { - "id": 2, - "label": "Batch Tag", - "localized": "وسم الدفعة", + "id": 0, + "label": "btn_wd_tag_batch", + "localized": "btn_wd_tag_batch", "reload": "", "hint": "" }, { - "id": 3, + "id": 0, "label": "Benchmark", - "localized": "قياس الأداء", + "localized": "اختبار الأداء", "reload": "", - "hint": "تشغيل اختبارات قياس الأداء" + "hint": "تشغيل اختبارات الأداء" }, { - "id": 4, + "id": 0, "label": "Backend Settings", - "localized": "إعدادات الخلفية البرمجية", + "localized": "إعدادات المحرك الخلفي", "reload": "", - "hint": "الإعدادات المتعلقة ببيئات الحوسبة: torch و onnx و olive" + "hint": "الإعدادات المتعلقة بمحركات الحوسبة: torch و onnx و olive" }, { - "id": 5, - "label": "body", - "localized": "الجسم", - "reload": "", - "hint": "" - }, - { - "id": 6, + "id": 0, "label": "Beta", - "localized": "بيتا", + "localized": "بيتا (تجريبي)", "reload": "", "hint": "" }, { - "id": 7, + "id": 0, "label": "Balanced Offload", "localized": "تفريغ متوازن", "reload": "", "hint": "" }, { - "id": 8, + "id": 0, "label": "BitsAndBytes", "localized": "BitsAndBytes", "reload": "", "hint": "" }, { - "id": 9, + "id": 0, "label": "Batch count", "localized": "عدد الدفعات", "reload": "", - "hint": "كمية دفعات الصور المراد إنشاؤها (ليس له تأثير على أداء التوليد أو استهلاك ذاكرة الرام للفيديو VRAM)" + "hint": "كم عدد دفعات الصور المراد إنشاؤها (لا يؤثر على أداء الإنشاء أو استهلاك ذاكرة الفيديو VRAM)" }, { - "id": 10, + "id": 0, "label": "Batch size", "localized": "حجم الدفعة", "reload": "", - "hint": "عدد الصور المراد إنشاؤها في دفعة واحدة (يزيد من أداء التوليد على حساب استهلاك أعلى لذاكرة الرام للفيديو VRAM)" + "hint": "كم عدد الصور التي يتم إنشاؤها في دفعة واحدة (يزيد من أداء الإنشاء على حساب زيادة استهلاك ذاكرة الفيديو VRAM)" }, { - "id": 11, + "id": 0, "label": "Beta schedule", - "localized": "جدولة بيتا", + "localized": "جدول بيتا", "reload": "", - "hint": "يحدد كيفية نمو بيتا (قوة الضجيج لكل خطوة). الخيارات:
- افتراضي: الافتراضي للنموذج
- خطي (linear): يقلل الضجيج بالتساوي لكل خطوة
- متدرج (scaled): نسخة مربعة من الخطي، تستخدم فقط في Stable Diffusion
- جيب التمام (cosine): انخفاض أكثر سلاسة، يعطي نتائج أفضل بخطوات أقل غالباً
- سيني (sigmoid): انتقال حاد، تجريبي" + "hint": "يحدد كيفية نمو بيتا (قوة الضوضاء لكل خطوة). الخيارات:\n- default: الإعداد الافتراضي للنموذج\n- linear: تلاشي الضوضاء بانتظام لكل خطوة\n- scaled: نسخة مربعة من الخطية، تستخدم فقط بواسطة Stable Diffusion\n- cosine: تلاشي أكثر سلاسة، غالباً ما يعطي نتائج أفضل مع خطوات أقل\n- sigmoid: انتقال حاد، تجريبي" }, { - "id": 12, + "id": 0, "label": "Base shift", - "localized": "الإزاحة الأساسية", + "localized": "إزاحة القاعدة", "reload": "", "hint": "قيمة الإزاحة الدنيا للدقات المنخفضة عند استخدام الإزاحة الديناميكية." }, { - "id": 13, + "id": 0, "label": "Brightness", "localized": "السطوع", "reload": "", - "hint": "" + "hint": "يضبط السطوع العام للصورة.\nالقيم الموجبة تفتح الصورة، والقيم السالبة تغمقها.\n\nيطبق بشكل موحد عبر جميع البكسلات في الفضاء الخطي." }, { - "id": 14, + "id": 0, "label": "Block", "localized": "كتلة", "reload": "", "hint": "" }, { - "id": 15, + "id": 0, "label": "Block size", "localized": "حجم الكتلة", "reload": "", "hint": "" }, { - "id": 16, + "id": 0, "label": "Banned words", "localized": "الكلمات المحظورة", "reload": "", "hint": "" }, { - "id": 17, + "id": 0, "label": "Blur", "localized": "تمويه", "reload": "", "hint": "" }, { - "id": 18, + "id": 0, "label": "Batch input directory", - "localized": "مجلد مدخلات الدفعة", + "localized": "دليل إدخال الدفعة", "reload": "", "hint": "" }, { - "id": 19, + "id": 0, "label": "Batch output directory", - "localized": "مجلد مخرجات الدفعة", + "localized": "دليل إخراج الدفعة", "reload": "", "hint": "" }, { - "id": 20, + "id": 0, "label": "Batch mask directory", - "localized": "مجلد أقنعة الدفعة", + "localized": "دليل قناع الدفعة", "reload": "", "hint": "" }, { - "id": 21, + "id": 0, "label": "Background threshold", "localized": "عتبة الخلفية", "reload": "", "hint": "" }, { - "id": 22, + "id": 0, + "label": "Body", + "localized": "الجسم", + "reload": "", + "hint": "" + }, + { + "id": 0, "label": "Boost", "localized": "تعزيز", "reload": "", "hint": "" }, { - "id": 23, + "id": 0, "label": "Base", - "localized": "الأساس", + "localized": "قاعدة", "reload": "", - "hint": "الإعدادات الأساسية المستخدمة لتشغيل توليد الصور" + "hint": "إعدادات أساسية تستخدم لتشغيل عملية إنشاء الصور" }, { - "id": 24, + "id": 0, "label": "Blend strength", - "localized": "قوة الدمج", + "localized": "قوة المزج", "reload": "", "hint": "" }, { - "id": 25, + "id": 0, "label": "Base model", "localized": "النموذج الأساسي", "reload": "", "hint": "النموذج الرئيسي المستخدم لجميع العمليات" }, { - "id": 26, + "id": 0, "label": "Backend", - "localized": "الخلفية البرمجية", + "localized": "المحرك الخلفي", "reload": "", "hint": "" }, { - "id": 27, + "id": 0, "label": "Benchmark steps", - "localized": "خطوات قياس الأداء", + "localized": "خطوات اختبار الأداء", "reload": "", "hint": "" }, { - "id": 28, + "id": 0, "label": "Benchmark level", - "localized": "مستوى قياس الأداء", + "localized": "مستوى اختبار الأداء", "reload": "", "hint": "" }, { - "id": 29, + "id": 0, + "label": "Benchmark Image width", + "localized": "عرض صورة اختبار الأداء", + "reload": "", + "hint": "" + }, + { + "id": 0, + "label": "Benchmark Image height", + "localized": "ارتفاع صورة اختبار الأداء", + "reload": "", + "hint": "" + }, + { + "id": 0, "label": "balanced", "localized": "متوازن", "reload": "", "hint": "" }, { - "id": 30, + "id": 0, "label": "block_level", - "localized": "مستوى_الكتلة", + "localized": "مستوى الكتلة", "reload": "", "hint": "" }, { - "id": 31, + "id": 0, "label": "Backend storage", - "localized": "تخزين الخلفية البرمجية", + "localized": "تخزين المحرك الخلفي", "reload": "", "hint": "" }, { - "id": 32, + "id": 0, "label": "BF16", "localized": "BF16", "reload": "", "hint": "استخدام دقة الفاصلة العائمة المعدلة بـ 16 بت للحسابات" }, { - "id": 33, + "id": 0, "label": "Batch matrix-matrix", - "localized": "ضرب المصفوفات الدفعي", + "localized": "مصفوفة-مصفوفة بالدفعة", "reload": "", - "hint": "ضرب المصفوفات الدفعي القياسي للانتباه (Attention). موثوق ولكنه غير فعال في استهلاك VRAM." + "hint": "عملية ضرب المصفوفات بالدفعة القياسية للانتباه (Attention). موثوقة ولكنها غير فعالة في استهلاك ذاكرة الفيديو VRAM." }, { - "id": 34, + "id": 0, "label": "BCFHW", "localized": "BCFHW", "reload": "", "hint": "" }, { - "id": 35, + "id": 0, "label": "BFCHW", "localized": "BFCHW", "reload": "", "hint": "" }, { - "id": 36, + "id": 0, "label": "BCHW", "localized": "BCHW", "reload": "", "hint": "" }, { - "id": 37, + "id": 0, "label": "Batch mode uses sequential seeds", "localized": "وضع الدفعة يستخدم بذوراً تسلسلية", "reload": "", "hint": "" }, { - "id": 38, + "id": 0, "label": "Batch uses original name", - "localized": "تستخدم الدفعة الاسم الأصلي", + "localized": "الدفعة تستخدم الاسم الأصلي", "reload": "", "hint": "" }, { - "id": 39, + "id": 0, "label": "Base images folder", "localized": "مجلد الصور الأساسي", "reload": "", "hint": "" }, { - "id": 40, + "id": 0, "label": "Base grids folder", "localized": "مجلد الشبكات الأساسي", "reload": "", "hint": "" }, { - "id": 41, + "id": 0, "label": "Build info on first access", "localized": "بناء المعلومات عند أول وصول", "reload": "", - "hint": "يمنع الخادم من بناء صفحة اللغة الإنجليزية عند بدء التشغيل ويقوم ببنائها عند طلبها فقط" + "hint": "يمنع الخادم من بناء صفحة EN عند بدء التشغيل، ويقوم ببنائها بدلاً من ذلك عند طلبها" }, { - "id": 42, + "id": 0, "label": "Beta Ratio", "localized": "نسبة بيتا", "reload": "", "hint": "" }, { - "id": 43, + "id": 0, "label": "BETA Block Weight Preset", - "localized": "الإعداد المسبق لوزن كتلة BETA", + "localized": "إعداد مسبق لأوزان كتلة بيتا", "reload": "", "hint": "" }, { - "id": 44, + "id": 0, "label": "Base model type", "localized": "نوع النموذج الأساسي", "reload": "", @@ -1306,1463 +1341,1540 @@ { "id": 0, "label": "caption_nav", - "localized": "تسمية توضيحية", + "localized": "caption_nav", "reload": "Caption", "hint": "تحليل الصور الموجودة وإنشاء أوصاف نصية" }, { - "id": 1, + "id": 0, "label": "contributors", - "localized": "المساهمون", - "reload": "Contributors", + "localized": "contributors", + "reload": "المساهمون", "hint": "" }, { - "id": 2, + "id": 0, + "label": "txt2img_corrections", + "localized": "txt2img_corrections", + "reload": "تصحيحات", + "hint": "التحكم في تصحيحات اللون/الحدة/السطوع للصورة أثناء عملية التوليد" + }, + { + "id": 0, "label": "txt2img_clear_prompt_btn", - "localized": "مسح", - "reload": "Clear", + "localized": "txt2img_clear_prompt_btn", + "reload": "مسح", "hint": "مسح المطالبات النصية" }, { - "id": 3, - "label": "component-940", - "localized": "التحقق من الحالة", - "reload": "Check status", + "id": 0, + "label": "component-980", + "localized": "component-980", + "reload": "تحقق من الحالة", "hint": "" }, { - "id": 4, + "id": 0, "label": "", - "localized": "تجميع (Composite)", - "reload": "Composite", + "localized": "", + "reload": "نسخ", "hint": "" }, { - "id": 5, + "id": 0, + "label": "", + "localized": "", + "reload": "تركيب (Composite)", + "hint": "" + }, + { + "id": 0, "label": "control_params_elements", - "localized": "التحكم", - "reload": "Control", - "hint": "إنشاء صورة بتوجيه كامل" + "localized": "control_params_elements", + "reload": "تحكم", + "hint": "إنشاء صورة مع توجيه كامل" }, { - "id": 6, + "id": 0, "label": "", - "localized": "ControlNet", + "localized": "", "reload": "ControlNet", - "hint": "تعتبر ControlNet نموذج توجيه متقدم" + "hint": "ControlNet هو نموذج توجيه متقدم" }, { - "id": 7, + "id": 0, "label": "caption_tab_controls", - "localized": "عناصر التحكم", - "reload": "Controls", + "localized": "caption_tab_controls", + "reload": "عناصر التحكم", "hint": "" }, { - "id": 8, + "id": 0, "label": "", - "localized": "تسمية توضيحية", + "localized": "", "reload": "CaptionCaption", "hint": "" }, { - "id": 9, + "id": 0, "label": "btn_console", - "localized": "منصة الأوامر (Console)", - "reload": "Console", + "localized": "btn_console", + "reload": "وحدة التحكم (Console)", "hint": "" }, { - "id": 10, + "id": 0, "label": "ui_update_check", - "localized": "التحقق من التحديثات", - "reload": "Check for updates", + "localized": "ui_update_check", + "reload": "التحقق من وجود تحديثات", "hint": "" }, { - "id": 11, + "id": 0, "label": "", - "localized": "سجل التغييرات", - "reload": "Change log", + "localized": "", + "reload": "سجل التغييرات", "hint": "" }, { - "id": 12, + "id": 0, "label": "", - "localized": "إعدادات الحوسبة", - "reload": "Compute Settings", - "hint": "الإعدادات المتعلقة بدقة الحوسبة، والانتباه المتقاطع (cross attention)، والتحسينات لمنصات الحوسبة" + "localized": "", + "reload": "إعدادات الحوسبة", + "hint": "إعدادات متعلقة بدقة الحوسبة، والانتباه المتقاطع (cross attention)، والتحسينات لمنصات الحوسبة" }, { - "id": 13, + "id": 0, "label": "", - "localized": "الحالي", - "reload": "Current", - "hint": "تحليل الوحدات داخل النموذج المحمل حالياً" + "localized": "", + "reload": "الحالي", + "hint": "تحليل الوحدات داخل النموذج المحمل حاليًا" }, { - "id": 14, + "id": 0, "label": "", - "localized": "CivitAI", + "localized": "", "reload": "CivitAI", "hint": "البحث عن النماذج وتنزيلها من CivitAI" }, { - "id": 15, - "label": "component-5503", - "localized": "حساب الهاش المفقود", - "reload": "Calculate missing hashes", + "id": 0, + "label": "component-5603", + "localized": "component-5603", + "reload": "حساب التجزئات (hashes) المفقودة", "hint": "" }, { - "id": 16, + "id": 0, "label": "", - "localized": "المجتمع", - "reload": "Community", + "localized": "", + "reload": "المجتمع", "hint": "" }, { - "id": 17, + "id": 0, "label": "", - "localized": "سحابي", - "reload": "Cloud", + "localized": "", + "reload": "السحابة", "hint": "" }, { - "id": 18, + "id": 0, "label": "txt2img_extra_details_close_desc", - "localized": "إغلاق", - "reload": "Close", + "localized": "txt2img_extra_details_close_desc", + "reload": "إغلاق", "hint": "" }, { - "id": 19, + "id": 0, "label": "change_checkpoint", - "localized": "تغيير النموذج", - "reload": "Change model", + "localized": "change_checkpoint", + "reload": "تغيير النموذج", "hint": "" }, { - "id": 20, + "id": 0, "label": "change_refiner", - "localized": "تغيير المنقي (Refiner)", - "reload": "Change refiner", + "localized": "change_refiner", + "reload": "تغيير المُنقّي (Refiner)", "hint": "" }, { - "id": 21, + "id": 0, "label": "change_vae", - "localized": "تغيير VAE", - "reload": "Change VAE", + "localized": "change_vae", + "reload": "تغيير VAE", "hint": "" }, { - "id": 22, + "id": 0, + "label": "change_unet", + "localized": "change_unet", + "reload": "تغيير UNet", + "hint": "" + }, + { + "id": 0, "label": "change_reference", - "localized": "تغيير المرجع", - "reload": "Change reference", + "localized": "change_reference", + "reload": "تغيير المرجع", "hint": "" }, { - "id": 23, + "id": 0, "label": "", - "localized": "تصحيحات", - "reload": "Corrections", - "hint": "التحكم في تصحيحات لون الصورة/الحدة/السطوع أثناء عملية الإنشاء" + "localized": "", + "reload": "تدرج الألوان (Color Grading)", + "hint": "تعديلات الألوان بعد التوليد، تُطبق لكل صورة بعد عملية التوليد وقبل تراكب القناع." }, { - "id": 24, + "id": 0, "label": "", - "localized": "طرق التحكم", - "reload": "Control Methods", + "localized": "", + "reload": "طرق التحكم", "hint": "" }, { - "id": 25, + "id": 0, "label": "", - "localized": "وسائط التحكم", - "reload": "Control Media", - "hint": "إضافة صورة الإدخال كصورة تهيئة منفصلة لمعالجة التحكم" + "localized": "", + "reload": "وسائط التحكم", + "hint": "إضافة صورة إدخال كصورة تهيئة منفصلة لمعالجة التحكم" }, { - "id": 26, + "id": 0, "label": "", - "localized": "ChronoEdit", + "localized": "", + "reload": "إنشاء فيديو", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", "reload": "ChronoEdit", "hint": "" }, { - "id": 27, + "id": 0, "label": "", - "localized": "الانتباه المتقاطع (Cross Attention)", - "reload": "Cross Attention", + "localized": "", + "reload": "الانتباه المتقاطع (Cross Attention)", "hint": "" }, { - "id": 28, + "id": 0, "label": "", - "localized": "تخطي CLIP", - "reload": "CLiP Skip", - "hint": "بارامتر التوقف المبكر لنموذج CLIP؛ 1 هو التوقف عند الطبقة الأخيرة كالمعتاد، 2 هو التوقف عند الطبقة قبل الأخيرة، وهكذا" + "localized": "", + "reload": "تخطي CLiP", + "hint": "معامل إيقاف مبكر لنموذج CLIP؛ 1 يعني التوقف عند الطبقة الأخيرة كالمعتاد، 2 يعني التوقف عند الطبقة قبل الأخيرة، وهكذا" }, { - "id": 29, + "id": 0, "label": "", - "localized": "Cache-DiT", + "localized": "", "reload": "Cache-DiT", "hint": "" }, { - "id": 30, + "id": 0, "label": "", - "localized": "CFG-Zero", + "localized": "", "reload": "CFG-Zero", "hint": "" }, { - "id": 31, + "id": 0, "label": "", - "localized": "مجلدات التخزين المؤقت", - "reload": "Cache folders", + "localized": "", + "reload": "مجلدات التخزين المؤقت", "hint": "" }, { - "id": 32, + "id": 0, "label": "", - "localized": "محمل نماذج مخصص", - "reload": "Custom model loader", + "localized": "", + "reload": "محمل نماذج مخصص", "hint": "" }, { - "id": 33, + "id": 0, "label": "", - "localized": "سجل العميل", - "reload": "Client log", + "localized": "", + "reload": "سجل العميل", "hint": "" }, { - "id": 34, + "id": 0, "label": "", - "localized": "تحليل CLIP", - "reload": "CLIP Analysis", + "localized": "", + "reload": "تحليل CLIP", "hint": "" }, { - "id": 35, + "id": 0, "label": "", - "localized": "السياق", - "reload": "Context", + "localized": "", + "reload": "السياق (Context)", "hint": "" }, { - "id": 36, + "id": 0, "label": "", - "localized": "وضع التصحيح", - "reload": "Correction mode", + "localized": "", + "reload": "التباين (Contrast)", + "hint": "يعدل الفرق بين المناطق المضيئة والمظلمة.
القيم الموجبة تزيد التباين، مما يجعل الداكن أكثر قتامة والفاتح أكثر سطوعاً.
القيم السالبة تجعل المدى النغمي أكثر تسطحاً نحو مظهر موحد." + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "درجة حرارة اللون", + "hint": "يغير درجة حرارة اللون بالكلفن.
القيم المنخفضة (مثل 2000K) تنتج نغمة دافئة كهرمانية. القيم الأعلى (مثل 12000K) تنتج نغمة باردة مزرقة.

القيمة الافتراضية 6500K هي ضوء النهار المحايد. تعمل عن طريق تغيير مقياس قنوات R/G/B لمحاكاة نقطة اللون الأبيض المستهدفة." + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "قص CLAHE", + "hint": "حد القص لموازنة الرسم البياني التكيفي المحدود بالتباين (CLAHE).
القيم الأعلى تسمح بمزيد من تعزيز التباين المحلي، مما يبرز التفاصيل في المناطق المسطحة.

اضبط على 0 للتعطيل. القيم النموذجية هي 1.0–3.0. القيم العالية جداً قد تؤدي إلى تضخيم الضوضاء." + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "شبكة CLAHE", + "hint": "حجم الشبكة لمناطق بلاط CLAHE.
الشبكات الأصغر (مثل 2–4) تنتج موازنة أكثر خشونة وعالمية.
الشبكات الأكبر (مثل 12–16) تعزز التفاصيل المحلية الدقيقة ولكن قد تضخم الضوضاء.

الافتراضي هو 8. نشط فقط عندما يكون قص CLAHE أكبر من 0." + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "وضع التصحيح", "hint": "" }, { - "id": 37, + "id": 0, "label": "", - "localized": "اللون", - "reload": "Color", + "localized": "", + "reload": "قص إلى بورتريه", + "hint": "قص صورة الإدخال إلى الوضع الطولي فقط قبل استخدامها كإدخال لـ IP adapter" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "رموز المفاهيم (Concept Tokens)", "hint": "" }, { - "id": 38, + "id": 0, "label": "", - "localized": "المركز", - "reload": "Center", + "localized": "", + "reload": "خريطة الألوان", "hint": "" }, { - "id": 39, + "id": 0, "label": "", - "localized": "تدرج الألوان", - "reload": "Color grading", + "localized": "", + "reload": "مقياس جيب التمام 1", "hint": "" }, { - "id": 40, + "id": 0, "label": "", - "localized": "قص بوضعية عمودية", - "reload": "Crop to portrait", - "hint": "قص صورة الإدخال لتكون عمودية فقط قبل استخدامها كمدخل لـ IP adapter" - }, - { - "id": 41, - "label": "", - "localized": "رموز المفاهيم (Concept Tokens)", - "reload": "Concept Tokens", + "localized": "", + "reload": "مقياس جيب التمام 2", "hint": "" }, { - "id": 42, + "id": 0, "label": "", - "localized": "خريطة الألوان", - "reload": "Colormap", + "localized": "", + "reload": "مقياس جيب التمام 3", "hint": "" }, { - "id": 43, + "id": 0, "label": "", - "localized": "مقياس جيب التمام 1", - "reload": "Cosine scale 1", + "localized": "", + "reload": "نموذج التخزين المؤقت", "hint": "" }, { - "id": 44, + "id": 0, "label": "", - "localized": "مقياس جيب التمام 2", - "reload": "Cosine scale 2", + "localized": "", + "reload": "مقياس جيب التمام", "hint": "" }, { - "id": 45, + "id": 0, "label": "", - "localized": "مقياس جيب التمام 3", - "reload": "Cosine scale 3", + "localized": "", + "reload": "خلفية جيب التمام", "hint": "" }, { - "id": 46, + "id": 0, "label": "", - "localized": "تخزين النموذج مؤقتاً", - "reload": "Cache model", + "localized": "", + "reload": "توجيه التحكم", "hint": "" }, { - "id": 47, + "id": 0, "label": "", - "localized": "مقياس جيب التمام", - "reload": "Cosine scale", + "localized": "", + "reload": "فاصلة", "hint": "" }, { - "id": 48, + "id": 0, "label": "", - "localized": "خلفية جيب التمام", - "reload": "Cosine Background", + "localized": "", + "reload": "الأعمدة", "hint": "" }, { - "id": 49, + "id": 0, "label": "", - "localized": "توجيه التحكم", - "reload": "Control guidance", + "localized": "", + "reload": "رقابة", "hint": "" }, { - "id": 50, + "id": 0, "label": "", - "localized": "التباين", - "reload": "Contrast", + "localized": "", + "reload": "التحقق من اللغة", "hint": "" }, { - "id": 51, + "id": 0, "label": "", - "localized": "فاصلة", - "reload": "comma", + "localized": "", + "reload": "التحقق من انتهاكات السياسة", "hint": "" }, { - "id": 52, + "id": 0, "label": "", - "localized": "أعمدة", - "reload": "Columns", + "localized": "", + "reload": "التحقق من الكلمات المحظورة", "hint": "" }, { - "id": 53, + "id": 0, "label": "", - "localized": "إنشاء فيديو", - "reload": "Create video", + "localized": "", + "reload": "التحكم في صور إدخال المعالجة المسبقة", "hint": "" }, { - "id": 54, + "id": 0, "label": "", - "localized": "رقابة", - "reload": "Censor", + "localized": "", + "reload": "التحكم في تجاوز قوة إزالة الضوضاء", "hint": "" }, { - "id": 55, + "id": 0, "label": "", - "localized": "التحقق من اللغة", - "reload": "Check language", + "localized": "", + "reload": "تغير الألوان", "hint": "" }, { - "id": 56, + "id": 0, "label": "", - "localized": "التحقق من انتهاكات السياسة", - "reload": "Check policy violations", + "localized": "", + "reload": "معدل التغيير", "hint": "" }, { - "id": 57, + "id": 0, "label": "", - "localized": "التحقق من الكلمات المحظورة", - "reload": "Check banned words", + "localized": "", + "reload": "السياق اللاحق", "hint": "" }, { - "id": 58, + "id": 0, "label": "", - "localized": "معالجة مسبقة لصور إدخال التحكم", - "reload": "Control preprocess input images", + "localized": "", + "reload": "قناع السياق", "hint": "" }, { - "id": 59, + "id": 0, "label": "", - "localized": "تجاوز قوة تقليل الضوضاء للتحكم", - "reload": "Control override denoise strength", + "localized": "", + "reload": "التحكم فقط", + "hint": "يستخدم هذا فقط مدخلات التحكم أدناه كمصدر لأي مهام ControlNet أو IP Adapter بناءً على خياراتنا المختلفة." + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "وضع CN", "hint": "" }, { - "id": 60, + "id": 0, "label": "", - "localized": "تباين الألوان", - "reload": "Color variation", + "localized": "", + "reload": "قوة CN", "hint": "" }, { - "id": 61, + "id": 0, "label": "", - "localized": "معدل التغيير", - "reload": "Change rate", + "localized": "", + "reload": "بداية CN", "hint": "" }, { - "id": 62, + "id": 0, "label": "", - "localized": "السياق بعد", - "reload": "Context after", + "localized": "", + "reload": "نهاية CN", "hint": "" }, { - "id": 63, + "id": 0, "label": "", - "localized": "قناع السياق", - "reload": "Context mask", + "localized": "", + "reload": "بلاطات CN", "hint": "" }, { - "id": 64, + "id": 0, "label": "", - "localized": "التحكم فقط", - "reload": "Control only", - "hint": "يستخدم هذا فقط إدخال التحكم أدناه كمصدر لأي مهام من نوع ControlNet أو IP Adapter بناءً على خياراتنا المتنوعة." - }, - { - "id": 65, - "label": "", - "localized": "وضع CN", - "reload": "CN Mode", + "localized": "", + "reload": "عامل التحكم", "hint": "" }, { - "id": 66, + "id": 0, "label": "", - "localized": "قوة CN", - "reload": "CN Strength", - "hint": "" - }, - { - "id": 67, - "label": "", - "localized": "بداية CN", - "reload": "CN Start", - "hint": "" - }, - { - "id": 68, - "label": "", - "localized": "نهاية CN", - "reload": "CN End", - "hint": "" - }, - { - "id": 69, - "label": "", - "localized": "مربعات CN", - "reload": "CN Tiles", - "hint": "" - }, - { - "id": 70, - "label": "", - "localized": "معامل التحكم", - "reload": "Control factor", - "hint": "" - }, - { - "id": 71, - "label": "", - "localized": "ControlNet-XS", + "localized": "", "reload": "ControlNet-XS", "hint": "" }, { - "id": 72, + "id": 0, "label": "", - "localized": "خشن", - "reload": "Coarse", + "localized": "", + "reload": "خشن", "hint": "" }, { - "id": 73, + "id": 0, "label": "", - "localized": "خريطة الألوان", - "reload": "Color map", + "localized": "", + "reload": "خريطة الألوان", "hint": "" }, { - "id": 74, + "id": 0, "label": "", - "localized": "قص للملاءمة", - "reload": "Crop to fit", - "hint": "إذا كانت أبعاد صورتك المصدر تختلف عن الأبعاد المستهدفة، ستقوم هذه الوظيفة بملاءمة صورتك المكبرة داخل صورة الحجم المستهدف. سيتم قص الأجزاء الزائدة." + "localized": "", + "reload": "القص للملاءمة", + "hint": "إذا كانت أبعاد صورتك المصدر (مثلاً 512x510) تختلف عن أبعادك المستهدفة (مثلاً 1024x768)، فستقوم هذه الوظيفة بملاءمة صورتك المكبرة داخل حجم صورتك المستهدف. سيتم قص الأجزاء الزائدة." }, { - "id": 75, + "id": 0, "label": "", - "localized": "نموذج CLIP", - "reload": "CLiP Model", - "hint": "نموذج CLIP المستخدم لمطابقة تشابه الصورة والنص. النماذج الأكبر (ViT-L، ViT-H) أكثر دقة ولكنها أبطأ وتستهلك ذاكرة فيديو أكبر." + "localized": "", + "reload": "نموذج CLiP", + "hint": "نموذج CLIP المستخدم لمطابقة التشابه بين الصورة والنص.
النماذج الأكبر (ViT-L, ViT-H) أكثر دقة ولكنها أبطأ وتستهلك المزيد من ذاكرة الفيديو (VRAM)." }, { - "id": 76, + "id": 0, "label": "", - "localized": "نموذج التسمية التوضيحية", - "reload": "Caption Model", - "hint": "نموذج BLIP المستخدم لإنشاء التسمية التوضيحية الأولية للصورة. يصف نموذج التسمية محتوى الصورة الذي يقوم CLIP بعد ذلك بإثرائه بمصطلحات النمط والنكهة." + "localized": "", + "reload": "نموذج التعليق (Caption Model)", + "hint": "نموذج BLIP المستخدم لإنشاء تعليق الصورة الأولي.
يصف نموذج التعليق محتوى الصورة الذي يقوم CLiP بعد ذلك بإثرائه بمصطلحات النمط والنكهة." }, { - "id": 77, + "id": 0, "label": "", - "localized": "حجم المجموعة (Chunk)", - "reload": "Chunk Size", - "hint": "حجم الدفعة لمعالجة مرشحي الوصف. القيم الأعلى تسرع الاستجواب ولكنها تزيد من استخدام ذاكرة الفيديو." - }, - { - "id": 78, - "label": "", - "localized": "عدد حزم CLIP (Beams)", - "reload": "CLiP Num Beams", - "hint": "عدد الحزم للبحث أثناء إنشاء التسمية التوضيحية. القيم الأعلى تبحث في احتمالات أكثر ولكنها أبطأ." - }, - { - "id": 79, - "label": "", - "localized": "عتبة الشخصية", - "reload": "Character threshold", - "hint": "عتبة الثقة للوسوم الخاصة بالشخصيات. يتم تضمين الوسوم التي تزيد ثقتها عن هذه العتبة فقط. القيم الأعلى أكثر انتقائية، والقيم الأقل تتضمن مطابقات محتملة أكثر." - }, - { - "id": 80, - "label": "", - "localized": "الانتباه المتقاطع", - "reload": "Cross-attention", + "localized": "", + "reload": "clip: الطول الأقصى", "hint": "" }, { - "id": 81, + "id": 0, "label": "", - "localized": "cpu", - "reload": "cpu", - "hint": "يستخدم المعالج والرام فقط: الأبطأ ولكن الأقل عرضة لنفاد الذاكرة" - }, - { - "id": 82, - "label": "", - "localized": "النماذج المخزنة مؤقتاً", - "reload": "Cached models", - "hint": "عدد النماذج التي سيتم تخزينها في الرام للوصول السريع" - }, - { - "id": 83, - "label": "", - "localized": "مدمج", - "reload": "combined", + "localized": "", + "reload": "clip: حجم المقطع", "hint": "" }, { - "id": 84, + "id": 0, "label": "", - "localized": "نسبة الضغط", - "reload": "Compress ratio", + "localized": "", + "reload": "clip: الحد الأدنى للنكهات", "hint": "" }, { - "id": 85, + "id": 0, "label": "", - "localized": "compel", + "localized": "", + "reload": "clip: الحد الأقصى للنكهات", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "clip: الوسائط", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "clip: عدد الحزم (beams)", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "عتبة الشخصية", + "hint": "عتبة الثقة للوسوم الخاصة بالشخصيات (مثل أسماء الشخصيات، سمات معينة).
يتم تضمين الوسوم التي تزيد ثقتها عن هذه العتبة فقط.
القيم الأعلى تكون أكثر انتقائية، والقيم الأقل تتضمن المزيد من التطابقات المحتملة.
غير مدعوم بواسطة نماذج DeepBooru." + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "الانتباه المتقاطع (Cross-attention)", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "وحدة المعالجة المركزية (CPU)", + "hint": "يستخدم المعالج وذاكرة الوصول العشوائي فقط: الأبطأ ولكنه الأقل عرضة لنفاد الذاكرة (OOM)" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "النماذج المخزنة مؤقتاً", + "hint": "عدد النماذج المراد تخزينها في الذاكرة للوصول السريع" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "مدمج", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "نسبة الضغط", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", "reload": "compel", "hint": "" }, { - "id": 86, + "id": 0, "label": "", - "localized": "القنوات أخيراً", - "reload": "Channels last", + "localized": "", + "reload": "القنوات الأخيرة", "hint": "" }, { - "id": 87, + "id": 0, "label": "", - "localized": "اختبار cuDNN للعمق الكامل", - "reload": "cuDNN full-depth benchmark", + "localized": "", + "reload": "قياس cuDNN للعمق الكامل", "hint": "" }, { - "id": 88, + "id": 0, "label": "", - "localized": "حد اختبار cuDNN", - "reload": "cuDNN benchmark limit", + "localized": "", + "reload": "حد قياس cuDNN", "hint": "" }, { - "id": 89, + "id": 0, "label": "", - "localized": "cudaMallocAsync", + "localized": "", "reload": "cudaMallocAsync", - "hint": "يستخدم مخصص ذاكرة CUDA غير المتزامن. يحسن الأداء وتجزئة ذاكرة الفيديو، ولكنه قد يسبب عدم استقرار في بعض المعالجات الرسومية." + "hint": "يستخدم مخصص الذاكرة غير المتزامن لـ CUDA. يحسن الأداء وتجزئة ذاكرة الفيديو (VRAM)، ولكنه قد يسبب عدم استقرار في بعض كروت الشاشة." }, { - "id": 90, + "id": 0, "label": "", - "localized": "تفعيل تخطي CLIP", - "reload": "CLiP skip enabled", + "localized": "", + "reload": "تمكين تخطي CLiP", "hint": "" }, { - "id": 91, + "id": 0, "label": "", - "localized": "تفعيل Cache-DiT", - "reload": "Cache-DiT enabled", + "localized": "", + "reload": "تمكين Cache-DiT", "hint": "" }, { - "id": 92, + "id": 0, "label": "", - "localized": "كتل حساب Cache-DiT F", - "reload": "Cache-DiT F-compute blocks", + "localized": "", + "reload": "كتل الحوسبة الأمامية Cache-DiT", "hint": "" }, { - "id": 93, + "id": 0, "label": "", - "localized": "كتل حساب Cache-DiT B", - "reload": "Cache-DiT B-compute blocks", + "localized": "", + "reload": "كتل الحوسبة الخلفية Cache-DiT", "hint": "" }, { - "id": 94, + "id": 0, "label": "", - "localized": "عتبة فرق بقايا Cache-DiT", - "reload": "Cache-DiT residual diff threshold", + "localized": "", + "reload": "عتبة اختلاف البواقي لـ Cache-DiT", "hint": "" }, { - "id": 95, + "id": 0, "label": "", - "localized": "خطوات إحماء Cache-DiT", - "reload": "Cache-DiT warmup steps", + "localized": "", + "reload": "خطوات الإحماء لـ Cache-DiT", "hint": "" }, { - "id": 96, + "id": 0, "label": "", - "localized": "تفعيل CFG-Zero", - "reload": "CFG-Zero enabled", + "localized": "", + "reload": "تمكين CFG-Zero", "hint": "" }, { - "id": 97, + "id": 0, "label": "", - "localized": "CFG-Zero star", + "localized": "", "reload": "CFG-Zero star", "hint": "" }, { - "id": 98, + "id": 0, "label": "", - "localized": "خطوات CFG-Zero", - "reload": "CFG-Zero steps", + "localized": "", + "reload": "خطوات CFG-Zero", "hint": "" }, { - "id": 99, + "id": 0, "label": "", - "localized": "cudagraphs", + "localized": "", "reload": "cudagraphs", "hint": "" }, { - "id": 100, + "id": 0, "label": "", - "localized": "تنظيف المجلد المؤقت عند بدء التشغيل", - "reload": "Cleanup temporary folder on startup", + "localized": "", + "reload": "تنظيف المجلد المؤقت عند البدء", "hint": "" }, { - "id": 101, + "id": 0, "label": "", - "localized": "إنشاء أرشيف ZIP لصور متعددة", - "reload": "Create ZIP archive for multiple images", + "localized": "", + "reload": "إنشاء أرشيف ZIP للصور المتعددة", "hint": "" }, { - "id": 102, + "id": 0, "label": "", - "localized": "تغطية (cover)", - "reload": "cover", - "hint": "تغطية كامل المساحة" + "localized": "", + "reload": "تغطية (cover)", + "hint": "تغطية كامل المنطقة" }, { - "id": 103, + "id": 0, "label": "", - "localized": "عرض مدمج", - "reload": "Compact view", + "localized": "", + "reload": "عرض مضغوط", "hint": "" }, { - "id": 104, + "id": 0, "label": "", - "localized": "تخزين نتائج مشفر النصوص مؤقتاً", - "reload": "Cache text encoder results", + "localized": "", + "reload": "رمز CivitAI", "hint": "" }, { - "id": 105, + "id": 0, "label": "", - "localized": "احتواء (contain)", - "reload": "contain", + "localized": "", + "reload": "حفظ CivitAI في مجلدات فرعية", "hint": "" }, { - "id": 106, + "id": 0, "label": "", - "localized": "محددات كلمات Ctrl+سهم", - "reload": "Ctrl+up/down word delimiters", + "localized": "", + "reload": "قالب المجلد الفرعي لـ CivitAI", "hint": "" }, { - "id": 107, + "id": 0, "label": "", - "localized": "دقة Ctrl+سهم عند التحرير (attention:1.1)", - "reload": "Ctrl+up/down precision when editing (attention:1.1)", + "localized": "", + "reload": "تجاهل تنزيلات CivitAI في حال عدم تطابق التجزئة", "hint": "" }, { - "id": 108, + "id": 0, "label": "", - "localized": "دقة Ctrl+سهم عند التحرير ", - "reload": "Ctrl+up/down precision when editing ", + "localized": "", + "reload": "تخزين نتائج مشفر النص (text encoder) مؤقتاً", "hint": "" }, { - "id": 109, + "id": 0, "label": "", - "localized": "VAEs المخزنة مؤقتاً", - "reload": "Cached VAEs", + "localized": "", + "reload": "احتواء (contain)", "hint": "" }, { - "id": 110, + "id": 0, "label": "", - "localized": "ckpt", + "localized": "", + "reload": "فواصل الكلمات Ctrl+أعلى/أسفل", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "دقة Ctrl+أعلى/أسفل عند التحرير (attention:1.1)", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "دقة Ctrl+أعلى/أسفل عند التحرير ", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "VAEs المخزنة مؤقتاً", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", "reload": "ckpt", "hint": "" }, { - "id": 111, + "id": 0, "label": "", - "localized": "قائمة مفصولة بفاصلة مع قوة اختيارية لكل LoRA", - "reload": "Comma separated list with optional strength per LoRA", + "localized": "", + "reload": "قائمة مفصولة بفواصل مع قوة اختيارية لكل LoRA", "hint": "" }, { - "id": 112, + "id": 0, "label": "", - "localized": "رمز CivitAI", - "reload": "CivitAI token", + "localized": "", + "reload": "خط أنابيب مخصص", "hint": "" }, { - "id": 113, + "id": 0, "label": "", - "localized": "خط أنابيب مخصص", - "reload": "Custom pipeline", + "localized": "", + "reload": "نموذج مخصص", "hint": "" }, { - "id": 114, + "id": 0, "label": "", - "localized": "نموذج مخصص", - "reload": "Custom model", + "localized": "", + "reload": "وحدة ControlNet 1", "hint": "" }, { - "id": 115, + "id": 0, "label": "", - "localized": "وحدة ControlNet 1", - "reload": "ControlNet unit 1", + "localized": "", + "reload": "وحدة ControlNet 2", "hint": "" }, { - "id": 116, + "id": 0, "label": "", - "localized": "وحدة ControlNet 2", - "reload": "ControlNet unit 2", + "localized": "", + "reload": "وحدة ControlNet 3", "hint": "" }, { - "id": 117, + "id": 0, "label": "", - "localized": "وحدة ControlNet 3", - "reload": "ControlNet unit 3", + "localized": "", + "reload": "وحدة ControlNet 4", "hint": "" }, { - "id": 118, + "id": 0, "label": "", - "localized": "وحدة ControlNet 4", - "reload": "ControlNet unit 4", + "localized": "", + "reload": "وحدة ControlNet-XS 1", "hint": "" }, { - "id": 119, + "id": 0, "label": "", - "localized": "وحدة ControlNet-XS 1", - "reload": "ControlNet-XS unit 1", + "localized": "", + "reload": "وحدة ControlNet-XS 2", "hint": "" }, { - "id": 120, + "id": 0, "label": "", - "localized": "وحدة ControlNet-XS 2", - "reload": "ControlNet-XS unit 2", + "localized": "", + "reload": "وحدة ControlNet-XS 3", "hint": "" }, { - "id": 121, + "id": 0, "label": "", - "localized": "وحدة ControlNet-XS 3", - "reload": "ControlNet-XS unit 3", + "localized": "", + "reload": "وحدة ControlNet-XS 4", "hint": "" }, { - "id": 122, + "id": 0, "label": "", - "localized": "وحدة ControlNet-XS 4", - "reload": "ControlNet-XS unit 4", + "localized": "", + "reload": "وحدة Control-LLLite 1", "hint": "" }, { - "id": 123, + "id": 0, "label": "", - "localized": "وحدة Control-LLLite 1", - "reload": "Control-LLLite unit 1", + "localized": "", + "reload": "وحدة Control-LLLite 2", "hint": "" }, { - "id": 124, + "id": 0, "label": "", - "localized": "وحدة Control-LLLite 2", - "reload": "Control-LLLite unit 2", + "localized": "", + "reload": "وحدة Control-LLLite 3", "hint": "" }, { - "id": 125, + "id": 0, "label": "", - "localized": "وحدة Control-LLLite 3", - "reload": "Control-LLLite unit 3", + "localized": "", + "reload": "وحدة Control-LLLite 4", "hint": "" }, { - "id": 126, + "id": 0, "label": "", - "localized": "وحدة Control-LLLite 4", - "reload": "Control-LLLite unit 4", + "localized": "", + "reload": "إعدادات التحكم", "hint": "" }, { - "id": 127, + "id": 0, "label": "", - "localized": "إعدادات التحكم", - "reload": "Control settings", - "hint": "" - }, - { - "id": 128, - "label": "", - "localized": "كاني (Canny)", + "localized": "", "reload": "Canny", "hint": "" }, { - "id": 129, + "id": 0, "label": "", - "localized": "شرط (Condition)", - "reload": "Condition", + "localized": "", + "reload": "الشرط (Condition)", "hint": "" }, { - "id": 130, + "id": 0, "label": "", - "localized": "تسمية توضيحية: دفعة", - "reload": "Caption: Batch", + "localized": "", + "reload": "التعليق: خيارات متقدمة", "hint": "" }, { - "id": 131, + "id": 0, "label": "", - "localized": "عناصر التحكم", - "reload": "Control elements", - "hint": "عناصر التحكم هي نماذج متقدمة يمكنها توجيه عملية الإنشاء نحو النتيجة المرجوة" + "localized": "", + "reload": "التعليق: دفعة (Batch)", + "hint": "" + }, + { + "id": 0, + "label": "", + "localized": "", + "reload": "عناصر التحكم", + "hint": "عناصر التحكم هي نماذج متقدمة يمكنها توجيه عملية التوليد نحو النتيجة المرغوبة" } ], "d": [ { - "id": -1, + "id": 0, "label": "Docs", - "localized": "الوثائق", + "localized": "وثائق", "reload": "", - "hint": "الوثائق والمستندات التعليمية" + "hint": "" }, { - "id": -1, + "id": 0, "label": "Discord", "localized": "ديسكورد", "reload": "", - "hint": "رابط مجتمع ديسكورد" + "hint": "" }, { - "id": -1, + "id": 1, "label": "Detail", - "localized": "التفاصيل", + "localized": "تفاصيل", "reload": "", - "hint": "يقوم المحسن (Detailer) بتشغيل عملية توليد إضافية بدقة أعلى للأجسام المكتشفة" + "hint": "يقوم الـ Detailer بإجراء عملية توليد إضافية بدقة أعلى للكائنات المكتشفة" }, { - "id": -1, + "id": 2, "label": "Delete", "localized": "حذف", "reload": "", "hint": "حذف الصورة" }, { - "id": -1, + "id": 3, "label": "Default", "localized": "افتراضي", "reload": "", "hint": "" }, { - "id": -1, + "id": 4, "label": "Download updates", "localized": "تنزيل التحديثات", "reload": "", "hint": "" }, { - "id": -1, + "id": 5, "label": "Download model", "localized": "تنزيل النموذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 6, "label": "Diffusers", - "localized": "Diffusers", + "localized": "ناشرات (Diffusers)", "reload": "", "hint": "" }, { - "id": -1, + "id": 7, "label": "Distilled", "localized": "مقطر (Distilled)", "reload": "", "hint": "" }, { - "id": -1, + "id": 8, "label": "Description", - "localized": "الوصف", + "localized": "وصف", "reload": "", "hint": "" }, { - "id": -1, + "id": 9, "label": "Details", - "localized": "التفاصيل", + "localized": "تفاصيل", "reload": "", "hint": "" }, { - "id": -1, + "id": 10, "label": "Detailer", - "localized": "المحسن (Detailer)", + "localized": "المفصل (Detailer)", "reload": "", - "hint": "يقوم المحسن بتشغيل عملية توليد إضافية بدقة أعلى للأجسام المكتشفة" + "hint": "يقوم الـ Detailer بإجراء عملية توليد إضافية بدقة أعلى للكائنات المكتشفة" }, { - "id": -1, + "id": 11, "label": "Denoise", "localized": "إزالة الضجيج", "reload": "", - "hint": "إعدادات إزالة الضجيج (Denoising). تعني القيمة الأعلى السماح بتغيير المزيد من محتوى الصورة الحالي أثناء التوليد" + "hint": "إعدادات إزالة الضجيج. تعني قيمة إزالة ضجيج أعلى أن هناك مجالاً أكبر لتغيير محتوى الصورة الحالي أثناء التوليد" }, { - "id": -1, + "id": 12, "label": "DirectML", "localized": "DirectML", "reload": "", "hint": "" }, { - "id": -1, + "id": 13, "label": "Download model from huggingface", - "localized": "تنزيل النموذج من Hugging Face", + "localized": "تنزيل النموذج من Huggingface", "reload": "", "hint": "" }, { - "id": -1, + "id": 14, "label": "Dropdown", "localized": "قائمة منسدلة", "reload": "", "hint": "" }, { - "id": -1, + "id": 15, "label": "dynamic", "localized": "ديناميكي", "reload": "", - "hint": "يقوم الإزاحة الديناميكية بضبط جدول إزالة الضجيج تلقائياً بناءً على دقة صورتك. يقوم المجدول بالاستكمال بين الإزاحة الأساسية والقصوى بناءً على دقة الصورة الفعلية. التمكين يعطل إزاحة التدفق الثابتة." + "hint": "يقوم التغيير الديناميكي (Dynamic shifting) بضبط جدول إزالة الضجيج تلقائياً بناءً على دقة صورتك. يقوم المجدول بالاستيفاء بين base_shift و max_shift بناءً على دقة الصورة الفعلية. تفعيل هذا الخيار يعطل إزاحة التدفق الثابت (Static Flow shift)." }, { - "id": -1, + "id": 16, "label": "Detailer models", - "localized": "نماذج المحسن", + "localized": "نماذج المفصل", "reload": "", - "hint": "اختر نماذج الكشف لاستخدامها في التحسين" + "hint": "اختر نماذج الكشف لاستخدامها في عملية التفصيل" }, { - "id": -1, + "id": 17, "label": "Detailer list", - "localized": "قائمة المحسن", + "localized": "قائمة المفصل", "reload": "", "hint": "" }, { - "id": -1, + "id": 18, "label": "Detailer classes", - "localized": "فئات المحسن", + "localized": "فئات المفصل", "reload": "", - "hint": "حدد فئات معينة للاستخدام إذا كان نموذج المحسن المختار متعدد الفئات" + "hint": "حدد فئات معينة لاستخدامها إذا كان نموذج المفصل المختار نموذجاً متعدد الفئات" }, { - "id": -1, + "id": 19, "label": "Detailer prompt", - "localized": "وصف المحسن", + "localized": "مطالبة المفصل", "reload": "", - "hint": "استخدم وصفاً منفصلاً للمحسن. إذا لم يتوفر، فسيستخدم الوصف الأساسي" + "hint": "استخدم مطالبة منفصلة للمفصل. إذا لم يتم تحديدها، سيتم استخدام المطالبة الأساسية" }, { - "id": -1, + "id": 20, "label": "Detailer negative prompt", - "localized": "الوصف السلبي للمحسن", + "localized": "المطالبة السلبية للمفصل", "reload": "", - "hint": "استخدم وصفاً سلبياً منفصلاً للمحسن. إذا لم يتوفر، فسيستخدم الوصف السلبي الأساسي" + "hint": "استخدم مطالبة سلبية منفصلة للمفصل. إذا لم يتم تحديدها، سيتم استخدام المطالبة السلبية الأساسية" }, { - "id": -1, + "id": 21, "label": "Detailer steps", - "localized": "خطوات المحسن", + "localized": "خطوات المفصل", "reload": "", - "hint": "عدد الخطوات لتشغيل عملية المحسن" + "hint": "عدد الخطوات المطلوب تنفيذها لعملية التفصيل" }, { - "id": -1, + "id": 22, "label": "Detailer strength", - "localized": "قوة المحسن", + "localized": "قوة المفصل", "reload": "", - "hint": "قوة إزالة الضجيج لعملية المحسن" + "hint": "قوة إزالة الضجيج لعملية التفصيل" }, { - "id": -1, + "id": 23, "label": "Detailer resolution", - "localized": "دقة المحسن", + "localized": "دقة المفصل", "reload": "", "hint": "" }, { - "id": -1, + "id": 24, "label": "Denoising batch size", "localized": "حجم دفعة إزالة الضجيج", "reload": "", "hint": "" }, { - "id": -1, + "id": 25, "label": "Dilate tau", - "localized": "توسيع تاو (Dilate tau)", + "localized": "معامل التمدد (Dilate tau)", "reload": "", "hint": "" }, { - "id": -1, + "id": 26, "label": "Draw legend", - "localized": "رسم وسيلة الإيضاح", + "localized": "رسم المفتاح", "reload": "", "hint": "" }, { - "id": -1, + "id": 27, "label": "Denoising strength", "localized": "قوة إزالة الضجيج", "reload": "", - "hint": "تحدد مدى احترام الخوارزمية لمحتوى الصورة. عند القيمة 0، لن يتغير شيء، وعند 1 ستحصل على صورة غير ذات صلة. مع قيم أقل من 1.0، ستستغرق المعالجة خطوات أقل مما يحدده منزلق خطوات أخذ العينات." + "hint": "يحدد مدى تجاهل الخوارزمية لمحتوى الصورة. عند 0، لن يتغير شيء، وعند 1 ستحصل على صورة غير مرتبطة. مع قيم أقل من 1.0، ستستغرق المعالجة خطوات أقل مما يحدده شريط تمرير خطوات العينة (Sampling Steps)" }, { - "id": -1, + "id": 28, "label": "Denoise start", - "localized": "بدء إزالة الضجيج", + "localized": "بداية إزالة الضجيج", "reload": "", - "hint": "تجاوز قوة إزالة الضجيج من خلال تحديد متى يجب أن ينتهي النموذج الأساسي ومتى يبدأ المنقح (refiner). ينطبق فقط عند استخدام المنقح. إذا تم ضبطه على 0 أو 1، فسيتم استخدام قوة إزالة الضجيج العادية." + "hint": "تجاوز قوة إزالة الضجيج من خلال تحديد متى يجب أن ينتهي النموذج الأساسي ومتى يجب أن يبدأ النموذج المحسّن (refiner). ينطبق فقط عند استخدام المحسّن. إذا تم ضبطه على 0 أو 1، فسيتم استخدام قوة إزالة الضجيج" }, { - "id": -1, + "id": 29, "label": "down", "localized": "أسفل", "reload": "", "hint": "" }, { - "id": -1, + "id": 30, "label": "Decode chunks", "localized": "فك تشفير الأجزاء", "reload": "", "hint": "" }, { - "id": -1, + "id": 31, "label": "Dilate", - "localized": "توسيع", + "localized": "تمدد", "reload": "", "hint": "" }, { - "id": -1, + "id": 32, "label": "Depth and normal", - "localized": "العمق والخرائط الطبيعية (Normal)", + "localized": "العمق والعادي", "reload": "", "hint": "" }, { - "id": -1, + "id": 33, "label": "Distance threshold", "localized": "عتبة المسافة", "reload": "", "hint": "" }, { - "id": -1, + "id": 34, "label": "Depth threshold", "localized": "عتبة العمق", "reload": "", "hint": "" }, { - "id": -1, + "id": 35, "label": "Denoising steps", "localized": "خطوات إزالة الضجيج", "reload": "", "hint": "" }, { - "id": -1, + "id": 36, "label": "Depth map", "localized": "خريطة العمق", "reload": "", "hint": "" }, { - "id": -1, + "id": 37, "label": "Dynamic shift", "localized": "إزاحة ديناميكية", "reload": "", "hint": "" }, { - "id": -1, + "id": 38, "label": "Duration", "localized": "المدة", "reload": "", "hint": "" }, { - "id": -1, + "id": 39, "label": "Device Info", "localized": "معلومات الجهاز", "reload": "", "hint": "" }, { - "id": -1, + "id": 40, "label": "Diffusers load using Run:ai streamer", - "localized": "تحميل Diffusers باستخدام Run:ai streamer", + "localized": "تحميل الناشرات باستخدام Run:ai streamer", "reload": "", "hint": "" }, { - "id": -1, + "id": 41, "label": "Disable accelerate", - "localized": "تعطيل التسريع (accelerate)", + "localized": "تعطيل التسريع (Accelerate)", "reload": "", "hint": "" }, { - "id": -1, + "id": 42, "label": "Disable T5 text encoder", - "localized": "تعطيل مشفر النصوص T5", + "localized": "تعطيل مشفر نصوص T5", "reload": "", "hint": "" }, { - "id": -1, + "id": 43, "label": "Dynamic loss threshold", - "localized": "عتبة الفقد الديناميكية", + "localized": "عتبة الخسارة الديناميكية", "reload": "", "hint": "" }, { - "id": -1, + "id": 44, "label": "Dequantize using torch.compile", "localized": "إلغاء التكميم باستخدام torch.compile", "reload": "", "hint": "" }, { - "id": -1, + "id": 45, "label": "Dequantize using full precision", "localized": "إلغاء التكميم باستخدام الدقة الكاملة", "reload": "", "hint": "" }, { - "id": -1, + "id": 46, "label": "Disabled", "localized": "معطل", "reload": "", "hint": "" }, { - "id": -1, + "id": 47, "label": "Dynamic Attention BMM", "localized": "انتباه ديناميكي BMM", "reload": "", - "hint": "يجري حسابات الانتباه (Attention) في خطوات بدلاً من دفعة واحدة. زمن استدلال أبطأ، ولكن تقليل كبير في استهلاك الذاكرة." + "hint": "يقوم بحساب الانتباه على خطوات بدلاً من القيام به دفعة واحدة. أوقات استنتاج أبطأ، ولكن تقليل كبير في استخدام الذاكرة" }, { - "id": -1, + "id": 48, "label": "Dynamic attention", "localized": "انتباه ديناميكي", "reload": "", - "hint": "يضبط حساب الانتباه ديناميكياً لكل خطوة. يوفر ذاكرة كرت الشاشة (VRAM) ولكنه يبطئ التوليد." + "hint": "يضبط حساب الانتباه ديناميكياً لكل خطوة. يوفر في ذاكرة الفيديو (VRAM) ولكنه يبطئ التوليد." }, { - "id": -1, + "id": 49, "label": "Dynamic Attention slicing rate", - "localized": "معدل تقسيم الانتباه الديناميكي", + "localized": "معدل تقطيع الانتباه الديناميكي", "reload": "", "hint": "" }, { - "id": -1, + "id": 50, "label": "Dynamic Attention trigger rate", - "localized": "معدل تفعيل الانتباه الديناميكي", + "localized": "معدل تشغيل الانتباه الديناميكي", "reload": "", "hint": "" }, { - "id": -1, + "id": 51, "label": "Deterministic mode", - "localized": "الوضع الحتمي", + "localized": "وضع حتمي", "reload": "", - "hint": "يفرض مخرجات متطابقة عبر عمليات التوليد المختلفة. مفيد لإعادة الإنتاج، ولكنه قد يعطل بعض التحسينات." + "hint": "يجبر المخرجات على أن تكون حتمية عبر التشغيلات. مفيد لإمكانية التكرار، ولكنه قد يعطل بعض التحسينات." }, { - "id": -1, + "id": 52, "label": "DirectML retry ops for NaN", - "localized": "محاولة عمليات DirectML للقيم غير الرقمية (NaN)", + "localized": "إعادة محاولة عمليات DirectML في حالة NaN", "reload": "", "hint": "" }, { - "id": -1, + "id": 53, "label": "deep-cache", - "localized": "deep-cache", + "localized": "الذاكرة المؤقتة العميقة (Deep-cache)", "reload": "", "hint": "" }, { - "id": -1, + "id": 54, "label": "DeepCache cache interval", - "localized": "فترة تخزين DeepCache المؤقت", + "localized": "فاصل الذاكرة المؤقتة DeepCache", "reload": "", "hint": "" }, { - "id": -1, + "id": 55, "label": "Directory for temporary images; leave empty for default", - "localized": "مجلد الصور المؤقتة؛ اتركه فارغاً للافتراضي", + "localized": "دليل الصور المؤقتة؛ اترك فارغاً للافترضي", "reload": "", "hint": "" }, { - "id": -1, + "id": 56, "label": "Do not display video output in UI", - "localized": "عدم عرض مخرجات الفيديو في الواجهة", + "localized": "لا تعرض مخرجات الفيديو في واجهة المستخدم", "reload": "", "hint": "" }, { - "id": -1, + "id": 57, "label": "Directory name pattern", - "localized": "نمط اسم المجلد", + "localized": "نمط اسم الدليل", "reload": "", - "hint": "استخدم التاغات التالية لتحديد كيفية اختيار المجلدات الفرعية للصور والشبكات: [steps], [cfg], [prompt_hash], إلخ. اتركه فارغاً للافتراضي." + "hint": "استخدم الوسوم التالية لتحديد كيفية اختيار المجلدات الفرعية للصور والشبكات: [steps], [cfg], [prompt_hash], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [model_name], [prompt_words], [date], [datetime], [datetime], [datetime

seq, uuid
date, datetime, job_timestamp
generation_number, batch_number
model, model_shortname
model_hash, model_name
sampler, seed, steps, cfg
clip_skip, denoising
hasprompt, prompt, styles
prompt_hash, prompt_no_styles
prompt_spaces, prompt_words
height, width, image_hash
" + "hint": "استخدم الوسوم التالية لتحديد كيفية اختيار أسماء ملفات الصور:
seq, uuid
date, datetime, job_timestamp
generation_number, batch_number
model, model_shortname
model_hash, model_name
sampler, seed, steps, cfg
clip_skip, denoising
hasprompt, prompt, styles
prompt_hash, prompt_no_styles
prompt_spaces, prompt_words
height, width, image_hash
" }, { - "id": 245, + "id": 48, "label": "inline", "localized": "مضمن", - "reload": "", + "reload": "inline", "hint": "مضمن مع جميع العناصر الإضافية (قابل للتمرير)" }, { - "id": 246, + "id": 49, "label": "Inpainting include greyscale mask in results", - "localized": "الترميم: تضمين قناع التدرج الرمادي في النتائج", + "localized": "تضمين قناع التلوين بتدرج رمادي في النتائج", "reload": "", "hint": "" }, { - "id": 247, + "id": 50, "label": "Inpainting include masked composite in results", - "localized": "الترميم: تضمين التركيب المقنع في النتائج", + "localized": "تضمين مركب التلوين المقنع في النتائج", "reload": "", "hint": "" }, { - "id": 248, + "id": 51, "label": "Image transparent color fill", - "localized": "تعبئة لون شفافية الصورة", + "localized": "ملء لون شفافية الصورة", "reload": "", "hint": "" }, { - "id": 249, + "id": 52, "label": "Inpainting conditioning mask strength", - "localized": "قوة قناع التكييف للترميم", + "localized": "قوة قناع تكييف التلوين", "reload": "", - "hint": "تحدد مدى قوة حجب الصورة الأصلية للترميم وصورة-إلى-صورة. 1.0 يعني مقنع بالكامل (افتراضي). 0.0 يعني تكييف غير مقنع بالكامل. القيم الأقل تساعد في الحفاظ على التكوين العام للصورة، ولكنها ستواجه صعوبة في التغييرات الكبيرة." + "hint": "تحدد مدى قوة حجب الصورة الأصلية لعملية التلوين (Inpainting) والتحويل من صورة إلى صورة (img2img). 1.0 تعني محجوبة بالكامل (الافتراضي). 0.0 تعني تكييف غير محجوب بالكامل. القيم الأقل ستساعد في الحفاظ على التكوين العام للصورة، لكنها قد تواجه صعوبة مع التغييرات الكبيرة" }, { - "id": 250, + "id": 53, "label": "Image resize algorithm", "localized": "خوارزمية تغيير حجم الصورة", "reload": "", "hint": "" }, { - "id": 251, + "id": 54, "label": "Image repeats per epoch", - "localized": "تكرار الصور لكل حقبة (Epoch)", + "localized": "تكرارات الصورة لكل حقبة (Epoch)", "reload": "", "hint": "" }, { - "id": 252, + "id": 55, "label": "Interpolation Method", - "localized": "طريقة الاستكمال (Interpolation)", + "localized": "طريقة الاستيفاء", "reload": "", "hint": "" }, { - "id": 253, + "id": 56, "label": "In Blocks", - "localized": "كتل الإدخال (In Blocks)", + "localized": "في الكتل (Blocks)", "reload": "", - "hint": "كتل تقليل العينات (Downsampling) في شبكة UNet (12 قيمة لـ SD1.5، 9 قيم لـ SDXL)" + "hint": "كتل خفض الدقة (Downsampling) لنموذج UNet (12 قيمة لـ SD1.5، 9 قيم لـ SDXL)" }, { - "id": 254, + "id": 57, "label": "Input model", "localized": "نموذج الإدخال", "reload": "", "hint": "" }, { - "id": 255, + "id": 58, "label": "Info object", "localized": "كائن المعلومات", "reload": "", @@ -5035,1334 +5140,1425 @@ ], "k": [ { - "id": 751, + "id": 1, "label": "Kanvas change", - "localized": "تغيير اللوحة (Kanvas)", - "reload": "n/a", - "hint": "تغيير إعدادات أو حالة اللوحة الفنية (Kanvas)." + "localized": "تغيير اللوحة", + "reload": "false", + "hint": "تغيير اللوحة المستخدمة حالياً." }, { - "id": 752, + "id": 2, + "label": "Kolors", + "localized": "Kolors", + "reload": "false", + "hint": "نموذج كولورز (Kolors) لتوليد الصور." + }, + { + "id": 3, "label": "Kanvas Settings", - "localized": "إعدادات اللوحة (Kanvas)", - "reload": "n/a", - "hint": "تكوين إعدادات اللوحة الرقمية." + "localized": "إعدادات اللوحة", + "reload": "false", + "hint": "ضبط إعدادات اللوحة والتحكم في خصائصها." }, { - "id": 753, + "id": 4, "label": "Keep Thinking Trace", - "localized": "الاحتفاظ بأثر التفكير", - "reload": "n/a", - "hint": "تضمين عملية تفكير النموذج واستنتاجه في المخرجات النهائية.
مفيد لفهم كيفية وصول النموذج إلى الإجابة.
يعمل فقط مع النماذج التي تدعم وضع التفكير (Thinking Mode)." + "localized": "الاحتفاظ بمسار التفكير", + "reload": "false", + "hint": "تضمين عملية تفكير النموذج في المخرجات النهائية. مفيد لفهم كيفية وصول النموذج إلى إجابته. يعمل فقط مع النماذج التي تدعم وضع التفكير." }, { - "id": 754, + "id": 5, "label": "Keep Prefill", - "localized": "الاحتفاظ بالملء المسبق", - "reload": "n/a", - "hint": "تضمين نص الملء المسبق (Prefill) في بداية المخرجات النهائية.
في حال التعطيل، سيتم إزالة النص التوجيهي المستخدم لإرشاد النموذج من النتيجة النهائية." + "localized": "الاحتفاظ بالنص المسبق", + "reload": "false", + "hint": "تضمين نص التعبئة المسبقة (Prefill) في بداية المخرجات النهائية. إذا تم تعطيل هذا الخيار، ستتم إزالة النص المستخدم لتوجيه النموذج من النتيجة." }, { - "id": 755, + "id": 6, "label": "Keep aspect ratio", "localized": "الحفاظ على نسبة العرض إلى الارتفاع", - "reload": "n/a", - "hint": "الحفاظ على التناسب بين أبعاد الصورة لمنع التشويه عند تغيير الحجم." + "reload": "false", + "hint": "الحفاظ على أبعاد الصورة الأصلية أثناء المعالجة." } ], "l": [ { - "id": 61406, + "id": 1, "label": "Load model", "localized": "تحميل النموذج", - "reload": "n/a", - "hint": "تحميل نموذج تعزيز الأوامر المحدد" + "reload": "", + "hint": "قم بتحميل النموذج المراد استخدامه" }, { - "id": 74686, + "id": 2, "label": "Load custom model", "localized": "تحميل نموذج مخصص", - "reload": "n/a", + "reload": "", "hint": "تحميل نموذج مخصص بالإعدادات المحددة" }, { - "id": 22927, + "id": 3, "label": "LaMa Remove", "localized": "إزالة LaMa", - "reload": "n/a", - "hint": "استخدام خوارزمية LaMa لإزالة الكائنات من الصورة" + "reload": "", + "hint": "استخدام تقنية LaMa للإزالة" }, { - "id": 5947, + "id": 4, "label": "Lite", - "localized": "Lite", - "reload": "n/a", - "hint": "" + "localized": "خفيف", + "reload": "", + "hint": "وضع التشغيل الخفيف" }, { - "id": 15310, + "id": 5, "label": "LTXVideo", - "localized": "LTXVideo", - "reload": "n/a", - "hint": "" + "localized": "فيديو LTX", + "reload": "", + "hint": "إعدادات فيديو LTX" }, { - "id": 96853, + "id": 6, "label": "Load", "localized": "تحميل", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "بدء التحميل" }, { - "id": 88981, + "id": 7, "label": "Live Previews", - "localized": "المعاينات المباشرة", - "reload": "n/a", - "hint": "الإعدادات المتعلقة بالمعاينات المباشرة والتنبيهات الصوتية" + "localized": "معاينات مباشرة", + "reload": "", + "hint": "إعدادات تتعلق بالمعاينات المباشرة وتنبيهات الصوت" }, { - "id": 31853, + "id": 8, "label": "Legacy options", - "localized": "الخيارات القديمة", - "reload": "n/a", - "hint": "إعدادات متعلقة بالخيارات القديمة - لا ينصح باستخدامها" + "localized": "خيارات قديمة", + "reload": "", + "hint": "إعدادات تتعلق بالخيارات القديمة - لا ينصح باستخدامها" }, { - "id": 35251, + "id": 9, "label": "List", "localized": "قائمة", - "reload": "n/a", + "reload": "", "hint": "عرض قائمة بجميع النماذج المتاحة" }, { - "id": 20216, + "id": 10, "label": "Loader", - "localized": "المحمل", - "reload": "n/a", - "hint": "يسمح بتجميع نموذج انتشار يدوياً من وحدات فردية" + "localized": "أداة التحميل", + "reload": "", + "hint": "تسمح بتجميع نموذج انتشار يدويًا من وحدات فردية" }, { - "id": 5502, + "id": 11, "label": "List models", - "localized": "قائمة النماذج", - "reload": "n/a", - "hint": "" + "localized": "عرض النماذج", + "reload": "", + "hint": "عرض قائمة النماذج" }, { - "id": 5528, + "id": 12, "label": "Load receipe", "localized": "تحميل الوصفة", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحميل وصفة إعدادات" }, { - "id": 74457, + "id": 13, "label": "Lora", - "localized": "Lora", - "reload": "n/a", - "hint": "LoRA: Low-Rank Adaptation. نموذج معدل بدقة يتم تطبيقه فوق النموذج المحمل" + "localized": "LoRA", + "reload": "", + "hint": "LoRA: تقنية التكيف منخفض الرتبة (Low-Rank Adaptation). نموذج دقيق يتم تطبيقه فوق نموذج محمل" }, { - "id": 9798, + "id": 14, "label": "Local", "localized": "محلي", - "reload": "n/a", - "hint": "النماذج التي تم تحميلها وجاهزة للاستخدام" + "reload": "", + "hint": "النماذج التي تم تنزيلها وجاهزة للاستخدام" }, { - "id": 35640, + "id": 15, "label": "LTX", "localized": "LTX", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "نموذج LTX" }, { - "id": 62451, + "id": 16, + "label": "Latent Corrections", + "localized": "تصحيحات كامنة", + "reload": "", + "hint": "تصحيحات في الفضاء الكامن" + }, + { + "id": 17, "label": "Layerwise Casting", - "localized": "تحويل النوع لكل طبقة", - "reload": "n/a", - "hint": "" + "localized": "توزيع طبقي", + "reload": "", + "hint": "إعدادات التوزيع الطبقي" }, { - "id": 71391, + "id": 18, "label": "LinFusion", "localized": "LinFusion", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "إعدادات LinFusion المتقدمة" }, { - "id": 72635, + "id": 19, "label": "Log Display", "localized": "عرض السجل", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "إعدادات واجهة عرض السجل" }, { - "id": 15655, + "id": 20, "label": "List all locally available models", - "localized": "عرض كل النماذج المتاحة محلياً", - "reload": "n/a", - "hint": "" + "localized": "عرض كافة النماذج المحلية المتاحة", + "reload": "", + "hint": "عرض جميع النماذج الموجودة على الجهاز" }, { - "id": 75539, + "id": 21, "label": "Last Generate", - "localized": "آخر توليد", - "reload": "n/a", - "hint": "" + "localized": "آخر عملية إنشاء", + "reload": "", + "hint": "عرض آخر صورة تم إنشاؤها" }, { - "id": 64969, + "id": 22, + "label": "LUT", + "localized": "جدول بحث الألوان (LUT)", + "reload": "", + "hint": "قسم تصحيح الألوان باستخدام جداول بحث الألوان (LUT). قم برفع ملف بصيغة .cube لتطبيق إعدادات احترافية للألوان. تعمل LUTs على إعادة تعيين الألوان بناءً على تحويل لوني ثلاثي الأبعاد، وتستخدم عادة في الأفلام والتصوير الفوتوغرافي." + }, + { + "id": 23, "label": "low order", - "localized": "رتبة منخفضة", - "reload": "n/a", - "hint": "" + "localized": "ترتيب منخفض", + "reload": "", + "hint": "استخدام ترتيب منخفض" }, { - "id": 88406, + "id": 24, "label": "LSC layer indices", - "localized": "فهارس طبقات LSC", - "reload": "n/a", - "hint": "" + "localized": "فهارس طبقة LSC", + "reload": "", + "hint": "تحديد فهارس الطبقات لـ LSC" }, { - "id": 32598, + "id": 25, "label": "LSC fully qualified name", - "localized": "الاسم المؤهل بالكامل لـ LSC", - "reload": "n/a", - "hint": "" + "localized": "الاسم الكامل لـ LSC", + "reload": "", + "hint": "تحديد الاسم الكامل المؤهل لـ LSC" }, { - "id": 61476, + "id": 26, "label": "LSC skip attention blocks", - "localized": "LSC تخطي كتل الانتباه", - "reload": "n/a", - "hint": "" + "localized": "تخطي كتل الانتباه لـ LSC", + "reload": "", + "hint": "تخطي كتل الانتباه في LSC" }, { - "id": 84102, + "id": 27, "label": "LSC skip feed-forward blocks", - "localized": "LSC تخطي كتل التغذية الأمامية", - "reload": "n/a", - "hint": "" + "localized": "تخطي كتل التغذية الأمامية لـ LSC", + "reload": "", + "hint": "تخطي كتل التغذية الأمامية في LSC" }, { - "id": 29792, + "id": 28, "label": "LSC skip attention scores", - "localized": "LSC تخطي درجات الانتباه", - "reload": "n/a", - "hint": "" + "localized": "تخطي درجات الانتباه لـ LSC", + "reload": "", + "hint": "تخطي درجات الانتباه في LSC" }, { - "id": 5756, + "id": 29, "label": "LSC dropout rate", - "localized": "معدل التسرب لـ LSC", - "reload": "n/a", - "hint": "" + "localized": "معدل إسقاط LSC", + "reload": "", + "hint": "تحديد معدل الإسقاط لـ LSC" }, { - "id": 79047, + "id": 30, + "label": "LUT strength", + "localized": "قوة LUT", + "reload": "", + "hint": "يتحكم في قوة تأثير LUT المطبق. 1.0 يطبق التأثير بكامل قوته. القيم الأقل من 1.0 تمزج الألوان مع الأصلية، والقيم الأعلى من 1.0 تعزز التأثير. يعمل فقط عند تحميل ملف .cube." + }, + { + "id": 31, + "label": "Latent brightness", + "localized": "السطوع الكامن", + "reload": "", + "hint": "زيادة أو تقليل السطوع مباشرة في الفضاء الكامن أثناء الإنشاء" + }, + { + "id": 32, + "label": "Latent sharpen", + "localized": "الحدة الكامنة", + "reload": "", + "hint": "زيادة أو تقليل الحدة مباشرة في الفضاء الكامن أثناء الإنشاء" + }, + { + "id": 33, + "label": "Latent color", + "localized": "اللون الكامن", + "reload": "", + "hint": "ضبط توازن الألوان مباشرة في الفضاء الكامن أثناء الإنشاء" + }, + { + "id": 34, + "label": "Latent clamp", + "localized": "تقييد كامن", + "reload": "", + "hint": "يضبط مستوى التفاصيل غير المنطقية عن طريق تقليم القيم التي تنحرف بشكل كبير عن متوسط التوزيع. مفيد لتعزيز الإنشاء عند مقاييس توجيه عالية، وتحديد القيم المتطرفة مبكرًا وتطبيق تعديلات رياضية بناءً على إعدادات النطاق والعتبة." + }, + { + "id": 35, + "label": "Latent range", + "localized": "نطاق كامن", + "reload": "", + "hint": "ضبط نطاق القيم الكامنة أثناء الإنشاء" + }, + { + "id": 36, + "label": "Latent threshold", + "localized": "عتبة كامنة", + "reload": "", + "hint": "ضبط العتبة للكيمات الكامنة" + }, + { + "id": 37, + "label": "Latent maximize", + "localized": "تعظيم كامن", + "reload": "", + "hint": "يحسب عامل تطبيع لزيادة النطاق الديناميكي إلى أقصى حد." + }, + { + "id": 38, + "label": "Latent center", + "localized": "مركز كامن", + "reload": "", + "hint": "ضبط مركز الفضاء الكامن أثناء الإنشاء" + }, + { + "id": 39, + "label": "Latent max range", + "localized": "أقصى نطاق كامن", + "reload": "", + "hint": "ضبط الحد الأقصى لنطاق القيم الكامنة أثناء الإنشاء" + }, + { + "id": 40, + "label": "Latent tint", + "localized": "تلوين كامن", + "reload": "", + "hint": "تعديل لون الفضاء الكامن" + }, + { + "id": 41, "label": "Layer options", - "localized": "خيارات الطبقات", - "reload": "n/a", - "hint": "تحديد خيارات الطبقات المتقدمة لـ IP adapter يدوياً" + "localized": "خيارات الطبقة", + "reload": "", + "hint": "تحديد خيارات طبقة IP-Adapter المتقدمة يدويًا" }, { - "id": 62402, + "id": 42, "label": "Layer scales", - "localized": "مقاييس الطبقات", - "reload": "n/a", - "hint": "" + "localized": "مقياس الطبقات", + "reload": "", + "hint": "ضبط مقاييس الطبقات" }, { - "id": 69542, + "id": 43, "label": "Length", "localized": "الطول", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحديد الطول" }, { - "id": 6441, + "id": 44, "label": "Loops", - "localized": "الحلقات التكرارية", - "reload": "n/a", - "hint": "عدد مرات معالجة الصورة. يستخدم كل مخرج كمدخل للحلقة التالية. إذا ضبط على 1، سيعمل السكريبت كأنه غير مفعل." + "localized": "حلقات", + "reload": "", + "hint": "عدد مرات معالجة الصورة. كل مخرج يستخدم كمدخل للحلقة التالية." }, { - "id": 56363, + "id": 45, "label": "Level", "localized": "المستوى", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحديد المستوى" }, { - "id": 58739, + "id": 46, "label": "Latent mode", - "localized": "وضع الفضاء الكامن (Latent)", - "reload": "n/a", - "hint": "" + "localized": "الوضع الكامن", + "reload": "", + "hint": "تفعيل الوضع الكامن" }, { - "id": 90903, + "id": 47, "label": "Loop video", "localized": "تكرار الفيديو", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تفعيل خيار تكرار الفيديو" }, { - "id": 82967, + "id": 48, "label": "LLM model", - "localized": "نموذج LLM", - "reload": "n/a", - "hint": "اختر نموذج اللغة لاستخدامه في تحسين الأوامر.

النماذج التي تدعم الرؤية مميزة بأيقونة .
النماذج التي تدعم وضع التفكير مميزة بأيقونة ." + "localized": "نموذج لغوي كبير (LLM)", + "reload": "", + "hint": "حدد النموذج اللغوي المستخدم لتحسين المطالبات. النماذج التي تدعم الرؤية مميزة بأيقونة ، والنماذج التي تدعم وضع التفكير مميزة بأيقونة ." }, { - "id": 54794, + "id": 49, "label": "LBM Method", "localized": "طريقة LBM", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "اختيار طريقة LBM" }, { - "id": 88043, + "id": 50, "label": "LBM Composite", "localized": "تركيب LBM", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "إعدادات تركيب LBM" }, { - "id": 82937, + "id": 51, "label": "LBM Steps", "localized": "خطوات LBM", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحديد خطوات LBM" }, { - "id": 86469, + "id": 52, "label": "left", "localized": "يسار", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "جهة اليسار" }, { - "id": 9612, + "id": 53, "label": "Live update", "localized": "تحديث مباشر", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تمكين التحديث المباشر" }, { - "id": 96930, + "id": 54, "label": "Low threshold", "localized": "عتبة منخفضة", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "ضبط العتبة المنخفضة" }, { - "id": 3961, + "id": 55, "label": "Large", "localized": "كبير", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "الحجم الكبير" }, { - "id": 77296, + "id": 56, "label": "LTX model", "localized": "نموذج LTX", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "اختيار نموذج LTX" }, { - "id": 86996, + "id": 57, "label": "LTX frames number", "localized": "عدد إطارات LTX", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحديد عدد إطارات LTX" }, { - "id": 66129, + "id": 58, "label": "LTX frames skip", "localized": "تخطي إطارات LTX", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحديد عدد إطارات LTX التي سيتم تخطيها" }, { - "id": 5540, + "id": 59, "label": "LTX enable upsampling", - "localized": "LTX تفعيل زيادة الدقة", - "reload": "n/a", - "hint": "" + "localized": "تمكين ترقية LTX", + "reload": "", + "hint": "تفعيل ترقية الدقة (Upsampling) لـ LTX" }, { - "id": 14800, + "id": 60, "label": "LTX upsample ratio", - "localized": "نسبة زيادة الدقة لـ LTX", - "reload": "n/a", - "hint": "" + "localized": "نسبة ترقية LTX", + "reload": "", + "hint": "ضبط نسبة ترقية الدقة لـ LTX" }, { - "id": 49910, + "id": 61, "label": "LTX enable refine", - "localized": "LTX تفعيل التهذيب", - "reload": "n/a", - "hint": "" + "localized": "تمكين تحسين LTX", + "reload": "", + "hint": "تفعيل خيار تحسين LTX" }, { - "id": 34271, + "id": 62, "label": "LTX refine strength", - "localized": "قوة تهذيب LTX", - "reload": "n/a", - "hint": "" + "localized": "قوة تحسين LTX", + "reload": "", + "hint": "ضبط قوة التحسين لـ LTX" }, { - "id": 15809, + "id": 63, "label": "LTX decode timestep", - "localized": "خطوة زمن فك الترميز لـ LTX", - "reload": "n/a", - "hint": "" + "localized": "خطوة زمن فك ترميز LTX", + "reload": "", + "hint": "تحديد خطوة زمن فك ترميز LTX" }, { - "id": 59550, + "id": 64, "label": "LTX enable audio", - "localized": "LTX تفعيل الصوت", - "reload": "n/a", - "hint": "" + "localized": "تمكين صوت LTX", + "reload": "", + "hint": "تفعيل معالجة الصوت في LTX" }, { - "id": 64722, + "id": 65, "label": "Loop", - "localized": "حلقة", - "reload": "n/a", - "hint": "" + "localized": "تكرار", + "reload": "", + "hint": "تفعيل وضع التكرار" }, { - "id": 8593, + "id": 66, "label": "Local directory name", "localized": "اسم المجلد المحلي", - "reload": "n/a", - "hint": "المجلد الذي سيتم تثبيت الإضافة فيه، اتركه فارغاً للافتراضي" + "reload": "", + "hint": "اسم المجلد الذي سيتم تثبيت الامتداد فيه، اتركه فارغًا للافتراضي" }, { - "id": 8625, + "id": 67, "label": "Libs", - "localized": "مكتبات البرمجة", - "reload": "n/a", - "hint": "" + "localized": "مكتبات", + "reload": "", + "hint": "المكتبات البرمجية" }, { - "id": 68725, + "id": 68, "label": "Latent history size", - "localized": "حجم سجل الفضاء الكامن", - "reload": "n/a", - "hint": "" + "localized": "حجم سجل الحالة الكامنة", + "reload": "", + "hint": "تحديد حجم سجل الحالة الكامنة" }, { - "id": 18990, + "id": 69, "label": "LLama repo", "localized": "مستودع LLama", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "رابط مستودع LLama" }, { - "id": 28892, + "id": 70, "label": "low noise", - "localized": "ضجيج منخفض", - "reload": "n/a", - "hint": "" + "localized": "ضوضاء منخفضة", + "reload": "", + "hint": "تحديد مستوى ضوضاء منخفض" }, { - "id": 42247, + "id": 71, + "label": "Load caption models direct to GPU", + "localized": "تحميل نماذج التعليق مباشرة إلى وحدة معالجة الرسومات (GPU)", + "reload": "", + "hint": "تحميل نماذج الوصف مباشرة على كارت الشاشة" + }, + { + "id": 72, "label": "leaf_level", - "localized": "مستوى الورقة", - "reload": "n/a", - "hint": "" + "localized": "مستوى الأوراق (leaf_level)", + "reload": "", + "hint": "إعدادات مستوى الأوراق" }, { - "id": 31541, + "id": 73, "label": "LLM", - "localized": "LLM", - "reload": "n/a", - "hint": "" + "localized": "نموذج لغوي كبير (LLM)", + "reload": "", + "hint": "إعدادات النموذج اللغوي الكبير" }, { - "id": 45618, + "id": 74, "label": "Layerwise casting storage", - "localized": "تخزين تحويل الطبقات", - "reload": "n/a", - "hint": "" + "localized": "تخزين التوزيع الطبقي", + "reload": "", + "hint": "تحديد مكان تخزين التوزيع الطبقي" }, { - "id": 42171, + "id": 75, "label": "Layerwise non-blocking operations", - "localized": "عمليات الطبقات غير الحاصرة", - "reload": "n/a", - "hint": "" + "localized": "عمليات التوزيع الطبقي غير المحظورة", + "reload": "", + "hint": "تمكين العمليات غير المحظورة للتوزيع الطبقي" }, { - "id": 29555, + "id": 76, "label": "Lumina: Use mask in transformers", "localized": "Lumina: استخدام القناع في المحولات", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تفعيل استخدام القناع في محولات Lumina" }, { - "id": 56391, + "id": 77, + "label": "Listen on all interfaces", + "localized": "الاستماع على جميع الواجهات", + "reload": "", + "hint": "تمكين الاستماع على جميع واجهات الشبكة" + }, + { + "id": 78, "label": "LinFusion apply distillation on load", "localized": "تطبيق تقطير LinFusion عند التحميل", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تطبيق تقطير النموذج عند تحميل LinFusion" }, { - "id": 4468, + "id": 79, "label": "Light", - "localized": "فاتح (Light)", - "reload": "n/a", - "hint": "" + "localized": "إضاءة", + "reload": "", + "hint": "إعدادات الإضاءة" }, { - "id": 21833, + "id": 80, "label": "Log view update period", "localized": "فترة تحديث عرض السجل", - "reload": "n/a", - "hint": "فترة تحديث عرض السجل بالملي ثانية" + "reload": "", + "hint": "فترة تحديث عرض السجل، بالمللي ثانية" }, { - "id": 50731, + "id": 81, "label": "Live preview display period", "localized": "فترة عرض المعاينة المباشرة", - "reload": "n/a", - "hint": "طلب صورة معاينة كل N من الخطوات، اضبطه على 0 للتعطيل" + "reload": "", + "hint": "طلب صورة معاينة كل n خطوة، اضبط على 0 للتعطيل" }, { - "id": 61408, + "id": 82, "label": "Load custom Diffusers pipeline", "localized": "تحميل مسار Diffusers مخصص", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحميل مسار عمل Diffusers مخصص" }, { - "id": 72605, + "id": 83, "label": "LoRA force reload always", - "localized": "إجبار إعادة تحميل LoRA دائماً", - "reload": "n/a", - "hint": "يجبر شبكات LoRA على إعادة التحميل من التخزين عند كل عملية توليد، حتى لو كانت مخزنة مؤقتاً.
مفيد لتصحيح الأخطاء أو عند تعديل ملفات LoRA خارجياً.
قم بتعطيله للاستخدام العادي للاستفادة من التخزين المؤقت." + "localized": "فرض إعادة تحميل LoRA دائمًا", + "reload": "", + "hint": "يجبر شبكات LoRA على إعادة التحميل من التخزين في كل عملية إنشاء، حتى لو كانت موجودة في الذاكرة المؤقتة. مفيد لتصحيح الأخطاء أو عند تعديل ملفات LoRA خارجيًا. قم بتعطيله للاستخدام العادي للاستفادة من الذاكرة المؤقتة." }, { - "id": 48123, + "id": 84, "label": "LoRA load using Diffusers method", "localized": "تحميل LoRA باستخدام طريقة Diffusers", - "reload": "n/a", - "hint": "طريقة بديلة تستخدم إمكانيات LoRA المدمجة في Diffusers بدلاً من تنفيذ SD.Next الأصلي (قد يقلل من توافق LoRA)" + "reload": "", + "hint": "طريقة بديلة تستخدم إمكانيات LoRA المدمجة في Diffusers بدلاً من تنفيذ SD.Next الأصلي (قد تقلل من توافق LoRA)" }, { - "id": 32588, + "id": 85, "label": "LoRA native apply to text encoder", - "localized": "تطبيق LoRA الأصلي على مشفر النصوص", - "reload": "n/a", - "hint": "" + "localized": "تطبيق LoRA الأصلي على مشفر النص", + "reload": "", + "hint": "تطبيق LoRA على مشفر النص باستخدام الطريقة الأصلية" }, { - "id": 26591, + "id": 86, "label": "LoRA native fuse with model", "localized": "دمج LoRA الأصلي مع النموذج", - "reload": "n/a", - "hint": "دمج LoRA في النموذج لتقليل استهلاك الذاكرة.

تحذير: بعد إزالة أو تبديل LoRA، قد تظل ترى أسلوبها في الصور المولدة. للحصول على نموذج نظيف، أعد تحميله من محدد النماذج." + "reload": "", + "hint": "دمج LoRA في النموذج لتقليل استخدام الذاكرة. تحذير: بعد إزالة أو تبديل LoRA، قد تظل ترى تأثيره في الصور الناتجة. للحصول على نموذج نظيف، قم بإعادة تحميله من محدد النماذج." }, { - "id": 18991, + "id": 87, "label": "LoRA diffusers fuse with model", "localized": "دمج LoRA الخاص بـ Diffusers مع النموذج", - "reload": "n/a", - "hint": "دمج LoRA في النموذج لتقليل استهلاك الذاكرة والتوافق مع torch.compile.

تحذير: بعد إزالة أو تبديل LoRA، قد تظل ترى أسلوبها في الصور المولدة. للحصول على نموذج نظيف، أعد تحميله من محدد النماذج." + "reload": "", + "hint": "دمج LoRA في النموذج لتقليل استخدام الذاكرة وتوافق torch.compile. تحذير: بعد إزالة أو تبديل LoRA، قد تظل ترى تأثيره في الصور الناتجة. للحصول على نموذج نظيف، قم بإعادة تحميله من محدد النماذج." }, { - "id": 61132, + "id": 88, "label": "LoRA auto-apply tags", - "localized": "تطبيق وسوم LoRA تلقائياً", - "reload": "n/a", - "hint": "إضافة كلمات التشغيل/الوسوم من بيانات LoRA الوصفية إلى أمرك تلقائياً.
اضبط عدد الوسوم المطلوب تطبيقها، مثلاً 3 = إضافة أعلى 3 وسوم.
اضبط على 0 للتعطيل، و -1 لإضافة كل الوسوم المتاحة." + "localized": "تطبيق وسوم LoRA تلقائيًا", + "reload": "", + "hint": "إضافة كلمات التحفيز/الوسوم من بيانات LoRA الوصفية تلقائيًا إلى المطالبة الخاصة بك. اضبط الرقم على عدد الوسوم التي تريد تطبيقها تلقائيًا، أو 0 للتعطيل، أو -1 لإضافة جميع الوسوم المتاحة." }, { - "id": 98895, + "id": 89, "label": "LoRA memory cache", "localized": "ذاكرة التخزين المؤقت لـ LoRA", - "reload": "n/a", - "hint": "عدد نماذج LoRA التي يتم الاحتفاظ بها في الشبكة للاستخدام المستقبلي قبل الحاجة لإعادة التحميل من التخزين" + "reload": "", + "hint": "عدد ملفات LoRA التي سيتم الاحتفاظ بها في الشبكة للاستخدام المستقبلي قبل طلب إعادة التحميل من التخزين" }, { - "id": 42261, + "id": 90, "label": "LoRA add hash info to metadata", - "localized": "إضافة معلومات الهاش لـ LoRA إلى البيانات الوصفية", - "reload": "n/a", - "hint": "تضمين هاش ملفات LoRA في البيانات الوصفية للصورة المولدة.
مفيد لإعادة الإنتاج وتتبع إصدارات LoRA الدقيقة المستخدمة." + "localized": "إضافة معلومات الهاش إلى بيانات LoRA الوصفية", + "reload": "", + "hint": "تضمين قيم الهاش لملفات LoRA في البيانات الوصفية للصورة الناتجة. مفيد للتكرار وتتبع إصدارات LoRA الدقيقة التي تم استخدامها." }, { - "id": 88955, + "id": 91, "label": "LDSR Path", "localized": "مسار LDSR", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "تحديد مسار LDSR" }, { - "id": 14352, + "id": 92, "label": "LoRA load using legacy method", "localized": "تحميل LoRA باستخدام الطريقة القديمة", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "استخدام الطريقة القديمة لتحميل LoRA" }, { - "id": 5745, + "id": 93, "label": "Loaded LoRA", "localized": "LoRA المحملة", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "قائمة ملفات LoRA المحملة حاليًا" }, { - "id": 37424, + "id": 94, "label": "LoRA target filename", - "localized": "اسم ملف LoRA المستهدف", - "reload": "n/a", - "hint": "" + "localized": "اسم ملف هدف LoRA", + "reload": "", + "hint": "تحديد اسم ملف هدف LoRA" }, { - "id": 16520, + "id": 95, "label": "Layer skip guidance", - "localized": "توجيه تخطي الطبقات", - "reload": "n/a", - "hint": "" + "localized": "توجيه تخطي الطبقة", + "reload": "", + "hint": "توجيه عملية تخطي الطبقات" }, { - "id": 39055, + "id": 96, "label": "LineArt", - "localized": "فن الخطوط (LineArt)", - "reload": "n/a", - "hint": "" + "localized": "فنون الخط (LineArt)", + "reload": "", + "hint": "معالجة فنون الخط" }, { - "id": 5639, + "id": 97, "label": "Leres Depth", "localized": "عمق Leres", - "reload": "n/a", - "hint": "" + "reload": "", + "hint": "معالجة العمق باستخدام Leres" } ], "m": [ { - "id": -1, + "id": 0, "label": "Mask", - "localized": "قناع", + "localized": "القناع", "reload": "", - "hint": "خيارات إخفاء الصور والأقنعة" + "hint": "خيارات القناع وتغطية الصور" }, { - "id": -1, + "id": 0, "label": "Models", "localized": "النماذج", - "reload": "", - "hint": "تنزيل، تحويل أو دمج النماذج الخاصة بك وإدارة البيانات الوصفية للنماذج" + "reload": "video_params_generic", + "hint": "تنزيل أو تحويل أو دمج نماذجك وإدارة بياناتها الوصفية" }, { - "id": -1, + "id": 0, "label": "Manage extensions", - "localized": "إدارة الامتدادات", + "localized": "إدارة الإضافات", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Manual install", "localized": "تثبيت يدوي", "reload": "", - "hint": "تثبيت الامتداد يدوياً" + "hint": "تثبيت الإضافة يدوياً" }, { - "id": -1, + "id": 0, "label": "Models & Networks", "localized": "النماذج والشبكات", "reload": "", - "hint": "عرض قوائم لجميع النماذج والشبكات المتاحة" + "hint": "عرض قوائم جميع النماذج والشبكات المتاحة" }, { - "id": -1, + "id": 0, "label": "Model Loading", "localized": "تحميل النموذج", "reload": "", - "hint": "الإعدادات المتعلقة بكيفية تحميل النموذج" + "hint": "الإعدادات المتعلقة بطريقة تحميل النموذج" }, { - "id": -1, + "id": 0, "label": "Model Options", "localized": "خيارات النموذج", "reload": "", "hint": "الإعدادات المتعلقة بسلوك نماذج محددة" }, { - "id": -1, + "id": 0, "label": "Model Offloading", - "localized": "تفريغ النموذج (Offloading)", + "localized": "تفريغ النموذج", "reload": "", "hint": "الإعدادات المتعلقة بتفريغ النموذج وإدارة الذاكرة" }, { - "id": -1, + "id": 0, "label": "Model Quantization", - "localized": "تكميم النموذج (Quantization)", + "localized": "تكميم النموذج", "reload": "", - "hint": "الإعدادات المتعلقة بتكميم النموذج والتي تستخدم لتقليل استخدام الذاكرة" + "hint": "الإعدادات المتعلقة بتكميم النموذج (Quantization) المستخدم لتقليل استهلاك الذاكرة" }, { - "id": -1, + "id": 0, "label": "Model Compile", - "localized": "تجميع النموذج (Compile)", + "localized": "تجميع النموذج", "reload": "", "hint": "الإعدادات المتعلقة بطرق تجميع النماذج المختلفة" }, { - "id": -1, + "id": 0, "label": "Metadata", "localized": "البيانات الوصفية", "reload": "", "hint": "تحديث البيانات الوصفية لجميع النماذج المتاحة" }, { - "id": -1, + "id": 0, "label": "Merge", "localized": "دمج", "reload": "", "hint": "دمج نموذجين أو أكثر في نموذج جديد" }, { - "id": -1, + "id": 0, "label": "Manual Block Merge", "localized": "دمج الكتل يدوياً", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Merge Modules", - "localized": "وحدات الدمج", - "reload": "", + "localized": "دمج الوحدات", + "reload": "component-5788", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model", "localized": "النموذج", "reload": "", "hint": "النموذج الأساسي" }, { - "id": -1, + "id": 0, "label": "Model metadata", "localized": "البيانات الوصفية للنموذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "ModernUI", - "localized": "واجهة حديثة", + "localized": "واجهة المستخدم الحديثة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Modular Pipelines", - "localized": "خطوط معالجة معيارية", + "localized": "خطوط المعالجة المعيارية", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Models Paths", "localized": "مسارات النماذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mobile", - "localized": "جوال", + "localized": "الهاتف المحمول", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Merge multiple models", "localized": "دمج نماذج متعددة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Max shift", "localized": "أقصى إزاحة", "reload": "", - "hint": "أقصى قيمة إزاحة للدقات العالية عند استخدام الإزاحة الديناميكية." + "hint": "قيمة الإزاحة القصوى للدقة العالية عند استخدام الإزاحة الديناميكية." }, { - "id": -1, + "id": 0, "label": "Merge detailers", - "localized": "دمج المفصلين", + "localized": "دمج أدوات التفصيل", "reload": "", - "hint": "دمج النتائج من مفصلين متعددين في قناع واحد قبل تشغيل عملية التفصيل" + "hint": "دمج النتائج من أدوات تفصيل متعددة في قناع واحد قبل بدء عملية التفصيل" }, { - "id": -1, + "id": 0, "label": "Max detected", - "localized": "أقصى عدد مكتشف", + "localized": "الحد الأقصى للمكتشفات", "reload": "", - "hint": "أقصى عدد من الكائنات المكتشفة لتشغيل المفصل عليها" + "hint": "الحد الأقصى لعدد الكائنات المكتشفة لتشغيل أداة التفصيل عليها" }, { - "id": -1, + "id": 0, "label": "Min confidence", - "localized": "أدنى ثقة", + "localized": "الحد الأدنى للثقة", "reload": "", - "hint": "أدنى مستوى ثقة في العنصر المكتشف" + "hint": "الحد الأدنى لنسبة الثقة في العنصر المكتشف" }, { - "id": -1, + "id": 0, "label": "Max overlap", "localized": "أقصى تداخل", "reload": "", - "hint": "أقصى تداخل بين عنصرين مكتشفين قبل استبعاد أحدهما" + "hint": "أقصى تداخل مسموح به بين عنصرين مكتشفين قبل تجاهل أحدهما" }, { - "id": -1, + "id": 0, "label": "Min size", - "localized": "أصغر حجم", + "localized": "الحد الأدنى للحجم", "reload": "", - "hint": "أصغر حجم للكائن المكتشف كنسبة مئوية من الصورة الإجمالية" + "hint": "الحد الأدنى لحجم الكائن المكتشف كنسبة مئوية من إجمالي الصورة" }, { - "id": -1, + "id": 0, "label": "Max size", - "localized": "أكبر حجم", + "localized": "الحد الأقصى للحجم", "reload": "", - "hint": "أكبر حجم للكائن المكتشف كنسبة مئوية من الصورة الإجمالية" + "hint": "الحد الأقصى لحجم الكائن المكتشف كنسبة مئوية من إجمالي الصورة" }, { - "id": -1, - "label": "Max Range", - "localized": "أقصى مدى", + "id": 0, + "label": "Midtones", + "localized": "الدرجات المتوسطة", "reload": "", - "hint": "" + "hint": "ضبط سطوع مناطق الدرجات المتوسطة.
القيم الإيجابية تزيد من سطوع الدرجات المتوسطة، والقيم السلبية تغمقها.

تستهدف البكسلات القريبة من منتصف نطاق الإضاءة باستخدام قناع على شكل جرس في مساحة Lab، مع ترك الظلال والإضاءات العالية دون تغيير تقريباً." }, { - "id": -1, + "id": 0, "label": "Momentum", "localized": "الزخم", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mode x-axis", - "localized": "وضع محور X", + "localized": "وضع المحور السيني", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mode y-axis", - "localized": "وضع محور Y", + "localized": "وضع المحور الصادي", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mask Dropout", "localized": "إسقاط القناع", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Multi decoder", - "localized": "مفكك ترميز متعدد", + "localized": "فك تشفير متعدد", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mode", "localized": "الوضع", "reload": "", - "hint": "وضع الاستجواب.
سريع: وصف سريع مع حد أدنى من المصطلحات.
كلاسيكي: استجواب قياسي مع توازن بين الجودة والسرعة.
الأفضل: التحليل الأكثر شمولاً، الأبطأ ولكن بالأعلى جودة.
سلبي: توليد مصطلحات لاستخدامها كمطالبة سلبية." + "hint": "وضع الاستجواب (Interrogation).
سريع: تعليق سريع بأقل قدر من مصطلحات النكهة.
كلاسيكي: استجواب قياسي مع توازن بين الجودة والسرعة.
الأفضل: تحليل شامل، هو الأبطأ ولكنه الأعلى جودة.
سلبي: إنشاء مصطلحات لاستخدامها كمدخلات سلبية (Negative Prompt)." }, { - "id": -1, + "id": 0, "label": "Method", "localized": "الطريقة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model repo", "localized": "مستودع النموذج", "reload": "", - "hint": "معرف مستودع HuggingFace للنموذج" + "hint": "معرف مستودع HuggingFace الخاص بالنموذج" }, { - "id": -1, + "id": 0, "label": "Model gguf", "localized": "نموذج GGUF", "reload": "", - "hint": "مستودع نموذج GGUF المكمم الاختياري على HuggingFace" + "hint": "مستودع اختياري لنماذج GGUF مكممة على HuggingFace" }, { - "id": -1, + "id": 0, "label": "Model type", "localized": "نوع النموذج", "reload": "", - "hint": "نوع تكميم نموذج GGUF الاختياري" + "hint": "نوع تكميم نموذج GGUF اختياري" }, { - "id": -1, + "id": 0, "label": "Model file", "localized": "ملف النموذج", "reload": "", "hint": "ملف نموذج GGUF محدد اختياري داخل المستودع" }, { - "id": -1, + "id": 0, "label": "Max tokens", - "localized": "أقصى عدد من الرموز (Tokens)", + "localized": "أقصى عدد للرموز", "reload": "", - "hint": "أقصى عدد من الرموز التي يمكن للنموذج توليدها في رده.
النموذج لا يدرك هذا الحد أثناء التوليد ولن يجعله يحاول توليد ردود أكثر تفصيلاً أو إيجازاً، بل يضع ببساطة حداً صارماً للطول، وسيقطع الرد قسراً عند الوصول إلى الحد." + "hint": "الحد الأقصى لعدد الرموز (Tokens) التي يمكن للنموذج إنتاجها في رده.
النموذج لا يدرك هذا الحد أثناء الإنشاء ولن يحاول إنتاج ردود أكثر تفصيلاً أو إيجازاً، بل يضع ببساطة حداً ثابتاً للطول، وسيقطع الرد قسرياً عند الوصول إلى هذا الحد." }, { - "id": -1, + "id": 0, "label": "masked", - "localized": "مقنع", + "localized": "مقنّع", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mask invert", "localized": "عكس القناع", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mask strength", "localized": "قوة القناع", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Multistep restore", "localized": "استعادة متعددة الخطوات", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mask blur", "localized": "تمويه القناع", "reload": "", "hint": "مقدار تمويه القناع قبل المعالجة، بالبكسل" }, { - "id": -1, + "id": 0, "label": "Min guidance", - "localized": "أدنى توجيه", + "localized": "الحد الأدنى للتوجيه", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Max guidance", - "localized": "أقصى توجيه", + "localized": "الحد الأقصى للتوجيه", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Motion level", "localized": "مستوى الحركة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mode after", "localized": "الوضع بعد", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Method after", "localized": "الطريقة بعد", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mode mask", "localized": "وضع القناع", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Method mask", "localized": "طريقة القناع", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Maximum units", - "localized": "أقصى عدد من الوحدات", + "localized": "الحد الأقصى للوحدات", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Max faces", - "localized": "أقصى عدد من الوجوه", + "localized": "أقصى عدد للوجوه", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Medium", "localized": "متوسط", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Merge alpha", "localized": "دمج ألفا", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mask only", "localized": "القناع فقط", "reload": "", "hint": "" }, { - "id": -1, - "label": "Max Length", - "localized": "أقصى طول", - "reload": "", - "hint": "أقصى عدد من الرموز في الوصف المولد." - }, - { - "id": -1, - "label": "Min Flavors", - "localized": "أدنى نكهات", - "reload": "", - "hint": "أدنى عدد من الوسوم الوصفية (النكهات) للاحتفاظ بها في المطالبة النهائية." - }, - { - "id": -1, - "label": "Max Flavors", - "localized": "أقصى نكهات", - "reload": "", - "hint": "أقصى عدد من الوسوم الوصفية (النكهات) للاحتفاظ بها في المطالبة النهائية." - }, - { - "id": -1, + "id": 0, "label": "Max tags", - "localized": "أقصى عدد من الوسوم", + "localized": "أقصى عدد للوسوم", "reload": "", - "hint": "أقصى عدد من الوسوم لتضمينها في المخرجات.
يحد من طول النتيجة عندما تحتوي الصورة على العديد من الميزات المكتشفة.
يتم فرز الوسوم حسب الثقة، بحيث يتم الاحتفاظ بالأكثر صلة." + "hint": "الحد الأقصى لعدد الوسوم التي سيتم تضمينها في المخرجات.
يحدد طول النتيجة عندما تحتوي الصورة على العديد من الميزات المكتشفة.
يتم ترتيب الوسوم حسب الثقة، لذا يتم الاحتفاظ بالأكثر صلة." }, { - "id": -1, + "id": 0, "label": "Memory", "localized": "الذاكرة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Memory optimization", "localized": "تحسين الذاكرة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model Info", "localized": "معلومات النموذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model pipeline", "localized": "خط معالجة النموذج", "reload": "", - "hint": "إذا لم يكتشف الكشف التلقائي النموذج تلقائياً، حدد نوع النموذج قبل تحميله" + "hint": "إذا لم يكتشف النظام نوع النموذج تلقائياً، حدد نوع النموذج قبل تحميله" }, { - "id": -1, + "id": 0, "label": "Model auto-load on start", - "localized": "تحميل تلقائي للنموذج عند البدء", + "localized": "تحميل النموذج تلقائياً عند البدء", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model load using multiple threads", "localized": "تحميل النموذج باستخدام خيوط معالجة متعددة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model auto-download on demand", - "localized": "تنزيل تلقائي للنموذج عند الطلب", + "localized": "تنزيل النموذج تلقائياً عند الطلب", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model load using streams", "localized": "تحميل النموذج باستخدام التدفقات", "reload": "", - "hint": "عند تحميل النماذج، حاول استخدام تحميل التدفق المحسن للتخزين البطيء أو عبر الشبكة" + "hint": "عند تحميل النماذج، حاول استخدام تحميل التدفق (Stream loading) المحسن للتخزين البطيء أو الشبكي" }, { - "id": -1, + "id": 0, "label": "Model load model direct to GPU", - "localized": "تحميل النموذج مباشرة إلى GPU", + "localized": "تحميل النموذج مباشرة إلى وحدة معالجة الرسومات (GPU)", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model types not to offload", - "localized": "أنواع النماذج التي لا يتم تفريغها", + "localized": "أنواع النماذج التي لا يجب تفريغها", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Modules to always offload", - "localized": "الوحدات التي يتم تفريغها دائماً", + "localized": "الوحدات التي يجب تفريغها دائماً", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Modules to never offload", - "localized": "الوحدات التي لا يتم تفريغها أبداً", + "localized": "الوحدات التي لا يجب تفريغها أبداً", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model types not to quantize", - "localized": "أنواع النماذج التي لا يتم تكميمها", + "localized": "أنواع النماذج التي لا يجب تكميمها", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Modules to not convert", - "localized": "الوحدات التي لا يتم تحويلها", + "localized": "الوحدات التي لا يجب تحويلها", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Modules dtype dict", "localized": "قاموس أنواع البيانات للوحدات", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Math", "localized": "الرياضيات", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Memory limit", "localized": "حد الذاكرة", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "migraphx", "localized": "migraphx", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "max-autotune", "localized": "max-autotune", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "max-autotune-no-cudagraphs", "localized": "max-autotune-no-cudagraphs", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Maximum image size (MP)", - "localized": "أقصى حجم للصورة (ميجا بكسل)", + "localized": "الحد الأقصى لحجم الصورة (ميجا بكسل)", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Max words", - "localized": "أقصى عدد من الكلمات", + "localized": "الحد الأقصى للكلمات", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Modern", "localized": "حديث", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mount URL subpath", - "localized": "مسار فرعي لرابط URL", + "localized": "تثبيت المسار الفرعي للرابط", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mobile scale", - "localized": "مقياس الجوال", + "localized": "مقياس الهاتف المحمول", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Move detailer model to CPU when complete", - "localized": "نقل نموذج المفصل إلى CPU عند الاكتمال", + "localized": "نقل نموذج التفصيل إلى المعالج (CPU) عند الاكتمال", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Move base model to CPU when using refiner", - "localized": "نقل النموذج الأساسي إلى CPU عند استخدام المحسن (Refiner)", + "localized": "نقل النموذج الأساسي إلى المعالج (CPU) عند استخدام المُنقي (Refiner)", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Move base model to CPU when using VAE", - "localized": "نقل النموذج الأساسي إلى CPU عند استخدام VAE", + "localized": "نقل النموذج الأساسي إلى المعالج (CPU) عند استخدام VAE", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Move refiner model to CPU when not in use", - "localized": "نقل نموذج المحسن إلى CPU عندما لا يكون قيد الاستخدام", + "localized": "نقل نموذج المُنقي إلى المعالج (CPU) عند عدم الاستخدام", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Move VAE and CLIP to RAM when training", - "localized": "نقل VAE و CLIP إلى RAM عند التدريب", + "localized": "نقل VAE و CLIP إلى الذاكرة العشوائية (RAM) أثناء التدريب", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model name", "localized": "اسم النموذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model base path", "localized": "المسار الأساسي للنموذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Max shard size", - "localized": "أقصى حجم للجزئية (Shard)", + "localized": "أقصى حجم للجزء", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Model class", "localized": "فئة النموذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Mid Block", "localized": "الكتلة الوسطى", "reload": "", - "hint": "الكتلة المركزية لـ UNet (قيمة واحدة)" + "hint": "الكتلة المركزية لشبكة UNet (قيمة واحدة)" }, { - "id": -1, + "id": 0, "label": "Model precision", "localized": "دقة النموذج", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Maximum rank", - "localized": "أقصى رتبة", + "localized": "الرتبة القصوى", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Midas depth", "localized": "عمق Midas", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "MLSD", "localized": "MLSD", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "MediaPipe Face", "localized": "وجه MediaPipe", "reload": "", "hint": "" }, { - "id": -1, + "id": 0, "label": "Marigold Depth", "localized": "عمق Marigold", "reload": "", @@ -6371,611 +6567,604 @@ ], "n": [ { - "id": 1, + "id": 0, "label": "Networks", "localized": "الشبكات", - "reload": "", + "reload": "n/a", "hint": "واجهة مستخدم الشبكات" }, { - "id": 2, + "id": 1, "label": "New row", "localized": "صف جديد", - "reload": "", + "reload": "n/a", + "hint": "" + }, + { + "id": 2, + "label": "New column", + "localized": "عمود جديد", + "reload": "n/a", "hint": "" }, { "id": 3, - "label": "New column", - "localized": "عمود جديد", - "reload": "", + "label": "Nunchaku", + "localized": "Nunchaku", + "reload": "n/a", "hint": "" }, { "id": 4, - "label": "Nunchaku", - "localized": "نونشاكو (Nunchaku)", - "reload": "", - "hint": "" + "label": "NudeNet", + "localized": "NudeNet", + "reload": "n/a", + "hint": "إضافة مرنة يمكنها اكتشاف وتعتيم المحتوى العاري في الصور" }, { "id": 5, - "label": "nsfw", - "localized": "محتوى حساس (nsfw)", - "reload": "", + "label": "Nunchaku Engine", + "localized": "محرك Nunchaku", + "reload": "n/a", "hint": "" }, { "id": 6, - "label": "NudeNet", - "localized": "نيود نيت (NudeNet)", - "reload": "", - "hint": "ملحق مرن يمكنه اكتشاف وتعتيم العري في الصور" + "label": "NNCF: Neural Network Compression Framework", + "localized": "NNCF: إطار عمل ضغط الشبكات العصبية", + "reload": "n/a", + "hint": "" }, { "id": 7, - "label": "Nunchaku Engine", - "localized": "محرك نونشاكو", - "reload": "", + "label": "Noise Options", + "localized": "خيارات الضجيج", + "reload": "n/a", "hint": "" }, { "id": 8, - "label": "NNCF: Neural Network Compression Framework", - "localized": "NNCF: إطار عمل ضغط الشبكات العصبية", - "reload": "", + "label": "Networks panel", + "localized": "لوحة الشبكات", + "reload": "n/a", "hint": "" }, { "id": 9, - "label": "Noise Options", - "localized": "خيارات الضجيج", - "reload": "", + "label": "Networks UI", + "localized": "واجهة الشبكات", + "reload": "n/a", "hint": "" }, { "id": 10, - "label": "Networks panel", - "localized": "لوحة الشبكات", - "reload": "", + "label": "Networks Scan", + "localized": "مسح الشبكات", + "reload": "n/a", "hint": "" }, { "id": 11, - "label": "Networks UI", - "localized": "واجهة مستخدم الشبكات", - "reload": "", - "hint": "" + "label": "Negative prompt", + "localized": "المطالبة السلبية", + "reload": "n/a", + "hint": "صف ما لا تريد رؤيته في الصورة المولدة" }, { "id": 12, - "label": "Networks Scan", - "localized": "فحص الشبكات", - "reload": "", + "label": "Number", + "localized": "رقم", + "reload": "n/a", "hint": "" }, { "id": 13, - "label": "Negative prompt", - "localized": "الموجه السلبي", - "reload": "", - "hint": "صف ما لا تريد رؤيته في الصورة المنشأة" + "label": "negative", + "localized": "سلبي", + "reload": "n/a", + "hint": "" }, { "id": 14, - "label": "Number", - "localized": "العدد", - "reload": "", + "label": "None", + "localized": "لا شيء", + "reload": "n/a", "hint": "" }, { "id": 15, - "label": "negative", - "localized": "سلبي", - "reload": "", - "hint": "" + "label": "NSFW allowed", + "localized": "السماح بالمحتوى غير الآمن (NSFW)", + "reload": "n/a", + "hint": "السماح للنموذج بتوليد محتوى للبالغين في المطالبات المحسنة" }, { "id": 16, - "label": "None", - "localized": "بلا", - "reload": "", + "label": "Noise strength", + "localized": "قوة الضجيج", + "reload": "n/a", "hint": "" }, { "id": 17, - "label": "NSFW allowed", - "localized": "السماح بالمحتوى الحساس", - "reload": "", - "hint": "السماح للنموذج بإنشاء محتوى للبالغين في الموجهات المحسنة" + "label": "NMS", + "localized": "NMS", + "reload": "n/a", + "hint": "" }, { "id": 18, - "label": "Noise strength", - "localized": "قوة الضجيج", - "reload": "", + "label": "Near threshold", + "localized": "عتبة القرب", + "reload": "n/a", "hint": "" }, { "id": 19, - "label": "NMS", - "localized": "NMS", - "reload": "", + "label": "Noise scale", + "localized": "مقياس الضجيج", + "reload": "n/a", "hint": "" }, { "id": 20, - "label": "Near threshold", - "localized": "عتبة القرب", - "reload": "", + "label": "Note", + "localized": "ملاحظة", + "reload": "n/a", "hint": "" }, { "id": 21, - "label": "Noise scale", - "localized": "مقياس الضجيج", - "reload": "", + "label": "Non-blocking move operations", + "localized": "عمليات النقل غير المحظورة", + "reload": "n/a", "hint": "" }, { "id": 22, - "label": "Note", - "localized": "ملاحظة", - "reload": "", - "hint": "" + "label": "Nunchaku attention", + "localized": "آلية انتباه Nunchaku", + "reload": "n/a", + "hint": "يستبدل آلية الانتباه الافتراضية بنواة انتباه مخصصة FP16 من Nunchaku لاستنتاج أسرع على وحدات معالجة الرسوميات (GPU) من NVIDIA الموجهة للمستهلكين. قد يوفر تحسناً في الأداء على وحدات معالجة الرسوميات التي لديها معدل نقل نوى (tensor cores) بنمط FP16 أعلى من BF16. حالياً يؤثر فقط على النماذج المستندة إلى Flux (مثل Dev وSchnell وKontext وFill وDepth، إلخ). ليس له أي تأثير على Qwen أو SDXL أو Sana أو معماريات أخرى. معطل افتراضياً." }, { "id": 23, - "label": "Non-blocking move operations", - "localized": "عمليات نقل غير مانعة", - "reload": "", - "hint": "" + "label": "Nunchaku offloading", + "localized": "تفريغ Nunchaku", + "reload": "n/a", + "hint": "يُفعل تفريغ Nunchaku الخاص لكل كتلة إلى المعالج (CPU) مع تدفقات CUDA غير متزامنة لتقليل استخدام ذاكرة الفيديو (VRAM). يستخدم استراتيجية المخزن المؤقت التبادلي (ping-pong buffer): بينما تقوم كتلة المحول (transformer block) بالحساب على GPU، تقوم الكتلة التالية بالتحميل المسبق من المعالج في الخلفية، مما يخفي معظم زمن انتقال النقل. يمكن أن يقلل من استخدام VRAM على حساب استنتاج أبطأ. هذا يستبدل تفريغ خط أنابيب SD.Next لمكون المحول. مفيد فقط على وحدات معالجة الرسوميات ذات ذاكرة VRAM منخفضة. إذا كانت وحدة معالجة الرسوميات لديك تحتوي على ذاكرة كافية لاستيعاب النموذج المكمم (16+ جيجابايت)، اترك هذا معطلاً للحصول على أقصى سرعة. يدعم نماذج Flux و Qwen. غير مدعوم لـ SDXL حيث يتم تجاهل هذا الإعداد. معطل افتراضياً." }, { "id": 24, - "label": "Nunchaku attention", - "localized": "انتباه نونشاكو", - "reload": "", - "hint": "يستبدل آلية الانتباه الافتراضية بنواة انتباه FP16 المخصصة من Nunchaku لاستدلال أسرع على معالجات NVIDIA الرسومية الموجهة للمستهلكين.
قد يوفر تحسيناً في الأداء على المعالجات التي تمتلك إنتاجية نوى تنسور FP16 أعلى من BF16.

يؤثر حالياً فقط على النماذج القائمة على Flux (مثل Dev و Schnell و Kontext و Fill و Depth وغيرها). ليس له تأثير على Qwen أو SDXL أو Sana أو البنيات الأخرى.

معطل افتراضياً." + "label": "native", + "localized": "أصلي", + "reload": "n/a", + "hint": "" }, { "id": 25, - "label": "Nunchaku offloading", - "localized": "تفريغ نونشاكو", - "reload": "", - "hint": "يفعل تفريغ الذاكرة الخاص بـ Nunchaku لكل كتلة إلى المعالج المركزي مع تدفقات CUDA غير المتزامنة لتقليل استخدام VRAM.
يستخدم استراتيجية تخزين مؤقت متبادل (ping-pong): بينما تحسب كتلة محول واحدة على المعالج الرسومي، يتم تحميل الكتلة التالية مسبقاً من المعالج المركزي في الخلفية، مما يخفي معظم تأخير النقل.

يمكن أن يقلل من استخدام VRAM على حساب استدلال أبطأ.
هذا يستبدل تفريغ مسار العمل الخاص بـ SD.Next لمكون المحول.

مفيد فقط على المعالجات الرسومية ذات ذاكرة VRAM المنخفضة. إذا كانت ذاكرة معالجك كافية لاستيعاب النموذج المكمم (16+ جيجابايت)، فاحتفظ بهذا الخيار معطلاً لأقصى سرعة.
يدعم نماذج Flux و Qwen. غير مدعوم لـ SDXL حيث يتم تجاهل هذا الإعداد.
معطل افتراضياً." + "label": "no-grad", + "localized": "بدون تدرج (no-grad)", + "reload": "n/a", + "hint": "تعطيل تتبع التدرج باستخدام torch.no_grad. يقلل من استخدام الذاكرة ويسرع عملية الاستنتاج." }, { "id": 26, - "label": "native", - "localized": "أصلي", - "reload": "", + "label": "Numbered filenames", + "localized": "أسماء ملفات مرقمة", + "reload": "n/a", "hint": "" }, { "id": 27, - "label": "no-grad", - "localized": "بدون تدرج (no-grad)", - "reload": "", - "hint": "يعطل تتبع التدرج باستخدام torch.no_grad. يقلل من استخدام الذاكرة ويسرع الاستدلال." + "label": "Network card size (px)", + "localized": "حجم بطاقة الشبكة (بالبكسل)", + "reload": "n/a", + "hint": "" }, { "id": 28, - "label": "Numbered filenames", - "localized": "أسماء ملفات مرقمة", - "reload": "", + "label": "Noise multiplier for image processing", + "localized": "مضاعف الضجيج لمعالجة الصور", + "reload": "n/a", "hint": "" }, { "id": 29, - "label": "Network card size (px)", - "localized": "حجم بطاقة الشبكة (بكسل)", - "reload": "", + "label": "New model name", + "localized": "اسم نموذج جديد", + "reload": "n/a", "hint": "" }, { "id": 30, - "label": "Noise multiplier for image processing", - "localized": "مضاعف الضجيج لمعالجة الصور", - "reload": "", - "hint": "" + "label": "Number of ReBasin Iterations", + "localized": "عدد تكرارات ReBasin", + "reload": "n/a", + "hint": "عدد المرات التي يتم فيها دمج النموذج وتبديله قبل الحفظ" }, { "id": 31, - "label": "New model name", - "localized": "اسم النموذج الجديد", - "reload": "", + "label": "Network prompt", + "localized": "مطالبة الشبكة", + "reload": "n/a", "hint": "" }, { "id": 32, - "label": "Number of ReBasin Iterations", - "localized": "عدد تكرارات ReBasin", - "reload": "", - "hint": "عدد مرات دمج وتبديل النموذج قبل الحفظ" + "label": "Network negative prompt", + "localized": "المطالبة السلبية للشبكة", + "reload": "n/a", + "hint": "" }, { "id": 33, - "label": "Network prompt", - "localized": "موجه الشبكة", - "reload": "", - "hint": "" - }, - { - "id": 34, - "label": "Network negative prompt", - "localized": "الموجه السلبي للشبكة", - "reload": "", - "hint": "" - }, - { - "id": 35, "label": "Network parameters", - "localized": "معلمات الشبكة", - "reload": "", + "localized": "معاملات الشبكة", + "reload": "n/a", "hint": "" } ], "o": [ { - "id": 755, - "label": "Output", - "localized": "المخرجات", + "id": 0, + "label": "txt2img_results_mobile", + "localized": "نتائج تحويل النص إلى صورة للجوال", "reload": "", - "hint": "إظهار/إخفاء اختيار وسائط الإخراج: نتائج التوليد والمعاينات المباشرة أثناء عملية التوليد" + "hint": "إظهار/إخفاء اختيار وسائط الإخراج: نتائج التوليد والمعاينات الحية أثناء عملية التوليد" }, { - "id": 318, + "id": 1, "label": "OpenCLiP", "localized": "OpenCLiP", "reload": "", "hint": "تحليل الصورة باستخدام نموذج CLiP عبر OpenCLiP" }, { - "id": 126, + "id": 2, "label": "ONNX", "localized": "ONNX", "reload": "", "hint": "" }, { - "id": 150, + "id": 3, "label": "Override", "localized": "تجاوز", "reload": "", - "hint": "تجاوز الإعدادات التي يمكن أن تغير سلوك الخادم والتي يتم تطبيقها عادةً من البيانات الوصفية للصورة المستوردة" + "hint": "تجاوز الإعدادات التي يمكن أن تغير سلوك الخادم والتي يتم تطبيقها عادةً من بيانات تعريف الصورة المستوردة" }, { - "id": 152, + "id": 4, "label": "Optimum Quanto", "localized": "Optimum Quanto", "reload": "", "hint": "" }, { - "id": 301, + "id": 5, "label": "Optimum Quanto: post-load", - "localized": "Optimum Quanto: بعد التحميل", + "localized": "Optimum Quanto: ما بعد التحميل", "reload": "", "hint": "" }, { - "id": 924, + "id": 6, "label": "Optional", "localized": "اختياري", "reload": "", "hint": "" }, { - "id": 90, + "id": 7, "label": "Olive", "localized": "Olive", "reload": "", "hint": "" }, { - "id": 100, + "id": 8, "label": "OpenVINO", "localized": "OpenVINO", "reload": "", "hint": "" }, { - "id": 54, + "id": 9, "label": "Other...", "localized": "أخرى...", "reload": "", "hint": "" }, { - "id": 66, + "id": 10, "label": "Outputs & Images", "localized": "المخرجات والصور", "reload": "", "hint": "" }, { - "id": 151, + "id": 11, "label": "Override settings", "localized": "تجاوز الإعدادات", "reload": "", - "hint": "إذا كانت معلمات التوليد تختلف عن إعدادات نظامك، فسيتم تجاوز الإعدادات المعبأة بتلك الإعدادات لتجاوز تكوين نظامك لسير العمل هذا" + "hint": "إذا انحرفت معلمات التوليد عن إعدادات نظامك، فسيتم تعبئة إعدادات التجاوز بهذه المعلمات لتجاوز تكوين النظام الخاص بك لهذا سير العمل" }, { - "id": 552, + "id": 12, "label": "Override sampler", - "localized": "تجاوز أخذ العينات (Sampler)", + "localized": "تجاوز أداة أخذ العينات (Sampler)", "reload": "", "hint": "" }, { - "id": 551, + "id": 13, "label": "Override steps", "localized": "تجاوز الخطوات", "reload": "", "hint": "" }, { - "id": 412, + "id": 14, "label": "Ortho", "localized": "Ortho", "reload": "", "hint": "" }, { - "id": 413, + "id": 15, "label": "Offload face module", "localized": "تفريغ وحدة الوجه", "reload": "", "hint": "" }, { - "id": 611, + "id": 16, "label": "Override scheduler", "localized": "تجاوز المجدول", "reload": "", "hint": "" }, { - "id": 610, + "id": 17, "label": "Optional image description", - "localized": "وصف اختياري للصورة", + "localized": "وصف صورة اختياري", "reload": "", "hint": "" }, { - "id": 600, + "id": 18, "label": "Order", "localized": "الترتيب", "reload": "", "hint": "" }, { - "id": 601, + "id": 19, "label": "Overlay", "localized": "تراكب", "reload": "", "hint": "" }, { - "id": 602, + "id": 20, "label": "Override resolution", "localized": "تجاوز الدقة", "reload": "", "hint": "" }, { - "id": 603, + "id": 21, "label": "Offload processor", "localized": "تفريغ المعالج", "reload": "", "hint": "" }, { - "id": 604, + "id": 22, "label": "Output directory", - "localized": "دليل المخرجات", + "localized": "مجلد المخرجات", "reload": "", "hint": "المجلد الذي يجب حفظ الصور المعالجة فيه" }, { - "id": 605, + "id": 23, "label": "original", - "localized": "الأصلي", + "localized": "أصلي", "reload": "", - "hint": "خلفية LDM الأصلية" + "hint": "محرك LDM الأصلي" }, { - "id": 606, + "id": 24, "label": "Offload caption models", - "localized": "تفريغ نماذج التعليق", + "localized": "تفريغ نماذج التعليق التوضيحي", "reload": "", "hint": "" }, { - "id": 607, + "id": 25, "label": "Offload during pre-forward", - "localized": "تفريغ أثناء التمرير المسبق", + "localized": "تفريغ أثناء المعالجة المسبقة (Pre-forward)", "reload": "", "hint": "" }, { - "id": 608, + "id": 26, "label": "Offload using streams", "localized": "تفريغ باستخدام التدفقات", "reload": "", "hint": "" }, { - "id": 609, + "id": 27, "label": "Offload low watermark", - "localized": "العلامة المائية المنخفضة للتفريغ", + "localized": "تفريغ العلامة المائية المنخفضة", "reload": "", "hint": "" }, { - "id": 612, + "id": 28, "label": "Offload GPU high watermark", - "localized": "العلامة المائية العالية لتفريغ GPU", + "localized": "تفريغ العلامة المائية العالية لـ GPU", "reload": "", "hint": "" }, { - "id": 613, + "id": 29, "label": "Offload CPU high watermark", - "localized": "العلامة المائية العالية لتفريغ CPU", + "localized": "تفريغ العلامة المائية العالية لـ CPU", "reload": "", "hint": "" }, { - "id": 614, + "id": 30, "label": "Offload blocks", "localized": "تفريغ الكتل", "reload": "", "hint": "" }, { - "id": 615, + "id": 31, "label": "OpenVINO activations mode", - "localized": "وضع تنشيطات OpenVINO", + "localized": "وضع تفعيل OpenVINO", "reload": "", "hint": "" }, { - "id": 616, + "id": 32, "label": "ONNX Execution Provider", "localized": "مزود تنفيذ ONNX", "reload": "", "hint": "" }, { - "id": 617, + "id": 33, "label": "ONNX allow fallback to CPU", "localized": "السماح لـ ONNX بالرجوع إلى المعالج (CPU)", "reload": "", "hint": "السماح بالرجوع إلى المعالج عند فشل مزود التنفيذ المحدد" }, { - "id": 618, + "id": 34, "label": "ONNX cache converted models", "localized": "تخزين النماذج المحولة لـ ONNX مؤقتاً", "reload": "", - "hint": "حفظ النماذج التي تم تحويلها إلى تنسيق ONNX كذاكرة تخزين مؤقت. يمكنك إدارتها في تبويب ONNX" + "hint": "حفظ النماذج التي يتم تحويلها إلى تنسيق ONNX كذاكرة تخزين مؤقت. يمكنك إدارتها في علامة تبويب ONNX" }, { - "id": 619, + "id": 35, "label": "ONNX unload base model when processing refiner", - "localized": "تفريغ النموذج الأساسي عند معالجة المصفي (Refiner) في ONNX", + "localized": "تفريغ النموذج الأساسي لـ ONNX عند معالجة المصحح (Refiner)", "reload": "", - "hint": "تفريغ النموذج الأساسي عندما يتم تحويل/تحسين/معالجة المصفي" + "hint": "تفريغ النموذج الأساسي عند تحويل/تحسين/معالجة المصحح" }, { - "id": 620, + "id": 36, "label": "Olive use FP16 on optimization", - "localized": "استخدام FP16 في تحسين Olive", + "localized": "استخدام Olive لدقة FP16 عند التحسين", "reload": "", - "hint": "استخدام دقة نقطة عائمة 16 بت لنموذج مخرجات عملية تحسين Olive. استخدم دقة 32 بت إذا تم التعطيل" + "hint": "استخدام دقة الفاصلة العائمة 16-بت للنموذج الناتج لعملية تحسين Olive. استخدم دقة الفاصلة العائمة 32-بت إذا تم تعطيله" }, { - "id": 621, + "id": 37, "label": "Olive force FP32 for VAE Encoder", - "localized": "فرض FP32 لمشفر VAE في Olive", + "localized": "إجبار Olive على استخدام FP32 لمشفر VAE", "reload": "", - "hint": "استخدام دقة نقطة عائمة 32 بت لمشفر VAE لنموذج المخرجات. هذا يتجاوز خيار 'استخدام FP16 في التحسين'. إذا كنت تحصل على صور فارغة أو سوداء من Img2Img، فقم بتمكين هذا الخيار واحذف ذاكرة التخزين المؤقت" + "hint": "استخدام دقة الفاصلة العائمة 32-بت لمشفر VAE للنموذج الناتج. هذا يتجاوز خيار 'استخدام FP16 عند التحسين'. إذا كنت تحصل على صور فارغة (NaN أو سوداء) من Img2Img، قم بتمكين هذا الخيار وإزالة ذاكرة التخزين المؤقت" }, { - "id": 622, + "id": 38, "label": "Olive use static dimensions", - "localized": "استخدام أبعاد ثابتة في Olive", + "localized": "استخدام Olive للأبعاد الثابتة", "reload": "", - "hint": "جعل الاستدلال مع نماذج Olive المحسنة أسرع بكثير" + "hint": "جعل الاستنتاج باستخدام نماذج Olive المحسنة أسرع بكثير. (OrtTransformersOptimization)" }, { - "id": 623, + "id": 39, "label": "Olive cache optimized models", "localized": "تخزين نماذج Olive المحسنة مؤقتاً", "reload": "", - "hint": "حفظ نماذج Olive المعالجة كذاكرة تخزين مؤقت. يمكنك إدارتها في تبويب ONNX" + "hint": "حفظ نماذج Olive المعالجة كذاكرة تخزين مؤقت. يمكنك إدارتها في علامة تبويب ONNX" }, { - "id": 624, + "id": 40, "label": "OpenVINO disable model caching", "localized": "تعطيل التخزين المؤقت للنماذج في OpenVINO", "reload": "", "hint": "" }, { - "id": 625, + "id": 41, "label": "OpenVINO disable memory cleanup after compile", - "localized": "تعطيل تنظيف الذاكرة بعد الترجمة في OpenVINO", + "localized": "تعطيل تنظيف الذاكرة في OpenVINO بعد التجميع", "reload": "", "hint": "" }, { - "id": 626, + "id": 42, "label": "onediff", "localized": "onediff", "reload": "", "hint": "" }, { - "id": 627, + "id": 43, "label": "olive-ai", "localized": "olive-ai", "reload": "", "hint": "" }, { - "id": 628, + "id": 44, "label": "openvino_fx", "localized": "openvino_fx", "reload": "", "hint": "" }, { - "id": 629, + "id": 45, "label": "Overwrite existing", - "localized": "استبدال الموجود", + "localized": "الكتابة فوق الموجود", "reload": "", "hint": "" }, { - "id": 630, + "id": 46, "label": "Out Block", - "localized": "كتلة الإخراج", + "localized": "كتلة الإخراج (Out Block)", "reload": "", - "hint": "كتل رفع العينات (Upsampling) لـ UNet (12 قيمة لـ SD1.5، 9 قيم لـ SDXL)" + "hint": "كتل رفع العينات لـ UNet (12 قيمة لـ SD1.5، 9 قيم لـ SDXL)" }, { - "id": 631, + "id": 47, "label": "Overwrite model", - "localized": "استبدال النموذج", + "localized": "الكتابة فوق النموذج", "reload": "", "hint": "" }, { - "id": 632, + "id": 48, "label": "Output model", "localized": "نموذج المخرجات", "reload": "", "hint": "" }, { - "id": 633, + "id": 49, "label": "Overwrite existing file", - "localized": "استبدال الملف الموجود", + "localized": "الكتابة فوق الملف الموجود", "reload": "", "hint": "" }, { - "id": 634, + "id": 50, "label": "Options", "localized": "خيارات", "reload": "", "hint": "" }, { - "id": 635, + "id": 51, "label": "OpenBody", "localized": "OpenBody", "reload": "", @@ -6984,21 +7173,21 @@ ], "p": [ { - "id": 755, + "id": 0, "label": "Process", "localized": "معالجة", "reload": "", - "hint": "معالجة صورة موجودة
يمكن استخدامها لترقية الصور، أو إزالة الخلفيات، أو تعتيم محتوى للكبار، أو تطبيق مرشحات وتأثيرات متنوعة" + "hint": "معالجة صورة موجودة
يمكن استخدامه لرفع دقة الصور، إزالة الخلفيات، طمس محتوى NSFW، وتطبيق فلاتر وتأثيرات متنوعة" }, { - "id": 552, + "id": 0, "label": "Prompts", "localized": "المطالبات", "reload": "", "hint": "مطالبة الصورة والمطالبة السلبية" }, { - "id": 551, + "id": 0, "label": "Pause", "localized": "إيقاف مؤقت", "reload": "", @@ -7007,7 +7196,7 @@ { "id": 0, "label": "Post", - "localized": "بعد", + "localized": "بعد المعالجة", "reload": "", "hint": "تغيير حجم الصورة بعد المعالجة" }, @@ -7030,14 +7219,14 @@ "label": "Process Batch", "localized": "معالجة دفعة", "reload": "", - "hint": "معالجة مجموعة صور دفعة واحدة" + "hint": "معالجة مجموعة من الصور" }, { "id": 0, "label": "Process Folder", "localized": "معالجة مجلد", "reload": "", - "hint": "معالجة جميع الصور في مجلد معين" + "hint": "معالجة جميع الصور في مجلد" }, { "id": 0, @@ -7049,28 +7238,21 @@ { "id": 0, "label": "Pipeline Modifiers", - "localized": "معدلات خط المعالجة", + "localized": "معدلات المسار", "reload": "", - "hint": "وظائف إضافية يمكن تمكينها أثناء التوليد" + "hint": "وظائف إضافية يمكن تفعيلها أثناء الإنشاء" }, { "id": 0, "label": "Postprocessing", "localized": "المعالجة اللاحقة", "reload": "", - "hint": "الإعدادات المتعلقة بمعالجة الصور وترقيتها بعد التوليد" + "hint": "الإعدادات المتعلقة بمعالجة الصور بعد التوليد ورفع الدقة" }, { "id": 0, "label": "Preset Block Merge", - "localized": "دمج الكتل المسبق", - "reload": "", - "hint": "" - }, - { - "id": 0, - "label": "Pony", - "localized": "Pony", + "localized": "دمج الكتل المعد مسبقاً", "reload": "", "hint": "" }, @@ -7093,7 +7275,7 @@ "label": "Processed Preview", "localized": "معاينة المعالجة", "reload": "", - "hint": "إظهار/إخفاء قسم المعالجة المسبقة لصور الإدخال قبل التوليد الفعلي" + "hint": "إظهار/إخفاء قسم المعالجة الأولية للصور المدخلة قبل التوليد الفعلي" }, { "id": 0, @@ -7105,14 +7287,14 @@ { "id": 0, "label": "PAG: Perturbed attention guidance", - "localized": "PAG: توجيه الانتباه المضطرب", + "localized": "توجيه الانتباه المضطرب (PAG)", "reload": "", "hint": "" }, { "id": 0, "label": "PAB: Pyramid attention broadcast", - "localized": "PAB: بث انتباه الهرم", + "localized": "بث الانتباه الهرمي (PAB)", "reload": "", "hint": "" }, @@ -7135,7 +7317,7 @@ "label": "Prediction method", "localized": "طريقة التنبؤ", "reload": "", - "hint": "تحدد ما يتنبأ به النموذج في كل خطوة. الخيارات:
- default: افتراضي النموذج
- epsilon: الضوضاء (الأكثر شيوعاً لـ Stable Diffusion)
- sample: تنبؤ مباشر بالصورة المنقحة، يسمى أيضاً تنبؤ x0
- v_prediction: تنبؤ السرعة، يستخدم في نماذج CosXL و NoobAI VPred
- flow_prediction: يستخدم مع نماذج مطابقة التدفق الأحدث مثل SD3 و Flux" + "hint": "يحدد ما يتنبأ به النموذج في كل خطوة. الخيارات:
- default: افتراضي النموذج
- epsilon: الضجيج (الأكثر شيوعاً لـ Stable Diffusion)
- sample: تنبؤ الصورة المباشر بدون ضجيج، ويسمى أيضاً تنبؤ x0
- v_prediction: تنبؤ السرعة، يستخدم بواسطة نماذج CosXL و NoobAI VPred
- flow_prediction: يستخدم مع نماذج تدفق البيانات الجديدة مثل SD3 و Flux" }, { "id": 0, @@ -7168,7 +7350,7 @@ { "id": 0, "label": "PAG config", - "localized": "تكوين PAG", + "localized": "إعدادات PAG", "reload": "", "hint": "" }, @@ -7196,7 +7378,7 @@ { "id": 0, "label": "Penalty", - "localized": "عقوبة", + "localized": "العقوبة", "reload": "", "hint": "" }, @@ -7210,14 +7392,14 @@ { "id": 0, "label": "Prompt EX", - "localized": "مطالبة EX", + "localized": "Prompt EX", "reload": "", "hint": "" }, { "id": 0, "label": "Power", - "localized": "قوة", + "localized": "الطاقة", "reload": "", "hint": "" }, @@ -7231,7 +7413,7 @@ { "id": 0, "label": "Preset", - "localized": "مسبق الضبط", + "localized": "إعداد مسبق", "reload": "", "hint": "" }, @@ -7247,26 +7429,26 @@ "label": "Prefill text", "localized": "نص التعبئة المسبقة", "reload": "", - "hint": "يملأ بداية استجابة النموذج مسبقاً لتوجيه تنسيق الإخراج أو المحتوى عن طريق إجباره على إكمال نص التعبئة المسبقة.
يتم تصفية التعبئة المسبقة ولا تظهر في الاستجابة النهائية.

اتركه فارغاً للسماح للنموذج بتوليد استجابته الخاصة من البداية." + "hint": "يملأ بداية استجابة النموذج مسبقاً لتوجيه تنسيق مخرجاته أو محتواها عبر إجباره على إكمال النص.
تتم تصفية النص المعبأ مسبقاً ولا يظهر في الاستجابة النهائية.

اتركه فارغاً للسماح للنموذج بتوليد استجابته من الصفر." }, { "id": 0, "label": "Prompt prefix", "localized": "بادئة المطالبة", "reload": "", - "hint": "نص يضاف في بداية نتيجة المطالبة المحسنة.

مفيد لإضافة عناصر المطالبة التي يجب نسخها إلى مطالبة الصورة دون تغيير، مثل وسوم الجودة 'masterpiece, best quality' أو أسماء الفنانين، والتي قد يتم إعادة كتابتها بواسطة نموذج اللغة (LLM)." + "hint": "نص يوضع في بداية نتيجة المطالبة المحسنة.

مفيد لإضافة عناصر للمطالبة تحتاج إلى نسخها إلى مطالبة الصورة دون تغيير، مثل وسوم الجودة 'masterpiece, best quality' أو أسماء الفنانين، التي قد يعيد نموذج اللغة صياغتها." }, { "id": 0, "label": "Prompt suffix", "localized": "لاحقة المطالبة", "reload": "", - "hint": "نص يلحق بنهاية نتيجة المطالبة المحسنة.

مفيد لإضافة عناصر المطالبة التي يجب نسخها إلى مطالبة الصورة دون تغيير، والتي قد يتم إعادة كتابتها بواسطة نموذج اللغة (LLM)." + "hint": "نص يوضع في نهاية نتيجة المطالبة المحسنة.

مفيد لإضافة عناصر للمطالبة تحتاج إلى نسخها إلى مطالبة الصورة دون تغيير، والتي قد يعيد نموذج اللغة صياغتها." }, { "id": 0, "label": "Padding", - "localized": "حشو", + "localized": "الحشو", "reload": "", "hint": "" }, @@ -7294,7 +7476,7 @@ { "id": 0, "label": "Pixels to expand", - "localized": "بكسلات للتوسيع", + "localized": "البكسلات للتوسيع", "reload": "", "hint": "" }, @@ -7303,7 +7485,7 @@ "label": "Processor", "localized": "المعالج", "reload": "", - "hint": "نوع المعالج المستخدم لمعالجة الصورة مسبقاً لاستخدامها في ControlNet" + "hint": "نوع المعالج المستخدم للمعالجة الأولية للصورة المستخدمة لـ ControlNet" }, { "id": 0, @@ -7315,16 +7497,16 @@ { "id": 0, "label": "Parameter free", - "localized": "خالٍ من المعلمات", + "localized": "خالٍ من البارامترات", "reload": "", "hint": "" }, { "id": 0, "label": "Processed", - "localized": "تمت معالجته", + "localized": "تمت المعالجة", "reload": "", - "hint": "إظهار/إخفاء القسم الذي يحتوي على الصور المعالجة" + "hint": "إظهار/إخفاء قسم الصور التي تمت معالجتها" }, { "id": 0, @@ -7343,7 +7525,7 @@ { "id": 0, "label": "PixelArt sharpen", - "localized": "حدة فن البكسل", + "localized": "حدّة فن البكسل", "reload": "", "hint": "" }, @@ -7357,7 +7539,7 @@ { "id": 0, "label": "Pipeline", - "localized": "خط المعالجة", + "localized": "المسار (Pipeline)", "reload": "", "hint": "" }, @@ -7373,7 +7555,7 @@ "label": "Prompt attention normalization", "localized": "تطبيع انتباه المطالبة", "reload": "", - "hint": "يوازن أوزان رموز المطالبة لتجنب التأثير القوي جداً أو الضعيف جداً. يساعد في استقرار المخرجات." + "hint": "يوازن أوزان رموز المطالبة لتجنب التأثير القوي أو الضعيف جداً. يساعد في استقرار المخرجات." }, { "id": 0, @@ -7382,80 +7564,73 @@ "reload": "", "hint": "" }, - { - "id": 0, - "label": "Performance Counter", - "localized": "عداد الأداء", - "reload": "", - "hint": "" - }, { "id": 0, "label": "PAG layer names", "localized": "أسماء طبقات PAG", "reload": "", - "hint": "قائمة طبقات مفصولة بمسافات
المتاح: d[0-5], m[0], u[0-8]
الافتراضي: m0" + "hint": "قائمة الطبقات مفصولة بمسافات
المتاحة: d[0-5], m[0], u[0-8]
الافتراضي: m0" }, { "id": 0, "label": "PAB cache enabled", - "localized": "تمكين تخزين PAB", + "localized": "تفعيل ذاكرة التخزين المؤقت PAB", "reload": "", "hint": "" }, { "id": 0, "label": "PAB spacial skip range", - "localized": "نطاق التخطي المكاني PAB", + "localized": "نطاق تخطي PAB المكاني", "reload": "", "hint": "" }, { "id": 0, "label": "PAB spacial skip start", - "localized": "بداية التخطي المكاني PAB", + "localized": "بداية تخطي PAB المكاني", "reload": "", "hint": "" }, { "id": 0, "label": "PAB spacial skip end", - "localized": "نهاية التخطي المكاني PAB", + "localized": "نهاية تخطي PAB المكاني", "reload": "", "hint": "" }, { "id": 0, "label": "ParaAttention first-block cache enabled", - "localized": "تمكين تخزين الكتلة الأولى في ParaAttention", + "localized": "تفعيل ذاكرة الكتلة الأولى للانتباه الموازي", "reload": "", "hint": "" }, { "id": 0, "label": "ParaAttention residual diff threshold", - "localized": "عتبة فرق البواقي في ParaAttention", + "localized": "عتبة فرق المتبقي للانتباه الموازي", "reload": "", "hint": "" }, { "id": 0, "label": "Parallel process images in batch", - "localized": "معالجة الصور بالتوازي في الدفعة", + "localized": "معالجة الصور الموازية في الدفعة", "reload": "", "hint": "" }, { "id": 0, "label": "precompile", - "localized": "ترجمة مسبقة", + "localized": "تجميع مسبق", "reload": "", "hint": "" }, { "id": 0, "label": "Panel minimum width", - "localized": "أقل عرض للوحة", + "localized": "الحد الأدنى لعرض اللوحة", "reload": "", "hint": "" }, @@ -7471,7 +7646,7 @@ "label": "Progress update period", "localized": "فترة تحديث التقدم", "reload": "", - "hint": "فترة التحديث لشريط تقدم واجهة المستخدم وفحص المعاينة، بالمللي ثانية" + "hint": "فترة التحديث لشريط التقدم في واجهة المستخدم وفحوصات المعاينة، بالميلي ثانية" }, { "id": 0, @@ -7490,7 +7665,7 @@ { "id": 0, "label": "Postprocessing operation order", - "localized": "ترتيب عمليات المعالجة اللاحقة", + "localized": "ترتيب عملية المعالجة اللاحقة", "reload": "", "hint": "" }, @@ -7504,7 +7679,7 @@ { "id": 0, "label": "Pad prompt and negative prompt to be same length", - "localized": "حشو المطالبة والمطالبة السلبية ليكون لهما نفس الطول", + "localized": "حشو المطالبة والمطالبة السلبية لتكونا بنفس الطول", "reload": "", "hint": "" }, @@ -7525,9 +7700,9 @@ { "id": 0, "label": "Preset Interpolation Ratio", - "localized": "نسبة الاستيفاء المسبق", + "localized": "نسبة استيفاء الإعداد المسبق", "reload": "", - "hint": "إذا تم تحديد ضبطين مسبقين، يتم الاستيفاء بينهما" + "hint": "إذا تم تحديد إعدادين مسبقين، يتم الاستيفاء بينهما" }, { "id": 0, @@ -7548,7 +7723,7 @@ "label": "Prompt enhance", "localized": "تحسين المطالبة", "reload": "", - "hint": "إضافة يمكنها استخدام نماذج لغة (LLMs) مختلفة لإعادة كتابة المطالبة لتحسين النتائج" + "hint": "إضافة يمكنها استخدام نماذج لغوية (LLMs) مختلفة لإعادة صياغة المطالبة للحصول على نتائج أفضل" }, { "id": 0, @@ -7560,3004 +7735,3060 @@ { "id": 0, "label": "Parameters", - "localized": "المعلمات", + "localized": "البارامترات", "reload": "", - "hint": "المعلمات الأساسية المستخدمة أثناء توليد الصورة" + "hint": "البارامترات الأساسية المستخدمة أثناء توليد الصورة" }, { "id": 0, "label": "Postprocess upscale", - "localized": "ترقية المعالجة اللاحقة", + "localized": "رفع دقة المعالجة اللاحقة", "reload": "", "hint": "" } ], "q": [ { - "id": 0, + "id": 1, "label": "Quick Settings", - "localized": "إعدادات سريعة", - "reload": "", - "hint": "العناصر المفضلة من أقسام الإعدادات المختلفة للوصول السريع" + "localized": "الإعدادات السريعة", + "reload": "n/a", + "hint": "عناصر مفضلة من أقسام إعدادات مختلفة للوصول السريع إليها" }, { - "id": 0, + "id": 2, "label": "Quantized", - "localized": "مكمم (Quantized)", - "reload": "", - "hint": "" + "localized": "مُكمم (Quantized)", + "reload": "n/a", + "hint": "تطبيق عملية التكميم لتقليل حجم النموذج" }, { - "id": 0, + "id": 3, "label": "Qwen layered", - "localized": "Qwen ذو طبقات", - "reload": "", - "hint": "" + "localized": "طبقات Qwen", + "reload": "n/a", + "hint": "إعدادات خاصة بطبقات نموذج Qwen" }, { - "id": 0, + "id": 4, "label": "Quicksettings", - "localized": "إعدادات سريعة", - "reload": "", - "hint": "" + "localized": "الإعدادات السريعة", + "reload": "n/a", + "hint": "الإعدادات السريعة للوصول السريع" }, { - "id": 0, + "id": 5, "label": "Qwen layered number of layers", "localized": "عدد طبقات Qwen", - "reload": "", - "hint": "" + "reload": "n/a", + "hint": "تحديد عدد الطبقات لنموذج Qwen" }, { - "id": 0, + "id": 6, "label": "Quantization mode", "localized": "وضع التكميم", - "reload": "", - "hint": "" + "reload": "n/a", + "hint": "اختيار وضع التكميم المستخدم" }, { - "id": 0, + "id": 7, "label": "Quantization type", "localized": "نوع التكميم", - "reload": "", - "hint": "" + "reload": "n/a", + "hint": "تحديد نوع خوارزمية التكميم" }, { - "id": 0, + "id": 8, "label": "Quantized MatMul type", - "localized": "نوع ضرب المصفوفات المكمم (MatMul)", - "reload": "", - "hint": "" + "localized": "نوع ضرب المصفوفات المُكمم", + "reload": "n/a", + "hint": "نوع عملية ضرب المصفوفات المستخدمة عند التكميم" }, { - "id": 0, + "id": 9, "label": "Quantization type for Text Encoders", "localized": "نوع التكميم لمشفرات النصوص", - "reload": "", - "hint": "" + "reload": "n/a", + "hint": "نوع التكميم المطبق على مشفرات النصوص" }, { - "id": 0, + "id": 10, "label": "Quantized MatMul type for Text Encoders", - "localized": "نوع ضرب المصفوفات المكمم لمشفرات النصوص", - "reload": "", - "hint": "" + "localized": "نوع ضرب المصفوفات المُكمم لمشفرات النصوص", + "reload": "n/a", + "hint": "نوع عملية ضرب المصفوفات المستخدمة لمشفرات النصوص" }, { - "id": 0, + "id": 11, "label": "Quantize convolutional layers", - "localized": "تكميم الطبقات الالتفافية", - "reload": "", - "hint": "" + "localized": "تكميم الطبقات التلافيفية", + "reload": "n/a", + "hint": "تطبيق التكميم على الطبقات التلافيفية (Convolutional Layers)" }, { - "id": 0, + "id": 12, "label": "Quantize using GPU", - "localized": "التكميم باستخدام وحدة معالجة الرسومات (GPU)", - "reload": "", - "hint": "" + "localized": "التكميم باستخدام وحدة معالجة الرسوميات", + "reload": "n/a", + "hint": "استخدام كارت الشاشة (GPU) لتسريع عملية التكميم" }, { - "id": 0, + "id": 13, "label": "Quantization weights type", "localized": "نوع أوزان التكميم", - "reload": "", - "hint": "" + "reload": "n/a", + "hint": "تحديد نوع البيانات للأوزان بعد التكميم" }, { - "id": 0, + "id": 14, "label": "Quantization activations type", - "localized": "نوع تنشيطات التكميم", - "reload": "", - "hint": "" + "localized": "نوع تفعيل التكميم", + "reload": "n/a", + "hint": "تحديد نوع البيانات لعمليات التفعيل بعد التكميم" }, { - "id": 0, + "id": 15, "label": "Quicksettings list", "localized": "قائمة الإعدادات السريعة", - "reload": "", - "hint": "قائمة بأسماء الإعدادات، مفصولة بفواصل، للإعدادات التي يجب أن تظهر في شريط الوصول السريع في الأعلى بدلاً من تبويب الإعدادات" + "reload": "n/a", + "hint": "قائمة بأسماء الإعدادات، مفصولة بفواصل، والتي يجب إضافتها إلى شريط الوصول السريع في الأعلى بدلاً من تبويب الإعدادات" } ], "r": [ - { - "id": 0, - "label": "Refine", - "localized": "تحسين", - "reload": "", - "hint": "يقوم التحسين بتشغيل معالجة إضافية بعد اكتمال المعالجة الأولية، ويمكن استخدامه لرفع دقة الصورة وتشغيل معالجة اختيارية مرة أخرى لزيادة الجودة والتفاصيل" - }, { "id": 1, - "label": "Restore", - "localized": "استعادة", - "reload": "", - "hint": "استعادة المعلمات من المطالبة الحالية أو آخر صورة مولدة معروفة" + "label": "Refine", + "localized": "تنقيح", + "reload": "n/a", + "hint": "يقوم التنقيح (Refine) بتشغيل معالجة إضافية بعد اكتمال المعالجة الأولية ويمكن استخدامه لرفع دقة الصورة وتشغيلها اختياريًا مرة أخرى لزيادة الجودة والتفاصيل" }, { "id": 2, - "label": "Reset anchors", - "localized": "إعادة تعيين المراسي", - "reload": "", - "hint": "" + "label": "Restore", + "localized": "استعادة", + "reload": "n/a", + "hint": "استعادة المعلمات من المطالبة الحالية أو آخر صورة تم إنشاؤها" }, { "id": 3, - "label": "Reload model", - "localized": "إعادة تحميل النموذج", - "reload": "", - "hint": "إعادة تحميل النموذج المحدد حالياً" - }, - { - "id": 4, - "label": "Reprocess", - "localized": "إعادة معالجة", - "reload": "", - "hint": "إعادة معالجة الأجيال السابقة باستخدام معلمات مختلفة" - }, - { - "id": 5, - "label": "Resize to", - "localized": "تغيير الحجم إلى", - "reload": "", + "label": "Reset anchors", + "localized": "إعادة تعيين نقاط الارتكاز", + "reload": "n/a", "hint": "" }, + { + "id": 4, + "label": "Reload model", + "localized": "إعادة تحميل النموذج", + "reload": "n/a", + "hint": "إعادة تحميل النموذج المحدد حاليًا" + }, + { + "id": 5, + "label": "Reprocess", + "localized": "إعادة المعالجة", + "reload": "n/a", + "hint": "إعادة معالجة المخرجات السابقة باستخدام معلمات مختلفة" + }, { "id": 6, - "label": "Resize\n by", - "localized": "تغيير الحجم\n بنسبة", - "reload": "", + "label": "Resize to", + "localized": "تغيير الحجم إلى", + "reload": "n/a", "hint": "" }, { "id": 7, - "label": "Resize\n to", - "localized": "تغيير الحجم\n إلى", - "reload": "", + "label": "Resize\n by", + "localized": "تغيير الحجم بمقدار", + "reload": "n/a", "hint": "" }, { "id": 8, - "label": "Run Preview", - "localized": "تشغيل المعاينة", - "reload": "", + "label": "Resize\n to", + "localized": "تغيير الحجم إلى", + "reload": "n/a", "hint": "" }, { "id": 9, - "label": "Reference", - "localized": "مرجع", - "reload": "", - "hint": "قائمة النماذج المرجعية التي يمكن تنزيلها تلقائياً عند أول استخدام" - }, - { - "id": 10, - "label": "Reset receipe", - "localized": "إعادة تعيين الوصفة", - "reload": "", + "label": "Run Preview", + "localized": "تشغيل المعاينة", + "reload": "n/a", "hint": "" }, + { + "id": 10, + "label": "Reference", + "localized": "مرجع", + "reload": "n/a", + "hint": "قائمة النماذج المرجعية التي يمكن تنزيلها تلقائيًا عند الاستخدام لأول مرة" + }, { "id": 11, - "label": "Run", - "localized": "تشغيل", - "reload": "", + "label": "Reset receipe", + "localized": "إعادة تعيين الوصفة", + "reload": "n/a", "hint": "" }, { "id": 12, - "label": "Refresh extension list", - "localized": "تحديث قائمة الإضافات", - "reload": "", - "hint": "تحديث قائمة الإضافات المتاحة" - }, - { - "id": 13, - "label": "Restart server", - "localized": "إعادة تشغيل الخادم", - "reload": "", + "label": "Run", + "localized": "تشغيل", + "reload": "n/a", "hint": "" }, + { + "id": 13, + "label": "Refresh extension list", + "localized": "تحديث قائمة الإضافات", + "reload": "n/a", + "hint": "تحديث قائمة الإضافات المتاحة" + }, { "id": 14, - "label": "Request browser notifications", - "localized": "طلب تنبيهات المتصفح", - "reload": "", + "label": "Restart server", + "localized": "إعادة تشغيل الخادم", + "reload": "n/a", "hint": "" }, { "id": 15, - "label": "Restore UI defaults", - "localized": "استعادة افتراضيات واجهة المستخدم", - "reload": "", - "hint": "استعادة قيم واجهة المستخدم الافتراضية" - }, - { - "id": 16, - "label": "Refresh UI values", - "localized": "تحديث قيم واجهة المستخدم", - "reload": "", + "label": "Request browser notifications", + "localized": "طلب إشعارات المتصفح", + "reload": "n/a", "hint": "" }, + { + "id": 16, + "label": "Restore UI defaults", + "localized": "استعادة قيم واجهة المستخدم الافتراضية", + "reload": "n/a", + "hint": "استعادة قيم واجهة المستخدم الافتراضية" + }, { "id": 17, - "label": "Reinstall", - "localized": "إعادة التثبيت", - "reload": "", + "label": "Refresh UI values", + "localized": "تحديث قيم واجهة المستخدم", + "reload": "n/a", "hint": "" }, { "id": 18, - "label": "Refresh state", - "localized": "تحديث الحالة", - "reload": "", + "label": "Reinstall", + "localized": "إعادة التثبيت", + "reload": "n/a", "hint": "" }, { "id": 19, - "label": "Refresh data", - "localized": "تحديث البيانات", - "reload": "", + "label": "Refresh state", + "localized": "تحديث الحالة", + "reload": "n/a", "hint": "" }, { "id": 20, - "label": "Run benchmark", - "localized": "تشغيل اختبار الأداء", - "reload": "", + "label": "Refresh data", + "localized": "تحديث البيانات", + "reload": "n/a", "hint": "" }, { "id": 21, - "label": "Refresh bench", - "localized": "تحديث الاختبار", - "reload": "", + "label": "Run benchmark", + "localized": "تشغيل اختبار الأداء (Benchmark)", + "reload": "n/a", "hint": "" }, { "id": 22, - "label": "Restore defaults", - "localized": "استعادة الافتراضيات", - "reload": "", - "hint": "استعادة إعدادات الخادم الافتراضية" - }, - { - "id": 23, - "label": "Replace", - "localized": "استبدال", - "reload": "", - "hint": "استبدال الصورة" - }, - { - "id": 24, - "label": "Refresh", - "localized": "تحديث", - "reload": "", + "label": "Refresh bench", + "localized": "تحديث اختبار الأداء", + "reload": "n/a", "hint": "" }, + { + "id": 23, + "label": "Restore defaults", + "localized": "استعادة الإعدادات الافتراضية", + "reload": "n/a", + "hint": "استعادة إعدادات الخادم الافتراضية" + }, + { + "id": 24, + "label": "Replace", + "localized": "استبدال", + "reload": "n/a", + "hint": "استبدال الصورة" + }, { "id": 25, - "label": "Reprocess decode", - "localized": "إعادة معالجة فك التشفير", - "reload": "", + "label": "Refresh", + "localized": "تحديث", + "reload": "n/a", "hint": "" }, { "id": 26, - "label": "Reprocess refine", - "localized": "إعادة معالجة التحسين", - "reload": "", + "label": "Reprocess decode", + "localized": "إعادة معالجة فك التشفير", + "reload": "n/a", "hint": "" }, { "id": 27, - "label": "Reprocess face", - "localized": "إعادة معالجة الوجه", - "reload": "", + "label": "Reprocess refine", + "localized": "إعادة معالجة التنقيح", + "reload": "n/a", "hint": "" }, { "id": 28, - "label": "Remove background", - "localized": "إزالة الخلفية", - "reload": "", + "label": "Reprocess face", + "localized": "إعادة معالجة الوجه", + "reload": "n/a", "hint": "" }, { "id": 29, - "label": "RAS: Region-Adaptive Sampling", - "localized": "RAS: أخذ العينات المتكيف مع المنطقة", - "reload": "", + "label": "Remove background", + "localized": "إزالة الخلفية", + "reload": "n/a", "hint": "" }, { "id": 30, - "label": "Resize", - "localized": "تغيير الحجم", - "reload": "", - "hint": "تغيير حجم الصورة، يمكن أن يكون باستخدام دقة ثابتة أو بناءً على مقياس" - }, - { - "id": 31, - "label": "Rerefence models", - "localized": "نماذج مرجعية", - "reload": "", + "label": "RAS: Region-Adaptive Sampling", + "localized": "RAS: أخذ العينات التكيفي للمناطق", + "reload": "n/a", "hint": "" }, + { + "id": 31, + "label": "Resize", + "localized": "تغيير الحجم", + "reload": "n/a", + "hint": "تغيير حجم الصورة، يمكن استخدام دقة ثابتة أو بناءً على النسبة" + }, { "id": 32, - "label": "Replace model components", - "localized": "استبدال مكونات النموذج", - "reload": "", + "label": "Rerefence models", + "localized": "إعادة مرجعية النماذج", + "reload": "n/a", "hint": "" }, { "id": 33, - "label": "rescale", - "localized": "إعادة قياس", - "reload": "", - "hint": "إعادة قياس قيم بيتا مع نسبة إشارة إلى ضجيج نهائية صفرية (zero terminal SNR)" + "label": "Replace model components", + "localized": "استبدال مكونات النموذج", + "reload": "n/a", + "hint": "" }, { "id": 34, - "label": "Resize seed from width", - "localized": "تغيير حجم البذرة من العرض", - "reload": "", - "hint": "محاولة إنتاج صورة مشابهة لما كان سيتم إنتاجه بنفس البذرة عند الدقة المحددة" + "label": "rescale", + "localized": "إعادة القياس", + "reload": "n/a", + "hint": "إعادة قياس قيم بيتا (betas) مع نسبة إشارة إلى ضوضاء نهائية صفرية (zero terminal snr)" }, { "id": 35, - "label": "Resize seed from height", - "localized": "تغيير حجم البذرة من الطول", - "reload": "", + "label": "Resize seed from width", + "localized": "تغيير حجم البذرة (Seed) من العرض", + "reload": "n/a", "hint": "محاولة إنتاج صورة مشابهة لما كان سيتم إنتاجه بنفس البذرة عند الدقة المحددة" }, { "id": 36, - "label": "Refine guidance", - "localized": "توجيه التحسين", - "reload": "", - "hint": "مقياس CFG المستخدم لمرحلة المحسن (refiner)" + "label": "Resize seed from height", + "localized": "تغيير حجم البذرة (Seed) من الارتفاع", + "reload": "n/a", + "hint": "محاولة إنتاج صورة مشابهة لما كان سيتم إنتاجه بنفس البذرة عند الدقة المحددة" }, { "id": 37, - "label": "Resize mode", - "localized": "وضع تغيير الحجم", - "reload": "", - "hint": "يحدد كيفية تغيير حجم الإدخال أو تكييفه في تحسين المرحلة الثانية:
- none: لا يوجد تغيير، الحفاظ على الدقة الأصلية
- fixed: فرض تغيير الحجم إلى الدقة المستهدفة (قد يشوه الصورة)
- crop: قص المركز ليتناسب مع الهدف مع الحفاظ على نسبة العرض إلى الارتفاع
- fill: تغيير الحجم للملاءمة وملء المساحة الفارغة بحدود
- outpaint: تمديد اللوحة خارج حدود الصورة
- context aware: تغيير حجم ذكي يمزج أو يكيف المناطق المحيطة" + "label": "Refine guidance", + "localized": "توجيه التنقيح", + "reload": "n/a", + "hint": "مقياس CFG المستخدم لتمريرة المنقح" }, { "id": 38, - "label": "Resize method", - "localized": "طريقة تغيير الحجم", - "reload": "", - "hint": "الطريقة المستخدمة لتغيير حجم الصورة: يمكن أن تكون تغيير حجم بسيط، نموذج رفع دقة، تغيير حجم كامن (latent)، أو فك تشفير غير متماثل" + "label": "Resize mode", + "localized": "وضع تغيير الحجم", + "reload": "n/a", + "hint": "يحدد كيفية تغيير حجم الإدخال أو تكييفه في تمريرة التنقيح الثانية:
- none: لا تغيير للحجم، الاحتفاظ بالدقة الأصلية
- fixed: فرض تغيير الحجم إلى الدقة المستهدفة (قد يسبب تشوهًا)
- crop: القص من المركز للملاءمة مع الحفاظ على نسبة العرض إلى الارتفاع
- fill: تغيير الحجم للملاءمة وملء المساحة الفارغة بحدود
- outpaint: تمديد اللوحة خارج حدود الصورة
- context aware: تغيير حجم ذكي يمزج أو يكيف المناطق المحيطة" }, { "id": 39, - "label": "Resize width", - "localized": "تغيير عرض الحجم", - "reload": "", - "hint": "يغير حجم الصورة إلى هذا العرض. إذا كان 0، يتم استنتاج العرض من أحد المنزلقين القريبين" + "label": "Resize method", + "localized": "طريقة تغيير الحجم", + "reload": "n/a", + "hint": "الطريقة المستخدمة لتغيير حجم الصورة: يمكن أن تكون تغيير حجم بسيط، أو نموذج رفع الدقة، أو تغيير حجم كامن (latent resize)، أو فك تشفير غير متماثل" }, { "id": 40, - "label": "Resize height", - "localized": "تغيير طول الحجم", - "reload": "", - "hint": "يغير حجم الصورة إلى هذا الطول. إذا كان 0، يتم استنتاج الطول من أحد المنزلقين القريبين" + "label": "Resize width", + "localized": "عرض تغيير الحجم", + "reload": "n/a", + "hint": "يغير حجم الصورة إلى هذا العرض. إذا كان 0، يتم استنتاج العرض من أحد شريطي التمرير القريبين" }, { "id": 41, - "label": "Resize scale", - "localized": "مقياس تغيير الحجم", - "reload": "", - "hint": "" + "label": "Resize height", + "localized": "ارتفاع تغيير الحجم", + "reload": "n/a", + "hint": "يغير حجم الصورة إلى هذا الارتفاع. إذا كان 0، يتم استنتاج الارتفاع من أحد شريطي التمرير القريبين" }, { "id": 42, - "label": "Refine sampler", - "localized": "أداة أخذ عينات التحسين", - "reload": "", - "hint": "استخدم أداة أخذ عينات محددة كأداة احتياطية إذا كانت الأساسية غير مدعومة لعملية معينة" + "label": "Resize scale", + "localized": "مقياس تغيير الحجم", + "reload": "n/a", + "hint": "" }, { "id": 43, - "label": "Refiner start", - "localized": "بداية المحسن", - "reload": "", - "hint": "ستبدأ مرحلة المحسن عندما يكتمل النموذج الأساسي بهذا القدر (اضبطه على قيمة أكبر من 0 وأصغر من 1 للتشغيل بعد اكتمال تشغيل النموذج الأساسي)" + "label": "Refine sampler", + "localized": "مُعاين التنقيح", + "reload": "n/a", + "hint": "استخدام مُعاين (Sampler) محدد كخيار احتياطي إذا لم يكن الأساسي مدعومًا لعملية معينة" }, { "id": 44, - "label": "Refiner steps", - "localized": "خطوات المحسن", - "reload": "", - "hint": "عدد الخطوات المستخدمة لمرحلة المحسن" + "label": "Refiner start", + "localized": "بدء التنقيح", + "reload": "n/a", + "hint": "ستبدأ تمريرة التنقيح عندما يكتمل النموذج الأساسي بهذا القدر (اضبط على قيمة أكبر من 0 وأصغر من 1 للتشغيل بعد اكتمال تشغيل النموذج الأساسي بالكامل)" }, { "id": 45, - "label": "Refine prompt", - "localized": "مطالبة التحسين", - "reload": "", - "hint": "المطالبة المستخدمة لكل من المشفّر الثاني في النموذج الأساسي (إن وجد) ولمرحلة المحسن (إذا تم تمكينها)" + "label": "Refiner steps", + "localized": "خطوات التنقيح", + "reload": "n/a", + "hint": "عدد الخطوات المستخدمة لتمريرة التنقيح" }, { "id": 46, - "label": "Refine negative prompt", - "localized": "المطالبة السلبية للتحسين", - "reload": "", - "hint": "المطالبة السلبية المستخدمة لكل من المشفّر الثاني في النموذج الأساسي (إن وجد) ولمرحلة المحسن (إذا تم تمكينها)" + "label": "Refine prompt", + "localized": "مطالبة التنقيح", + "reload": "n/a", + "hint": "المطالبة المستخدمة لكل من المشفر الثاني في النموذج الأساسي (إذا وجد) وتمريرة التنقيح (إذا تم تفعيلها)" }, { "id": 47, - "label": "Renoise", - "localized": "إعادة التضجيج", - "reload": "", - "hint": "تطبيق ضجيج إضافي أثناء عملية التفصيل" + "label": "Refine negative prompt", + "localized": "مطالبة التنقيح السلبية", + "reload": "n/a", + "hint": "المطالبة السلبية المستخدمة لكل من المشفر الثاني في النموذج الأساسي (إذا وجد) وتمريرة التنقيح (إذا تم تفعيلها)" }, { "id": 48, - "label": "Renoise end", - "localized": "نهاية إعادة التضجيج", - "reload": "", - "hint": "الخطوة النهائية عند تطبيق إعادة التضجيج" + "label": "Renoise", + "localized": "إعادة الضوضاء", + "reload": "n/a", + "hint": "تطبيق ضوضاء إضافية أثناء إضافة التفاصيل" }, { "id": 49, - "label": "Range", - "localized": "نطاق", - "reload": "", - "hint": "" + "label": "Renoise end", + "localized": "نهاية إعادة الضوضاء", + "reload": "n/a", + "hint": "الخطوة النهائية عند تطبيق إعادة الضوضاء" }, { "id": 50, "label": "Repeat x-axis", "localized": "تكرار المحور السيني", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 51, "label": "Repeat y-axis", "localized": "تكرار المحور الصادي", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 52, "label": "ReSwapper Model", "localized": "نموذج ReSwapper", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 53, "label": "Return original images", "localized": "إرجاع الصور الأصلية", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 54, "label": "Restart step", "localized": "خطوة إعادة التشغيل", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 55, "label": "Restore pipeline on end", - "localized": "استعادة خط المعالجة عند الانتهاء", - "reload": "", + "localized": "استعادة خط المعالجة (Pipeline) عند النهاية", + "reload": "n/a", "hint": "" }, { "id": 56, "label": "Randomize seed after each loop iteration", - "localized": "جعل البذرة عشوائية بعد كل تكرار للحلقة", - "reload": "", + "localized": "عشوائية البذرة (Seed) بعد كل تكرار للحلقة", + "reload": "n/a", "hint": "" }, { "id": 57, "label": "Random seeds", "localized": "بذور عشوائية", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 58, "label": "Restore pipe on end", - "localized": "استعادة الأنبوب عند الانتهاء", - "reload": "", + "localized": "استعادة خط المعالجة عند النهاية", + "reload": "n/a", "hint": "" }, { "id": 59, "label": "Rows", "localized": "صفوف", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 60, "label": "Repetition penalty", "localized": "عقوبة التكرار", - "reload": "", - "hint": "تمنع إعادة استخدام الرموز التي ظهرت بالفعل في المطالبة أو المخرج عن طريق معاقبة احتمالاتها.
مثل إضافة احتكاك للعودة إلى الخيارات السابقة. تساعد في كسر حلقات التكرار ولكن قد تقلل من التماسك عند القيم العالية.

اضبط على 1 للتعطيل." + "reload": "n/a", + "hint": "تثبط إعادة استخدام الرموز التي تظهر بالفعل في المطالبة أو المخرجات من خلال فرض عقوبة على احتمالاتها.
مثل إضافة احتكاك عند إعادة زيارة الخيارات السابقة. تساعد في كسر حلقات التكرار ولكن قد تقلل من التماسك عند قيم عالية.

اضبط على 1 للتعطيل." }, { "id": 61, "label": "Redux prompt strength", "localized": "قوة مطالبة Redux", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 62, "label": "right", "localized": "يمين", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 63, "label": "Reference query weight", "localized": "وزن استعلام المرجع", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 64, "label": "Reference adain weight", - "localized": "وزن adain المرجع", - "reload": "", + "localized": "وزن AdaIN المرجعي", + "reload": "n/a", "hint": "" }, { "id": 65, "label": "Refine upscaler", - "localized": "محسن رفع الدقة", - "reload": "", - "hint": "اختر مكبّر دقة ثانوي للتشغيل بعد المكبّر الأولي" + "localized": "منقح رافع الدقة (Upscaler)", + "reload": "n/a", + "hint": "حدد رافع دقة ثانوي للتشغيل بعد رافع الدقة الأولي" }, { "id": 66, "label": "Refine foreground", - "localized": "تحسين المقدمة", - "reload": "", + "localized": "تنقيح المقدمة", + "reload": "n/a", "hint": "" }, { "id": 67, "label": "Recursive", - "localized": "متكرر (الوصول للمجلدات الفرعية)", - "reload": "", - "hint": "معالجة الصور في المجلدات الفرعية بشكل متكرر.
عند التمكين، يبحث في جميع المجلدات الفرعية المتداخلة عن صور لمعالجتها." + "localized": "متكرر (Recursive)", + "reload": "n/a", + "hint": "معالجة الصور في المجلدات الفرعية بشكل متكرر.
عند التفعيل، يبحث في جميع المجلدات الفرعية المتداخلة عن صور لمعالجتها." }, { "id": 68, "label": "Rebase", "localized": "إعادة التأسيس (Rebase)", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 69, "label": "Repos", - "localized": "المستودعات", - "reload": "", + "localized": "المستودعات (Repos)", + "reload": "n/a", "hint": "" }, { "id": 70, "label": "Refiner model", - "localized": "نموذج المحسن", - "reload": "", - "hint": "نموذج المحسن المستخدم لعمليات المرحلة الثانية" + "localized": "نموذج التنقيح", + "reload": "n/a", + "hint": "نموذج التنقيح المستخدم لعمليات التمريرة الثانية" }, { "id": 71, "label": "Record torch streams", "localized": "تسجيل تدفقات Torch", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 72, "label": "Remote VAE image type", - "localized": "نوع صورة VAE عن بعد", - "reload": "", + "localized": "نوع صورة VAE عن بُعد", + "reload": "n/a", "hint": "" }, { "id": 73, "label": "Remote VAE for encode", - "localized": "VAE عن بعد للتشفير", - "reload": "", + "localized": "VAE عن بُعد للترميز", + "reload": "n/a", "hint": "" }, { "id": 74, "label": "RAS enabled", - "localized": "تمكين RAS", - "reload": "", + "localized": "تفعيل RAS", + "reload": "n/a", "hint": "" }, { "id": 75, "label": "reduce-overhead", - "localized": "تقليل العبء", - "reload": "", + "localized": "تقليل النفقات العامة", + "reload": "n/a", "hint": "" }, { "id": 76, "label": "repeated", - "localized": "مكرر", - "reload": "", + "localized": "متكرر", + "reload": "n/a", "hint": "" }, { "id": 77, "label": "Root model folder", - "localized": "مجلد النماذج الرئيسي", - "reload": "", + "localized": "مجلد النماذج الجذر", + "reload": "n/a", "hint": "" }, { "id": 78, "label": "Resize background color", "localized": "لون خلفية تغيير الحجم", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 79, "label": "Restore from metadata: skip params", "localized": "استعادة من البيانات الوصفية: تخطي المعلمات", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 80, "label": "Restore from metadata: skip settings", "localized": "استعادة من البيانات الوصفية: تخطي الإعدادات", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 81, "label": "requests", - "localized": "طلبات", - "reload": "", + "localized": "الطلبات", + "reload": "n/a", "hint": "" }, { "id": 82, "label": "rust", - "localized": "لغة رست", - "reload": "", + "localized": "rust", + "reload": "n/a", "hint": "" }, { "id": 83, "label": "Restore unparsed prompt", "localized": "استعادة المطالبة غير المحللة", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 84, "label": "Reuse loaded model dictionary", - "localized": "إعادة استخدام قاموس النموذج المحمل", - "reload": "", + "localized": "إعادة استخدام قاموس النماذج المحملة", + "reload": "n/a", "hint": "" }, { "id": 85, "label": "ReBasin", - "localized": "ReBasin", - "reload": "", - "hint": "يقوم بعمليات دمج متعددة مع التباديل من أجل الحفاظ على ميزات أكثر من كلا النموذجين" + "localized": "إعادة الأساس (ReBasin)", + "reload": "n/a", + "hint": "ينفذ عمليات دمج متعددة مع التبديلات للحفاظ على المزيد من الميزات من كلا النموذجين" }, { "id": 86, "label": "Replace VAE", "localized": "استبدال VAE", - "reload": "", + "reload": "n/a", "hint": "" }, { "id": 87, "label": "Reference unit 1", - "localized": "وحدة المرجع 1", - "reload": "", + "localized": "الوحدة المرجعية 1", + "reload": "n/a", "hint": "" } ], "s": [ - { - "id": 0, - "label": "Sampler", - "localized": "المعيّن (Sampler)", - "reload": "", - "hint": "الإعدادات المتعلقة باختيار وتكوين المعيّن والبذرة. تقوم المعاينات بتوجيه عملية تحويل الضجيج إلى صورة عبر خطوات متعددة. " - }, { "id": 1, - "label": "Scripts", - "localized": "السكربتات", + "label": "Sampler", + "localized": "مُعاين العينات", "reload": "", - "hint": "تمكين الميزات الإضافية باستخدام السكربتات المختارة أثناء عملية التوليد" + "hint": "الإعدادات المتعلقة بمُعاين العينات واختيار البذرة (Seed) وتكوينها. توجّه المُعاينات عملية تحويل الضوضاء إلى صورة عبر خطوات متعددة." }, { "id": 2, - "label": "Scale", - "localized": "المقياس", + "label": "Scripts", + "localized": "البرمجيات", "reload": "", - "hint": "تغيير حجم الصورة إلى المقياس المستهدف. إذا تم ضبط عرض/ارتفاع ثابت لإعادة التحجيم، فسيتم تجاهل هذا الخيار" + "hint": "تفعيل ميزات إضافية باستخدام برمجيات مختارة أثناء عملية التوليد." }, { "id": 3, - "label": "Swap X/Y", - "localized": "تبديل X/Y", + "label": "Scale", + "localized": "المقياس", "reload": "", - "hint": "" + "hint": "تغيير حجم الصورة إلى المقياس المستهدف. إذا تم تحديد عرض/ارتفاع ثابت، يتم تجاهل هذا الخيار." }, { "id": 4, - "label": "Swap Y/Z", - "localized": "تبديل Y/Z", + "label": "Swap X/Y", + "localized": "تبديل المحور X/Y", "reload": "", - "hint": "" + "hint": "تبديل محاور الشبكة X و Y." }, { "id": 5, - "label": "Swap X/Z", - "localized": "تبديل X/Z", + "label": "Swap Y/Z", + "localized": "تبديل المحور Y/Z", "reload": "", - "hint": "" + "hint": "تبديل محاور الشبكة Y و Z." }, { "id": 6, - "label": "Set prompt", - "localized": "تعيين المحفّز", + "label": "Swap X/Z", + "localized": "تبديل المحور X/Z", "reload": "", - "hint": "نسخ المحفّز المحسّن إلى حقل إدخال المحفّز الرئيسي" + "hint": "تبديل محاور الشبكة X و Z." }, { "id": 7, - "label": "Skip", - "localized": "تخطي", + "label": "Set prompt", + "localized": "ضبط الموجه", "reload": "", - "hint": "إيقاف معالجة المهمة الحالية ومتابعة المعالجة" + "hint": "نسخ الموجه (Prompt) المُحسّن إلى حقل الموجه الرئيسي." }, { "id": 8, - "label": "Stop", - "localized": "إيقاف", + "label": "Skip", + "localized": "تخطي", "reload": "", - "hint": "إيقاف المعالجة" + "hint": "إيقاف معالجة المهمة الحالية والمتابعة." }, { "id": 9, - "label": "Show", - "localized": "عرض", + "label": "Stop", + "localized": "إيقاف", "reload": "", - "hint": "عرض موقع الصورة" + "hint": "إيقاف المعالجة." }, { "id": 10, "label": "Save", "localized": "حفظ", "reload": "", - "hint": "حفظ الصورة" + "hint": "حفظ الصورة." }, { "id": 11, "label": "Sketch", - "localized": "رسم (Sketch)", + "localized": "رسم تخطيطي", "reload": "", - "hint": "" + "hint": "أداة للرسم التخطيطي." }, { "id": 12, "label": "Size & Inputs", "localized": "الحجم والمدخلات", "reload": "", - "hint": "الإعدادات المتعلقة بدقة التوليد ووسائط الإدخال الإضافية" + "hint": "الإعدادات المتعلقة بدقة التوليد ووسائط الإدخال الإضافية." }, { "id": 13, "label": "Set receipe", - "localized": "تعيين الوصفة", + "localized": "ضبط الوصفة", "reload": "", - "hint": "" + "hint": "تعيين وصفة المعالجة." }, { "id": 14, "label": "Scale by", - "localized": "تكبير بمقدار", + "localized": "تغيير الحجم بمقدار", "reload": "", - "hint": "استخدم هذا التبويب لتغيير حجم الصور المصدر بمعامل محدد" + "hint": "استخدم هذا التبويب لتغيير حجم الصورة (أو الصور) المصدرية بمعامل محدد." }, { "id": 15, "label": "Scale to", - "localized": "تكبير إلى", + "localized": "تغيير الحجم إلى", "reload": "", - "hint": "استخدم هذا التبويب لتغيير حجم الصور المصدر إلى حجم مستهدف محدد" + "hint": "استخدم هذا التبويب لتغيير حجم الصورة (أو الصور) المصدرية إلى حجم مستهدف محدد." }, { "id": 16, - "label": "Settings", - "localized": "الإعدادات", + "label": "Server Info", + "localized": "معلومات الخادم", "reload": "", - "hint": "إعدادات التطبيق" + "hint": "عرض معلومات الخادم." }, { "id": 17, - "label": "System", - "localized": "النظام", + "label": "Settings", + "localized": "الإعدادات", "reload": "", - "hint": "إعدادات النظام والمعلومات" + "hint": "إعدادات التطبيق." }, { "id": 18, - "label": "Shutdown server", - "localized": "إيقاف تشغيل الخادم", + "label": "System", + "localized": "النظام", "reload": "", - "hint": "" + "hint": "إعدادات ومعلومات النظام." }, { "id": 19, - "label": "Start profiling", - "localized": "بدء التحليل البرمجي", + "label": "Shutdown server", + "localized": "إيقاف تشغيل الخادم", "reload": "", - "hint": "" + "hint": "إيقاف خادم التطبيق." }, { "id": 20, - "label": "System Info", - "localized": "معلومات النظام", + "label": "Start profiling", + "localized": "بدء التوصيف", "reload": "", - "hint": "معلومات النظام" + "hint": "بدء تتبع أداء النظام." }, { "id": 21, - "label": "Set UI defaults", - "localized": "تعيين افتراضيات الواجهة", + "label": "System Info", + "localized": "معلومات النظام", "reload": "", - "hint": "تعيين القيم الحالية كقيم افتراضية لواجهة المستخدم" + "hint": "عرض معلومات النظام." }, { "id": 22, - "label": "Set UI menu states", - "localized": "تعيين حالات قوائم الواجهة", + "label": "Set UI defaults", + "localized": "ضبط افتراضيات الواجهة", "reload": "", - "hint": "" + "hint": "تعيين القيم الحالية كقيم افتراضية لواجهة المستخدم." }, { "id": 23, - "label": "Send interrupt", - "localized": "إرسال مقاطعة", + "label": "Set UI menu states", + "localized": "ضبط حالات قوائم الواجهة", "reload": "", - "hint": "" + "hint": "ضبط حالات القوائم." }, { "id": 24, - "label": "Submit results", - "localized": "إرسال النتائج", + "label": "Send interrupt", + "localized": "إرسال إيقاف", "reload": "", - "hint": "" + "hint": "إرسال أمر إيقاف." }, { "id": 25, - "label": "System Paths", - "localized": "مسارات النظام", + "label": "Submit results", + "localized": "إرسال النتائج", "reload": "", - "hint": "الإعدادات المتعلقة بمواقع مجلدات النماذج المختلفة" + "hint": "إرسال النتائج للمعالجة." }, { "id": 26, - "label": "Show all pages", - "localized": "عرض جميع الصفحات", + "label": "Server Settings", + "localized": "إعدادات الخادم", "reload": "", - "hint": "عرض كافة صفحات الإعدادات" + "hint": "إعدادات الخادم." }, { "id": 27, - "label": "Save model", - "localized": "حفظ النموذج", + "label": "System Paths", + "localized": "مسارات النظام", "reload": "", - "hint": "" + "hint": "الإعدادات المتعلقة بمواقع مجلدات النماذج المختلفة." }, { "id": 28, - "label": "Scan missing", - "localized": "فحص المفقودات", + "label": "Show all pages", + "localized": "إظهار كل الصفحات", "reload": "", - "hint": "" + "hint": "عرض جميع صفحات الإعدادات." }, { "id": 29, - "label": "Save receipe", - "localized": "حفظ الوصفة", + "label": "Save model", + "localized": "حفظ النموذج", "reload": "", - "hint": "" + "hint": "حفظ ملف النموذج." }, { "id": 30, - "label": "Simple Merge", - "localized": "دمج بسيط", + "label": "Scan missing", + "localized": "مسح المفقودات", "reload": "", - "hint": "" + "hint": "البحث عن الملفات المفقودة." }, { "id": 31, - "label": "Style", - "localized": "النمط", + "label": "Save receipe", + "localized": "حفظ الوصفة", "reload": "", - "hint": "أنماط إضافية ليتم تطبيقها على معاملات التوليد المختارة" + "hint": "حفظ وصفة المعالجة." }, { "id": 32, - "label": "SD 1.5", - "localized": "SD 1.5", + "label": "Simple Merge", + "localized": "دمج بسيط", "reload": "", - "hint": "" + "hint": "دمج النماذج بطريقة بسيطة." }, { "id": 33, - "label": "SD XL", - "localized": "SD XL", + "label": "Style", + "localized": "النمط", "reload": "", - "hint": "" + "hint": "أنماط إضافية ليتم تطبيقها على معايير التوليد المحددة." }, { "id": 34, - "label": "SD1.5", - "localized": "SD1.5", + "label": "SD 1.5", + "localized": "SD 1.5", "reload": "", - "hint": "" + "hint": "نموذج Stable Diffusion 1.5." }, { "id": 35, - "label": "SDXL", - "localized": "SDXL", + "label": "SD XL", + "localized": "SD XL", "reload": "", - "hint": "StableDiffusion XL" + "hint": "نموذج Stable Diffusion XL." }, { "id": 36, "label": "Start", "localized": "بدء", "reload": "", - "hint": "" + "hint": "بدء العملية." }, { "id": 37, "label": "Select", - "localized": "تحديد", + "localized": "اختيار", "reload": "", - "hint": "" + "hint": "اختيار العنصر." }, { "id": 38, "label": "Size", "localized": "الحجم", "reload": "", - "hint": "" + "hint": "تحديد أبعاد الصورة." }, { "id": 39, "label": "Size & Batch", "localized": "الحجم والدفعة", "reload": "", - "hint": "حجم الصورة والدفعة" + "hint": "حجم الصورة وعدد مرات التكرار (Batch)." }, { "id": 40, "label": "Seed", "localized": "البذرة", "reload": "", - "hint": "البذرة الأولية والتبديل" + "hint": "البذرة الأولية (Seed) والتباين." }, { "id": 41, "label": "Script", - "localized": "سكربت", + "localized": "البرمجية", "reload": "", - "hint": "سكربتات إضافية ليتم استخدامها" + "hint": "برمجيات إضافية لاستخدامها." }, { "id": 42, "label": "Stable Diffusion 3.x", "localized": "Stable Diffusion 3.x", "reload": "", - "hint": "" + "hint": "نموذج Stable Diffusion 3." }, { "id": 43, "label": "SDNQ: SD.Next Quantization", "localized": "SDNQ: تكميم SD.Next", "reload": "", - "hint": "" + "hint": "إعدادات تكميم (Quantization) النموذج." }, { "id": 44, "label": "Save Options", "localized": "خيارات الحفظ", "reload": "", - "hint": "" + "hint": "إعدادات حفظ الملفات." }, { "id": 45, "label": "Startup & Server Options", - "localized": "خيارات التشغيل والخادم", + "localized": "خيارات البدء والخادم", "reload": "", - "hint": "" + "hint": "إعدادات تشغيل التطبيق والخادم." }, { "id": 46, "label": "SeedVR", "localized": "SeedVR", "reload": "", - "hint": "" + "hint": "إعدادات معالجة SeedVR." }, { "id": 47, "label": "Styles", "localized": "الأنماط", "reload": "", - "hint": "أنماط إضافية ليتم تطبيقها على معاملات التوليد المختارة" + "hint": "أنماط إضافية ليتم تطبيقها على معايير التوليد المحددة." }, { "id": 48, "label": "Search & Download", "localized": "بحث وتنزيل", "reload": "", - "hint": "" + "hint": "البحث عن النماذج وتنزيلها." }, { "id": 49, "label": "Server log", "localized": "سجل الخادم", "reload": "", - "hint": "" + "hint": "سجل عمليات الخادم." }, { "id": 50, "label": "Steps", "localized": "الخطوات", "reload": "", - "hint": "عدد مرات تحسين الصورة المولدة بشكل تكراري؛ القيم الأعلى تستغرق وقتاً أطول؛ القيم المنخفضة جداً قد تؤدي لنتائج سيئة" + "hint": "كم عدد مرات تحسين الصورة المتولدة بشكل تكراري؛ القيم الأعلى تستغرق وقتًا أطول؛ القيم المنخفضة جدًا قد تنتج نتائج سيئة." }, { "id": 51, "label": "Sampling method", - "localized": "طريقة المعاينة", + "localized": "طريقة أخذ العينات", "reload": "", - "hint": "الخوارزمية المستخدمة لإنتاج الصورة" + "hint": "الخوارزمية المستخدمة لإنتاج الصورة." }, { "id": 52, "label": "Sigma method", "localized": "طريقة سيجما", "reload": "", - "hint": "تتحكم في كيفية توزيع مستويات الضجيج (sigmas) عبر خطوات الانتشار. الخيارات:
- الافتراضي: افتراضي النموذج
- karras: جدول ضجيج أكثر سلاسة، جودة أعلى بخطوات أقل
- beta: بناءً على قيم جدول بيتا
- exponential: اضمحلال أسي للضجيج
- lambdas: تجريبي، يوازن الإشارة مقابل الضجيج
- flowmatch: مضبوط لنماذج مطابقة التدفق" + "hint": "تتحكم في كيفية توزيع مستويات الضوضاء (sigmas) عبر خطوات الانتشار." }, { "id": 53, "label": "Sigma adjust", - "localized": "ضبط سيجما", + "localized": "تعديل سيجما", "reload": "", - "hint": "ضبط قيمة سيجما للمعيّن" + "hint": "ضبط قيمة سيجما للمُعاين." }, { "id": 54, "label": "Sampler order", - "localized": "ترتيب المعيّن", + "localized": "ترتيب المُعاين", "reload": "", - "hint": "ترتيب تحديثات الحل في المعيّن. الترتيب الأعلى يحسن الاستقرار/الدقة ولكنه يزيد من تكلفة الحوسبة." + "hint": "ترتيب تحديثات الحل في المُعاين. الترتيب الأعلى يحسن الاستقرار/الدقة ولكنه يزيد من تكلفة الحوسبة." }, { "id": 55, "label": "SLG scale", "localized": "مقياس SLG", "reload": "", - "hint": "" + "hint": "مقياس التوجيه الكامن (SLG)." }, { "id": 56, "label": "SLG start", - "localized": "بداية SLG", + "localized": "بدء SLG", "reload": "", - "hint": "" + "hint": "نقطة بدء SLG." }, { "id": 57, "label": "SLG stop", - "localized": "نهاية SLG", + "localized": "إيقاف SLG", "reload": "", - "hint": "" + "hint": "نقطة إيقاف SLG." }, { "id": 58, "label": "SLG layers", "localized": "طبقات SLG", "reload": "", - "hint": "" + "hint": "طبقات SLG." }, { "id": 59, "label": "SLG config", - "localized": "تكوين SLG", + "localized": "إعداد SLG", "reload": "", - "hint": "" + "hint": "تكوين SLG." }, { "id": 60, "label": "SEG scale", "localized": "مقياس SEG", "reload": "", - "hint": "" + "hint": "مقياس SEG." }, { "id": 61, "label": "SEG blur sigma", - "localized": "سيجما تمويه SEG", + "localized": "سيجما ضبابية SEG", "reload": "", - "hint": "" + "hint": "إعداد ضبابية SEG." }, { "id": 62, "label": "SEG blur threshold inf", - "localized": "عتبة تمويه SEG", + "localized": "عتبة ضبابية SEG", "reload": "", - "hint": "" + "hint": "عتبة SEG." }, { "id": 63, "label": "SEG start", - "localized": "بداية SEG", + "localized": "بدء SEG", "reload": "", - "hint": "" + "hint": "بدء SEG." }, { "id": 64, "label": "SEG stop", - "localized": "نهاية SEG", + "localized": "إيقاف SEG", "reload": "", - "hint": "" + "hint": "إيقاف SEG." }, { "id": 65, "label": "SEG layers", "localized": "طبقات SEG", "reload": "", - "hint": "" + "hint": "طبقات SEG." }, { "id": 66, "label": "SEG config", - "localized": "تكوين SEG", + "localized": "إعداد SEG", "reload": "", - "hint": "" + "hint": "تكوين SEG." }, { "id": 67, "label": "Strength", "localized": "القوة", "reload": "", - "hint": "قوة إزالة الضجيج أثناء عملية الصورة تتحكم في مدى السماح بتغيير الصورة الأصلية أثناء التوليد" + "hint": "قوة إزالة الضوضاء أثناء عملية الصورة تتحكم في مقدار ما يُسمح بتغييره من الصورة الأصلية أثناء التوليد." }, { "id": 68, "label": "Sort detections", "localized": "فرز الاكتشافات", "reload": "", - "hint": "فرز المناطق المكتشفة من اليسار إلى اليمين بدلاً من درجة الاكتشاف" + "hint": "فرز المناطق المكتشفة من اليسار إلى اليمين بدلاً من درجة الاكتشاف." }, { "id": 69, - "label": "Sharpen", - "localized": "حدة", - "reload": "", - "hint": "" - }, - { - "id": 70, - "label": "Subject", - "localized": "الموضوع", - "reload": "", - "hint": "" - }, - { - "id": 71, - "label": "Same latent", - "localized": "نفس الكامن (Latent)", - "reload": "", - "hint": "" - }, - { - "id": 72, - "label": "Share queries", - "localized": "مشاركة الاستعلامات", - "reload": "", - "hint": "" - }, - { - "id": 73, - "label": "Sigma", - "localized": "Sigma", - "reload": "", - "hint": "" - }, - { - "id": 74, - "label": "Stride", - "localized": "Stride", - "reload": "", - "hint": "" - }, - { - "id": 75, - "label": "Structure", - "localized": "الهيكل", - "reload": "", - "hint": "" - }, - { - "id": 76, - "label": "Save HDR image", - "localized": "حفظ صورة HDR", - "reload": "", - "hint": "" - }, - { - "id": 77, "label": "Saturation", "localized": "التشبع", "reload": "", - "hint": "" + "hint": "التحكم في كثافة الألوان. القيم الموجبة تجعل الألوان أكثر حيوية، والقيم السالبة تقلل التشبع نحو التدرج الرمادي." + }, + { + "id": 70, + "label": "Sharpness", + "localized": "الحدة", + "reload": "", + "hint": "يعزز تفاصيل الحواف والقوام الدقيق. القيم الأعلى تنتج حواف أكثر دقة ولكن قد تضخم الضوضاء أو الأخطاء إذا تم المبالغة فيها." + }, + { + "id": 71, + "label": "Shadows", + "localized": "الظلال", + "reload": "", + "hint": "ضبط سطوع مناطق الظل (الداكنة). القيم الموجبة ترفع الظلال للكشف عن التفاصيل، والقيم السالبة تعمقها." + }, + { + "id": 72, + "label": "Shadows tint", + "localized": "تلوين الظلال", + "reload": "", + "hint": "اللون المراد مزجه في مناطق الظل." + }, + { + "id": 73, + "label": "Split tone balance", + "localized": "توازن تلوين الانقسام", + "reload": "", + "hint": "يتحكم في نقطة التقاطع بين تلوين الظل والإضاءة العالية." + }, + { + "id": 74, + "label": "Subject", + "localized": "الموضوع", + "reload": "", + "hint": "موضوع الصورة." + }, + { + "id": 75, + "label": "Same latent", + "localized": "نفس الكامن", + "reload": "", + "hint": "استخدام نفس الكامن (Latent)." + }, + { + "id": 76, + "label": "Share queries", + "localized": "مشاركة الاستعلامات", + "reload": "", + "hint": "مشاركة الاستعلامات." + }, + { + "id": 77, + "label": "Sigma", + "localized": "سيجما", + "reload": "", + "hint": "قيمة سيجما." }, { "id": 78, - "label": "Scale factor", - "localized": "معامل المقياس", + "label": "Stride", + "localized": "خطوة (Stride)", "reload": "", - "hint": "" + "hint": "قيمة الخطوة." }, { "id": 79, - "label": "Strength curve", - "localized": "منحنى القوة", + "label": "Structure", + "localized": "الهيكل", "reload": "", - "hint": "" + "hint": "هيكل الصورة." }, { "id": 80, - "label": "Slider", - "localized": "منزلق", + "label": "Save HDR image", + "localized": "حفظ صورة HDR", "reload": "", - "hint": "" + "hint": "حفظ الصورة بنطاق ديناميكي عالي." }, { "id": 81, - "label": "Set at prompt start", - "localized": "تعيين في بداية المحفز", + "label": "Scale factor", + "localized": "معامل المقياس", "reload": "", - "hint": "" + "hint": "عامل القياس." }, { "id": 82, - "label": "space", - "localized": "مسافة", + "label": "Strength curve", + "localized": "منحنى القوة", "reload": "", - "hint": "" + "hint": "منحنى قوة المعالجة." }, { "id": 83, - "label": "Skip guidance layers", - "localized": "تخطي طبقات التوجيه", + "label": "Slider", + "localized": "شريط التمرير", "reload": "", - "hint": "" + "hint": "عنصر تحكم شريط التمرير." }, { "id": 84, - "label": "Shared options", - "localized": "خيارات مشتركة", + "label": "Set at prompt start", + "localized": "ضبط عند بداية الموجه", "reload": "", - "hint": "" + "hint": "تطبيق عند بدء الموجه." }, { "id": 85, - "label": "Shift", - "localized": "إزاحة", + "label": "space", + "localized": "مسافة", "reload": "", - "hint": "" + "hint": "مسافة." }, { "id": 86, - "label": "Spatial frequency", - "localized": "التردد المكاني", + "label": "Skip guidance layers", + "localized": "تخطي طبقات التوجيه", "reload": "", - "hint": "" + "hint": "تخطي طبقات التوجيه." }, { "id": 87, - "label": "Save as copy", - "localized": "حفظ كنسخة", + "label": "Shared options", + "localized": "خيارات مشتركة", "reload": "", - "hint": "" + "hint": "خيارات مشتركة." }, { "id": 88, - "label": "Sensitivity", - "localized": "الحساسية", + "label": "Shift", + "localized": "إزاحة", "reload": "", - "hint": "" + "hint": "إزاحة." }, { "id": 89, - "label": "System prompt", - "localized": "محفّز النظام", + "label": "Spatial frequency", + "localized": "التردد المكاني", "reload": "", - "hint": "يتحكم محفز النظام في سلوك النموذج اللغوي الكبير. تتم معالجته أولاً ويستمر طوال المحادثة. له أعلى أولوية ويتم إلحاقه دائماً في بداية التسلسل. استخدامه لـ: قواعد تنسيق الرد، تعريف الدور، والنمط." + "hint": "التردد المكاني." }, { "id": 90, - "label": "Source subject", - "localized": "الموضوع المصدر", + "label": "Save as copy", + "localized": "حفظ كنسخة", "reload": "", - "hint": "" + "hint": "حفظ الصورة كنسخة جديدة." }, { "id": 91, - "label": "Smooth mask", - "localized": "قناع ناعم", + "label": "Sensitivity", + "localized": "الحساسية", "reload": "", - "hint": "" + "hint": "حساسية الكشف." }, { "id": 92, - "label": "Scale after", - "localized": "تكبير بعد", + "label": "System prompt", + "localized": "موجه النظام", "reload": "", - "hint": "" + "hint": "يتحكم موجه النظام في سلوك النموذج اللغوي (LLM). يتم معالجته أولاً ويبقى سارياً طوال المحادثة." }, { "id": 93, - "label": "Scale mask", - "localized": "تكبير القناع", + "label": "Source subject", + "localized": "الموضوع المصدر", "reload": "", - "hint": "" + "hint": "موضوع الصورة المصدرية." }, { "id": 94, - "label": "Show input", - "localized": "عرض المدخلات", + "label": "Smooth mask", + "localized": "قناع ناعم", "reload": "", - "hint": "" + "hint": "تنعيم القناع." }, { "id": 95, - "label": "Show preview", - "localized": "عرض المعاينة", + "label": "Scale after", + "localized": "المقياس بعد", "reload": "", - "hint": "" + "hint": "تغيير الحجم بعد العملية." }, { "id": 96, - "label": "Separate init image", - "localized": "صورة ابتدائية منفصلة", + "label": "Scale mask", + "localized": "قناع المقياس", "reload": "", - "hint": "ينشئ نافذة إضافية بجانب مدخل Control تسمى Init input، بحيث يمكنك الحصول على صورة منفصلة لكل من عمليات التحكم والمصدر الابتدائي." + "hint": "تغيير حجم القناع." }, { "id": 97, - "label": "Skip input frames", - "localized": "تخطي إطارات الإدخال", + "label": "Show input", + "localized": "إظهار المدخلات", "reload": "", - "hint": "" + "hint": "عرض مدخلات الصورة." }, { "id": 98, - "label": "Style fidelity", - "localized": "دقة النمط", + "label": "Show preview", + "localized": "إظهار المعاينة", "reload": "", - "hint": "" + "hint": "عرض معاينة التوليد." }, { "id": 99, - "label": "Scribble", - "localized": "خربشة", + "label": "Separate init image", + "localized": "صورة بدئية منفصلة", "reload": "", - "hint": "" + "hint": "إنشاء نافذة إضافية بجانب إدخال التحكم لتحديد صورة بدئية منفصلة." }, { "id": 100, - "label": "Score threshold", - "localized": "عتبة الدرجة", + "label": "Skip input frames", + "localized": "تخطي إطارات الإدخال", "reload": "", - "hint": "" + "hint": "تخطي الإطارات عند الإدخال." }, { "id": 101, - "label": "Sampler shift", - "localized": "إزاحة المعيّن", + "label": "Style fidelity", + "localized": "دقة النمط", "reload": "", - "hint": "" + "hint": "مدى دقة الالتزام بالنمط." }, { "id": 102, - "label": "Save output", - "localized": "حفظ المخرجات", + "label": "Scribble", + "localized": "خربشة", "reload": "", - "hint": "" + "hint": "وضع الخربشة (Scribble)." }, { "id": 103, - "label": "Show result images", - "localized": "عرض صور النتائج", + "label": "Score threshold", + "localized": "عتبة النتيجة", "reload": "", - "hint": "تمكينه لعرض الصور المعالجة في لوحة الصور" + "hint": "الحد الأدنى لدرجة الثقة." }, { "id": 104, - "label": "Save Caption Files", - "localized": "حفظ ملفات الوصف", + "label": "Sampler shift", + "localized": "إزاحة المُعاين", "reload": "", - "hint": "حفظ الأوصاف المولدة في ملفات .txt بجانب الصور. يحصل كل صورة على ملف وصف مطابق بنفس الاسم الأساسي." + "hint": "إزاحة إعدادات المُعاين." }, { "id": 105, - "label": "Sort alphabetically", - "localized": "فرز أبجدياً", + "label": "Save output", + "localized": "حفظ المخرجات", "reload": "", - "hint": "فرز العلامات أبجدياً بدلاً من درجة الثقة. عند التعطيل، يتم فرز العلامات حسب الثقة (الأعلى أولاً). الفرز الأبجدي يسهل العثور على علامات محددة." + "hint": "حفظ النتيجة النهائية." }, { "id": 106, - "label": "Show confidence scores", - "localized": "عرض درجات الثقة", + "label": "Show result images", + "localized": "إظهار صور النتائج", "reload": "", - "hint": "عرض درجات الثقة بجانب كل علامة. يوضح مدى تأكد النموذج من كل علامة (من 0.0 إلى 1.0). مفيد لفهم أي العلامات أكثر موثوقية." + "hint": "تفعيل لعرض الصور المعالجة في لوحة الصور." }, { "id": 107, - "label": "Search", - "localized": "بحث", + "label": "Save Caption Files", + "localized": "حفظ ملفات التوصيف", "reload": "", - "hint": "" + "hint": "حفظ التوصيفات (Captions) المولدة في ملفات .txt بجانب الصور." }, { "id": 108, - "label": "Sort by", - "localized": "فرز حسب", + "label": "Sort alphabetically", + "localized": "فرز أبجدي", "reload": "", - "hint": "" + "hint": "فرز الوسوم (Tags) أبجدياً بدلاً من درجة الثقة." }, { "id": 109, - "label": "Specific branch name", - "localized": "اسم فرع محدد", + "label": "Show confidence scores", + "localized": "إظهار درجات الثقة", "reload": "", - "hint": "حدد اسم فرع الامتداد، اتركه فارغاً للفرع الافتراضي" + "hint": "عرض درجات ثقة النموذج بجانب كل وسم." }, { "id": 110, - "label": "Submodules", - "localized": "الوحدات الفرعية", + "label": "Search", + "localized": "بحث", "reload": "", - "hint": "" + "hint": "البحث." }, { "id": 111, - "label": "Server start time", - "localized": "وقت بدء الخادم", + "label": "Sort by", + "localized": "فرز حسب", "reload": "", - "hint": "" + "hint": "فرز النتائج حسب معيار معين." }, { "id": 112, - "label": "State", - "localized": "الحالة", + "label": "Specific branch name", + "localized": "اسم الفرع المحدد", "reload": "", - "hint": "" + "hint": "حدد اسم فرع الامتداد، اترك الحقل فارغاً للافتراضي." }, { "id": 113, - "label": "Search Docs", - "localized": "البحث في التوثيق", + "label": "Submodules", + "localized": "الوحدات الفرعية", "reload": "", - "hint": "" + "hint": "إدارة الوحدات الفرعية." }, { "id": 114, - "label": "Search GitHub Wiki Pages", - "localized": "البحث في ويكي GitHub", + "label": "Server start time", + "localized": "وقت بدء الخادم", "reload": "", - "hint": "" + "hint": "عرض وقت تشغيل الخادم." }, { "id": 115, - "label": "Search Changelog", - "localized": "البحث في سجل التغييرات", + "label": "State", + "localized": "الحالة", "reload": "", - "hint": "" + "hint": "حالة النظام." }, { "id": 116, - "label": "Stage boundary ratio", - "localized": "نسبة حدود المرحلة", + "label": "Search Docs", + "localized": "بحث في الوثائق", "reload": "", - "hint": "" + "hint": "البحث في وثائق النظام." }, { "id": 117, - "label": "sequential", - "localized": "تتابعي", + "label": "Search GitHub Wiki Pages", + "localized": "بحث في صفحات ويكي GitHub", "reload": "", - "hint": "" + "hint": "البحث في ويكي المشروع." }, { "id": 118, - "label": "SVD rank size", - "localized": "حجم رتبة SVD", + "label": "Search Changelog", + "localized": "بحث في سجل التغييرات", "reload": "", - "hint": "" + "hint": "البحث في سجل التغييرات." }, { "id": 119, - "label": "SVD steps", - "localized": "خطوات SVD", + "label": "Stage boundary ratio", + "localized": "نسبة حدود المرحلة", "reload": "", - "hint": "" + "hint": "نسبة الحدود للمرحلة الحالية." }, { "id": 120, - "label": "Shuffle weights in post mode", - "localized": "خلط الأوزان في الوضع البعدي", + "label": "sequential", + "localized": "تسلسلي", "reload": "", - "hint": "" + "hint": "المعالجة التسلسلية." }, { "id": 121, - "label": "SDXL: Use weighted pooled embeds", - "localized": "SDXL: استخدام التضمينات المجمعة الموزونة", + "label": "SVD rank size", + "localized": "حجم رتبة SVD", "reload": "", - "hint": "" + "hint": "حجم الرتبة لـ SVD." }, { "id": 122, - "label": "Sana: Use complex human instructions", - "localized": "Sana: استخدام تعليمات بشرية معقدة", + "label": "SVD steps", + "localized": "خطوات SVD", "reload": "", - "hint": "" + "hint": "عدد خطوات SVD." }, { "id": 123, - "label": "Scaled-Dot-Product", - "localized": "Scaled-Dot-Product", + "label": "Shuffle weights in post mode", + "localized": "خلط الأوزان في وضع ما بعد المعالجة", "reload": "", - "hint": "تحسين الذاكرة. غير حتمي ما لم يتم تعطيل انتباه الذاكرة SDP." + "hint": "إعادة ترتيب الأوزان." }, { "id": 124, - "label": "Sage attention", - "localized": "Sage attention", + "label": "SDXL: Use weighted pooled embeds", + "localized": "SDXL: استخدام التضمينات المجمعة الموزونة", "reload": "", - "hint": "طريقة تجريبية لتحسين الانتباه. قد تحسن السرعة ولكنها أقل اختباراً وقد تسبب أخطاء." + "hint": "خيار خاص بنموذج SDXL." }, { "id": 125, - "label": "stable-fast", - "localized": "stable-fast", + "label": "Sana: Use complex human instructions", + "localized": "Sana: استخدام تعليمات بشرية معقدة", "reload": "", - "hint": "" + "hint": "خيار خاص بنموذج Sana." }, { "id": 126, - "label": "Save all generated images", - "localized": "حفظ جميع الصور المولدة", + "label": "Scaled-Dot-Product", + "localized": "الضرب النقطي المُقيَّس", "reload": "", - "hint": "" + "hint": "تحسين للذاكرة. غير حتمي إلا إذا تم تعطيل انتباه ذاكرة SDP." }, { "id": 127, - "label": "Save interrupted images", - "localized": "حفظ الصور المقاطعة", + "label": "Sage attention", + "localized": "Sage attention", "reload": "", - "hint": "" + "hint": "طريقة تجريبية لتحسين الانتباه." }, { "id": 128, - "label": "Save all generated image grids", - "localized": "حفظ جميع شبكات الصور المولدة", + "label": "stable-fast", + "localized": "stable-fast", "reload": "", - "hint": "" + "hint": "تحسين استقرار وسرعة التوليد." }, { "id": 129, - "label": "Show metadata in full screen image browser", - "localized": "عرض البيانات الميتا في متصفح الصور بملء الشاشة", + "label": "Save all generated images", + "localized": "حفظ جميع الصور المولدة", "reload": "", - "hint": "" + "hint": "حفظ تلقائي لكل صورة يتم توليدها." }, { "id": 130, - "label": "Save init images", - "localized": "حفظ الصور الابتدائية", + "label": "Save interrupted images", + "localized": "حفظ الصور الموقوفة", "reload": "", - "hint": "" + "hint": "حفظ الصور التي تم إيقاف توليدها." }, { "id": 131, - "label": "Save image before hires", - "localized": "حفظ الصورة قبل الدقة العالية", + "label": "Save all generated image grids", + "localized": "حفظ جميع شبكات الصور المولدة", "reload": "", - "hint": "" + "hint": "حفظ ملفات الشبكة (Grids) للصور." }, { "id": 132, - "label": "Save image before refiner", - "localized": "حفظ الصورة قبل المنقح (Refiner)", + "label": "Show metadata in full screen image browser", + "localized": "إظهار البيانات الوصفية في متصفح الصور بملء الشاشة", "reload": "", - "hint": "" + "hint": "عرض بيانات الصورة (Metadata) عند التصفح." }, { "id": 133, - "label": "Save image before detailer", - "localized": "حفظ الصورة قبل المفصل (Detailer)", + "label": "Save init images", + "localized": "حفظ الصور البدئية", "reload": "", - "hint": "" + "hint": "حفظ الصور المستخدمة كمدخلات أولية." }, { "id": 134, - "label": "Save image before color correction", - "localized": "حفظ الصورة قبل تصحيح الألوان", + "label": "Save image before hires", + "localized": "حفظ الصورة قبل التكبير (Hires)", "reload": "", - "hint": "" + "hint": "حفظ الصورة الأصلية قبل معالجة التكبير." }, { "id": 135, - "label": "Save inpainting mask", - "localized": "حفظ قناع الرسم الداخلي", + "label": "Save image before refiner", + "localized": "حفظ الصورة قبل التنقيح (Refiner)", "reload": "", - "hint": "" + "hint": "حفظ الصورة قبل التمرير على نموذج التنقيح." }, { "id": 136, - "label": "Save inpainting masked composite", - "localized": "حفظ مركب الرسم الداخلي المقنع", + "label": "Save image before detailer", + "localized": "حفظ الصورة قبل التفصيل (Detailer)", "reload": "", - "hint": "" + "hint": "حفظ الصورة قبل تحسين التفاصيل." }, { "id": 137, - "label": "Save images to a subdirectory", - "localized": "حفظ الصور في مجلد فرعي", + "label": "Save image before color correction", + "localized": "حفظ الصورة قبل تصحيح الألوان", "reload": "", - "hint": "" + "hint": "حفظ الصورة قبل عملية تصحيح الألوان." }, { "id": 138, - "label": "Save metadata in image", - "localized": "حفظ البيانات الميتا داخل الصورة", + "label": "Save inpainting mask", + "localized": "حفظ قناع الرسم الداخلي", "reload": "", - "hint": "" + "hint": "حفظ القناع المستخدم في الرسم الداخلي (Inpainting)." }, { "id": 139, - "label": "Save metadata to text file", - "localized": "حفظ البيانات الميتا في ملف نصي", + "label": "Save inpainting masked composite", + "localized": "حفظ تركيبة الرسم الداخلي المقنعة", "reload": "", - "hint": "" + "hint": "حفظ الصورة الناتجة عن دمج القناع." }, { "id": 140, - "label": "Save metadata to JSON file", - "localized": "حفظ البيانات الميتا في ملف JSON", + "label": "Save images to a subdirectory", + "localized": "حفظ الصور في مجلد فرعي", "reload": "", - "hint": "" + "hint": "تنظيم الصور المحفوظة داخل مجلدات فرعية." }, { "id": 141, - "label": "System information to include in metadata", - "localized": "معلومات النظام لتضمينها في البيانات الميتا", + "label": "Save metadata in image", + "localized": "حفظ البيانات الوصفية في الصورة", "reload": "", - "hint": "" + "hint": "تضمين البيانات (Metadata) داخل ملف الصورة." }, { "id": 142, - "label": "Standard", - "localized": "قياسي", + "label": "Save metadata to text file", + "localized": "حفظ البيانات الوصفية في ملف نصي", "reload": "", - "hint": "" + "hint": "حفظ البيانات الوصفية في ملف .txt منفصل." }, { "id": 143, - "label": "Show MOTD", - "localized": "عرض رسالة اليوم", + "label": "Save metadata to JSON file", + "localized": "حفظ البيانات الوصفية في ملف JSON", "reload": "", - "hint": "" + "hint": "حفظ البيانات الوصفية في ملف بتنسيق JSON." }, { "id": 144, - "label": "sidebar", - "localized": "شريط جانبي", + "label": "System information to include in metadata", + "localized": "معلومات النظام المراد تضمينها في البيانات الوصفية", "reload": "", - "hint": "شريط جانبي على الجانب الأيمن من الشاشة" + "hint": "اختيار معلومات النظام المضافة للملف." }, { "id": 145, - "label": "Show log view", - "localized": "عرض عرض السجلات", + "label": "Standard", + "localized": "قياسي", "reload": "", - "hint": "عرض عرض السجلات في أسفل النافذة الرئيسية" + "hint": "الوضع القياسي." }, { "id": 146, - "label": "Show grid in results", - "localized": "عرض الشبكة في النتائج", + "label": "Show MOTD", + "localized": "إظهار رسالة اليوم (MOTD)", "reload": "", - "hint": "" + "hint": "عرض رسالة اليوم عند بدء التشغيل." }, { "id": 147, - "label": "Send seed when sending prompt or image to other interface", - "localized": "إرسال البذرة عند إرسال المحفز أو الصورة لواجهة أخرى", + "label": "sidebar", + "localized": "الشريط الجانبي", "reload": "", - "hint": "" + "hint": "الشريط الجانبي على يمين الشاشة." }, { "id": 148, - "label": "Send size when sending prompt or image to another interface", - "localized": "إرسال الحجم عند إرسال المحفز أو الصورة لواجهة أخرى", + "label": "Show log view", + "localized": "إظهار عرض السجل", "reload": "", - "hint": "" + "hint": "عرض سجل العمليات في أسفل النافذة الرئيسية." }, { "id": 149, - "label": "Show labels for aside tabs", - "localized": "عرض التسميات للتبويبات الجانبية", + "label": "Show grid in results", + "localized": "إظهار الشبكة في النتائج", "reload": "", - "hint": "" + "hint": "عرض شبكة الصور في النتائج." }, { "id": 150, - "label": "Show labels for main tabs", - "localized": "عرض التسميات للتبويبات الرئيسية", + "label": "Send seed when sending prompt or image to other interface", + "localized": "إرسال البذرة عند إرسال الموجه أو الصورة إلى واجهة أخرى", "reload": "", - "hint": "" + "hint": "مزامنة البذرة عند الانتقال بين الواجهات." }, { "id": 151, - "label": "Show labels for page tabs", - "localized": "عرض التسميات لتبويبات الصفحة", + "label": "Send size when sending prompt or image to another interface", + "localized": "إرسال الحجم عند إرسال الموجه أو الصورة إلى واجهة أخرى", "reload": "", - "hint": "" + "hint": "مزامنة أبعاد الصورة عند الانتقال بين الواجهات." }, { "id": 152, - "label": "Show ticks for input range slider", - "localized": "عرض العلامات لمنزلق نطاق الإدخال", + "label": "Show labels for aside tabs", + "localized": "إظهار تسميات التبويبات الجانبية", "reload": "", - "hint": "" + "hint": "إظهار العناوين للتبويبات الجانبية." }, { "id": 153, - "label": "Show parameter outline", - "localized": "عرض حدود المعاملات", + "label": "Show labels for main tabs", + "localized": "إظهار تسميات التبويبات الرئيسية", "reload": "", - "hint": "" + "hint": "إظهار العناوين للتبويبات الرئيسية." }, { "id": 154, - "label": "Simple", - "localized": "بسيط", + "label": "Show labels for page tabs", + "localized": "إظهار تسميات تبويبات الصفحة", "reload": "", - "hint": "تقريب رخيص جداً. سريع جداً مقارنة بـ VAE، ولكنه ينتج صوراً بدقة عرضية/رأسية أصغر بـ 8 مرات وجودة منخفضة للغاية" + "hint": "إظهار العناوين لتبويبات الصفحات." }, { "id": 155, - "label": "SeedVR CFG Scale", - "localized": "مقياس SeedVR CFG", + "label": "Show ticks for input range slider", + "localized": "إظهار علامات شريط نطاق الإدخال", "reload": "", - "hint": "" + "hint": "عرض تدريجات على شريط التمرير." }, { "id": 156, - "label": "Sort order", - "localized": "ترتيب الفرز", + "label": "Show parameter outline", + "localized": "إظهار مخطط المعايير", "reload": "", - "hint": "" + "hint": "عرض إطار حول المعايير." }, { "id": 157, - "label": "Skip CivitAI scan for regex pattern(s)", - "localized": "تخطي فحص CivitAI لأنماط regex", + "label": "Simple", + "localized": "بسيط", "reload": "", - "hint": "" + "hint": "تقريب رخيص جداً. سريع مقارنة بـ VAE، لكنه ينتج صوراً بدقة أقل 8 مرات وجودة منخفضة للغاية." }, { "id": 158, - "label": "Show reference styles", - "localized": "عرض أنماط المرجع", + "label": "SeedVR CFG Scale", + "localized": "مقياس SeedVR CFG", "reload": "", - "hint": "عرض أو إخفاء الأنماط المدمجة" + "hint": "إعداد المقياس الخاص بـ SeedVR." }, { "id": 159, - "label": "Skip Generation if NaN found in latents", - "localized": "تخطي التوليد إذا وجد NaN في الكوامن", + "label": "Sort order", + "localized": "ترتيب الفرز", "reload": "", - "hint": "" + "hint": "كيفية ترتيب العناصر." }, { "id": 160, - "label": "Save grids to a subdirectory", - "localized": "حفظ الشبكات في مجلد فرعي", + "label": "Skip CivitAI scan for regex pattern(s)", + "localized": "تخطي مسح CivitAI للأنماط النصية (Regex)", "reload": "", - "hint": "" + "hint": "تجاهل أنماط معينة أثناء المسح." }, { "id": 161, - "label": "Show live previews", - "localized": "عرض المعاينات المباشرة", + "label": "Show reference styles", + "localized": "إظهار أنماط المرجع", "reload": "", - "hint": "" + "hint": "عرض أو إخفاء الأنماط المدمجة." }, { "id": 162, - "label": "Save resumable optimizer state when training", - "localized": "حفظ حالة المحسن القابلة للاستئناف عند التدريب", + "label": "Skip Generation if NaN found in latents", + "localized": "تخطي التوليد إذا تم العثور على NaN في الكوامن", "reload": "", - "hint": "" + "hint": "منع التوليد في حالة حدوث خطأ رياضي (NaN)." }, { "id": 163, - "label": "Save training settings to a text file", - "localized": "حفظ إعدادات التدريب في ملف نصي", + "label": "Save grids to a subdirectory", + "localized": "حفظ الشبكات في مجلد فرعي", "reload": "", - "hint": "" + "hint": "تنظيم ملفات الشبكة في مجلد فرعي." }, { "id": 164, - "label": "Show previews as a grid", - "localized": "عرض المعاينات كشبكة", + "label": "Show live previews", + "localized": "إظهار المعاينات المباشرة", "reload": "", - "hint": "" + "hint": "تفعيل عرض المعاينة أثناء التوليد." }, { "id": 165, - "label": "Show progressbar", - "localized": "عرض شريط التقدم", + "label": "Save resumable optimizer state when training", + "localized": "حفظ حالة المُحسّن القابلة للاستئناف عند التدريب", "reload": "", - "hint": "" + "hint": "إعدادات حفظ حالة التدريب." }, { "id": 166, - "label": "Save generated images within tensorboard", - "localized": "حفظ الصور المولدة داخل tensorboard", + "label": "Save training settings to a text file", + "localized": "حفظ إعدادات التدريب في ملف نصي", "reload": "", - "hint": "" + "hint": "حفظ تكوين التدريب." }, { "id": 167, - "label": "Save loss CSV file every n steps", - "localized": "حفظ ملف فقدان CSV كل n خطوة", + "label": "Show previews as a grid", + "localized": "إظهار المعاينات كشبكة", "reload": "", - "hint": "" + "hint": "عرض المعاينات بشكل شبكي." }, { "id": 168, - "label": "Save images to a subdirectory when using Save button", - "localized": "حفظ الصور في مجلد فرعي عند استخدام زر الحفظ", + "label": "Show progressbar", + "localized": "إظهار شريط التقدم", "reload": "", - "hint": "" + "hint": "عرض شريط التقدم للعملية." }, { "id": 169, - "label": "Secondary model", - "localized": "النموذج الثانوي", + "label": "Save generated images within tensorboard", + "localized": "حفظ الصور المولدة داخل Tensorboard", "reload": "", - "hint": "" + "hint": "دمج صور التدريب في Tensorboard." }, { "id": 170, - "label": "Save metadata", - "localized": "حفظ البيانات الميتا", + "label": "Save loss CSV file every n steps", + "localized": "حفظ ملف خسارة CSV كل n خطوة", "reload": "", - "hint": "" + "hint": "حفظ بيانات الفقد (Loss) بشكل دوري." }, { "id": 171, - "label": "safetensors", - "localized": "safetensors", + "label": "Save images to a subdirectory when using Save button", + "localized": "حفظ الصور في مجلد فرعي عند استخدام زر الحفظ", "reload": "", - "hint": "" + "hint": "تنظيم الصور المحفوظة يدوياً." }, { "id": 172, - "label": "shuffle", - "localized": "خلط (shuffle)", + "label": "Secondary model", + "localized": "النموذج الثانوي", "reload": "", - "hint": "يحمل النموذج الكامل في RAM ويحسب على VRAM: تسريع أقل، مقترح لعمليات دمج SDXL" + "hint": "النموذج الثاني المستخدم في الدمج." }, { "id": 173, - "label": "Save diffusers", - "localized": "حفظ المشتتات (diffusers)", + "label": "SDXL", + "localized": "SDXL", "reload": "", - "hint": "" + "hint": "StableDiffusion XL." }, { "id": 174, - "label": "Save safetensors", - "localized": "حفظ safetensors", + "label": "Save metadata", + "localized": "حفظ البيانات الوصفية", "reload": "", - "hint": "" + "hint": "حفظ البيانات الوصفية للنموذج المدمج." }, { "id": 175, - "label": "Search models", - "localized": "بحث عن نماذج", + "label": "safetensors", + "localized": "safetensors", "reload": "", - "hint": "" + "hint": "تنسيق ملف النموذج safetensors." }, { "id": 176, - "label": "Select model", - "localized": "اختر نموذجاً", + "label": "shuffle", + "localized": "خلط", "reload": "", - "hint": "" + "hint": "تحميل النموذج الكامل في الذاكرة العشوائية (RAM) والحساب على ذاكرة الفيديو (VRAM): تسريع أقل، مقترح لدمج SDXL." }, { "id": 177, - "label": "Specify model variant", - "localized": "تحديد تنوع النموذج", + "label": "Save diffusers", + "localized": "حفظ diffusers", "reload": "", - "hint": "" + "hint": "حفظ النموذج بتنسيق Diffusers." }, { "id": 178, - "label": "Specify model revision", - "localized": "تحديد مراجعة النموذج", + "label": "Save safetensors", + "localized": "حفظ safetensors", "reload": "", - "hint": "" + "hint": "حفظ النموذج بتنسيق Safetensors." }, { "id": 179, - "label": "SegmentAnything", - "localized": "SegmentAnything", + "label": "Sort", + "localized": "فرز", "reload": "", - "hint": "" + "hint": "فرز النماذج." }, { "id": 180, - "label": "Sections", - "localized": "الأقسام", + "label": "Sort downloads into subfolders", + "localized": "فرز التنزيلات في مجلدات فرعية", "reload": "", - "hint": "" + "hint": "تنظيم ملفات التنزيل تلقائياً." }, { "id": 181, - "label": "Samplers", - "localized": "المعيّنات (Samplers)", + "label": "Subfolder template", + "localized": "قالب المجلد الفرعي", "reload": "", - "hint": "الإعدادات المتقدمة للمعينات/الجداول" + "hint": "تنسيق تسمية المجلدات الفرعية." + }, + { + "id": 182, + "label": "Search models", + "localized": "بحث عن نماذج", + "reload": "", + "hint": "البحث عن نماذج في المستودعات." + }, + { + "id": 183, + "label": "Select model", + "localized": "اختيار نموذج", + "reload": "", + "hint": "تحديد نموذج للعمل." + }, + { + "id": 184, + "label": "Specify model variant", + "localized": "تحديد متغير النموذج", + "reload": "", + "hint": "تحديد إصدار معين للنموذج." + }, + { + "id": 185, + "label": "Specify model revision", + "localized": "تحديد مراجعة النموذج", + "reload": "", + "hint": "تحديد مراجعة معينة للنموذج." + }, + { + "id": 186, + "label": "SegmentAnything", + "localized": "SegmentAnything", + "reload": "", + "hint": "أداة تقسيم الصور." + }, + { + "id": 187, + "label": "Sections", + "localized": "الأقسام", + "reload": "", + "hint": "أقسام الفيديو." + }, + { + "id": 188, + "label": "Samplers", + "localized": "المُعاينات", + "reload": "", + "hint": "الإعدادات المتقدمة للمُعاينات/المجدولات." } ], "t": [ { - "id": 618, + "id": 1, "label": "T2I", - "localized": "T2I", + "localized": "تحويل النص إلى صورة", "reload": "", - "hint": "إنشاء صورة من النص
واجهة قديمة تحاكي واجهة وسلوك تحويل النص إلى صورة الأصلي" + "hint": "إنشاء صورة من نص. واجهة قديمة تحاكي واجهة وسلوك تحويل النص إلى صورة الأصلي." }, { - "id": 619, + "id": 2, "label": "T2I Adapter", "localized": "محول T2I", "reload": "", - "hint": "" + "hint": "محول تحويل النص إلى صورة (T2I Adapter)." }, { - "id": 620, + "id": 3, "label": "Tagger", - "localized": "الموسم (Tagger)", + "localized": "المصنف (Tagger)", "reload": "", "hint": "تصنيف الصور باستخدام نماذج تصنيف تركز على الأنمي مثل WaifuDiffusion أو DeepBooru." }, { - "id": 621, + "id": 4, "label": "Tag", - "localized": "وسم", + "localized": "تصنيف", "reload": "", - "hint": "" + "hint": "تصنيف" }, { - "id": 622, + "id": 5, "label": "Text Encoder", - "localized": "مشفر النص", + "localized": "مُشفّر النص", "reload": "", - "hint": "الإعدادات المتعلقة بمشفر النص ومعالجة ترميز الأوامر (Prompt) أثناء التوليد" + "hint": "الإعدادات المتعلقة بمُشفّر النص ومعالجة ترميز الأوامر أثناء التوليد." }, { - "id": 623, + "id": 6, "label": "Text", "localized": "نص", "reload": "", - "hint": "إنشاء صورة من النص" + "hint": "إنشاء صورة من نص" }, { - "id": 624, + "id": 7, "label": "TorchAO", "localized": "TorchAO", "reload": "", - "hint": "" + "hint": "أدوات تحسين الأداء (TorchAO)" }, { - "id": 625, + "id": 8, "label": "TensorRT", "localized": "TensorRT", "reload": "", - "hint": "" + "hint": "مسرع الاستدلال TensorRT" }, { - "id": 626, + "id": 9, "label": "Torch Options", "localized": "خيارات Torch", "reload": "", - "hint": "" + "hint": "خيارات إطار عمل Torch" }, { - "id": 627, + "id": 10, "label": "Token Merging", - "localized": "دمج الرموز (Tokens)", + "localized": "دمج الرموز (Token Merging)", "reload": "", - "hint": "" + "hint": "دمج الرموز المميزة" }, { - "id": 628, + "id": 11, "label": "TeaCache", "localized": "TeaCache", "reload": "", - "hint": "" + "hint": "آلية التخزين المؤقت TeaCache" }, { - "id": 629, + "id": 12, "label": "Theme options", - "localized": "خيارات المظهر", + "localized": "خيارات السمة", "reload": "", - "hint": "" + "hint": "خيارات مظهر الواجهة" }, { - "id": 630, + "id": 13, "label": "Task History", "localized": "سجل المهام", "reload": "", - "hint": "" + "hint": "سجل المهام المنفذة" }, { - "id": 631, + "id": 14, + "label": "Tone", + "localized": "النغمة", + "reload": "", + "hint": "إعدادات النغمة" + }, + { + "id": 15, "label": "Timestep spacing", "localized": "تباعد الخطوات الزمنية", "reload": "", - "hint": "يحدد كيفية تباعد الخطوات الزمنية عبر عملية الانتشار (Diffusion). الخيارات:
- default: الافتراضي للنموذج
- leading: ينشئ خطوات متباعدة بالتساوي
- linspace: يتضمن الخطوتين الأولى والأخيرة ويختار الخطوات المتوسطة المتبقية بالتساوي
- trailing: يتضمن الخطوة الأخيرة فقط ويختار الخطوات المتوسطة المتبقية بالتساوي بدءاً من النهاية" + "hint": "يحدد كيفية توزيع الخطوات الزمنية عبر عملية الانتشار. الخيارات:- default: الافتراضي للنموذج- leading: ينشئ خطوات متباعدة بالتساوي- linspace: يتضمن الخطوات الأولى والأخيرة ويختار الخطوات الوسيطة بالتساوي- trailing: يتضمن الخطوة الأخيرة فقط ويختار الخطوات المتبقية بالتساوي بدءاً من النهاية" }, { - "id": 632, + "id": 16, "label": "Timesteps presets", - "localized": "إعدادات مسبقة للخطوات الزمنية", + "localized": "إعدادات الخطوات الزمنية المسبقة", "reload": "", - "hint": "" + "hint": "إعدادات مسبقة للخطوات الزمنية" }, { - "id": 633, + "id": 17, "label": "Timesteps override", "localized": "تجاوز الخطوات الزمنية", "reload": "", - "hint": "" + "hint": "تجاوز إعدادات الخطوات الزمنية" }, { - "id": 634, + "id": 18, "label": "thresholding", - "localized": "العتبة (Thresholding)", + "localized": "عتبة (Thresholding)", "reload": "", - "hint": "" + "hint": "ضبط العتبة" }, { - "id": 635, + "id": 19, + "label": "Tint strength", + "localized": "قوة التلوين", + "reload": "", + "hint": "شدة تأثير التلوين" + }, + { + "id": 20, "label": "Texture tiling", - "localized": "تكرار النسيج (Tiling)", + "localized": "تجانب النسيج (Texture Tiling)", "reload": "", - "hint": "تطبيق تكرار سلس على الصورة المولدة بحيث يمكن استخدامها كنسيج" + "hint": "تطبيق تجانب سلس على الصورة المولدة بحيث يمكن استخدامها كنسيج" }, { - "id": 636, + "id": 21, "label": "Threshold", "localized": "العتبة", "reload": "", - "hint": "" + "hint": "قيمة العتبة" }, { - "id": 637, + "id": 22, "label": "Trigger word", - "localized": "كلمة التشغيل (Trigger word)", + "localized": "كلمة التحفيز", "reload": "", - "hint": "" + "hint": "الكلمة المفتاحية لتحفيز النموذج" }, { - "id": 638, + "id": 23, "label": "Temperature", - "localized": "درجة الحرارة", + "localized": "الحرارة (Temperature)", "reload": "", - "hint": "" + "hint": "التحكم في عشوائية المخرجات" }, { - "id": 639, + "id": 24, "label": "Timestep", - "localized": "خطوة زمنية", + "localized": "الخطوة الزمنية", "reload": "", - "hint": "" + "hint": "الخطوة الزمنية" }, { - "id": 640, + "id": 25, "label": "Tile prompt: x=1 y=1", - "localized": "أمر المربع: x=1 y=1", + "localized": "مطالبة التجانب: x=1 y=1", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=1, y=1)" }, { - "id": 641, + "id": 26, "label": "Tile prompt: x=1 y=2", - "localized": "أمر المربع: x=1 y=2", + "localized": "مطالبة التجانب: x=1 y=2", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=1, y=2)" }, { - "id": 642, + "id": 27, "label": "Tile prompt: x=1 y=3", - "localized": "أمر المربع: x=1 y=3", + "localized": "مطالبة التجانب: x=1 y=3", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=1, y=3)" }, { - "id": 643, + "id": 28, "label": "Tile prompt: x=1 y=4", - "localized": "أمر المربع: x=1 y=4", + "localized": "مطالبة التجانب: x=1 y=4", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=1, y=4)" }, { - "id": 644, + "id": 29, "label": "Tile prompt: x=2 y=1", - "localized": "أمر المربع: x=2 y=1", + "localized": "مطالبة التجانب: x=2 y=1", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=2, y=1)" }, { - "id": 645, + "id": 30, "label": "Tile prompt: x=2 y=2", - "localized": "أمر المربع: x=2 y=2", + "localized": "مطالبة التجانب: x=2 y=2", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=2, y=2)" }, { - "id": 646, + "id": 31, "label": "Tile prompt: x=2 y=3", - "localized": "أمر المربع: x=2 y=3", + "localized": "مطالبة التجانب: x=2 y=3", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=2, y=3)" }, { - "id": 647, + "id": 32, "label": "Tile prompt: x=2 y=4", - "localized": "أمر المربع: x=2 y=4", + "localized": "مطالبة التجانب: x=2 y=4", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=2, y=4)" }, { - "id": 648, + "id": 33, "label": "Tile prompt: x=3 y=1", - "localized": "أمر المربع: x=3 y=1", + "localized": "مطالبة التجانب: x=3 y=1", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=3, y=1)" }, { - "id": 649, + "id": 34, "label": "Tile prompt: x=3 y=2", - "localized": "أمر المربع: x=3 y=2", + "localized": "مطالبة التجانب: x=3 y=2", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=3, y=2)" }, { - "id": 650, + "id": 35, "label": "Tile prompt: x=3 y=3", - "localized": "أمر المربع: x=3 y=3", + "localized": "مطالبة التجانب: x=3 y=3", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=3, y=3)" }, { - "id": 651, + "id": 36, "label": "Tile prompt: x=3 y=4", - "localized": "أمر المربع: x=3 y=4", + "localized": "مطالبة التجانب: x=3 y=4", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=3, y=4)" }, { - "id": 652, + "id": 37, "label": "Tile prompt: x=4 y=1", - "localized": "أمر المربع: x=4 y=1", + "localized": "مطالبة التجانب: x=4 y=1", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=4, y=1)" }, { - "id": 653, + "id": 38, "label": "Tile prompt: x=4 y=2", - "localized": "أمر المربع: x=4 y=2", + "localized": "مطالبة التجانب: x=4 y=2", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=4, y=2)" }, { - "id": 654, + "id": 39, "label": "Tile prompt: x=4 y=3", - "localized": "أمر المربع: x=4 y=3", + "localized": "مطالبة التجانب: x=4 y=3", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=4, y=3)" }, { - "id": 655, + "id": 40, "label": "Tile prompt: x=4 y=4", - "localized": "أمر المربع: x=4 y=4", + "localized": "مطالبة التجانب: x=4 y=4", "reload": "", - "hint": "" + "hint": "تجزئة الصورة (x=4, y=4)" }, { - "id": 656, + "id": 41, "label": "Temporal frequency", "localized": "التردد الزمني", "reload": "", - "hint": "" + "hint": "التردد الزمني" }, { - "id": 657, + "id": 42, "label": "Top-K", "localized": "Top-K", "reload": "", - "hint": "يحدد اختيار الرموز (Tokens) بـ K من المرشحين الأكثر احتمالية في كل خطوة.
القيم المنخفضة (مثل 40) تجعل النتائج أكثر تركيزاً وقابلية للتنبؤ، بينما تسمح القيم الأعلى بخيارات أكثر تنوعاً.
اضبطه على 0 للتعطيل." + "hint": "يحد من اختيار الرموز (Tokens) إلى أفضل K مرشح في كل خطوة. القيم المنخفضة (مثل 40) تجعل المخرجات أكثر تركيزاً وقابلية للتنبؤ، بينما القيم الأعلى تتيح خيارات أكثر تنوعاً. اضبط على 0 للتعطيل." }, { - "id": 658, + "id": 43, "label": "Top-P", "localized": "Top-P", "reload": "", - "hint": "يختار الرموز من أصغر مجموعة يتجاوز احتمالها التراكمي P (مثلاً 0.9).
يتكيف ديناميكياً مع عدد المرشحين بناءً على ثقة النموذج؛ خيارات أقل عند اليقين، وأكثر عند عدم اليقين.
اضبطه على 1 للتعطيل." + "hint": "يختار الرموز من أصغر مجموعة يتجاوز احتمالها التراكمي P (مثلاً 0.9). يتكيف ديناميكياً مع عدد المرشحين بناءً على ثقة النموذج؛ خيارات أقل عند اليقين، والمزيد عند عدم اليقين. اضبط على 1 للتعطيل." }, { - "id": 659, + "id": 44, "label": "Thinking mode", "localized": "وضع التفكير", "reload": "", - "hint": "يفعل التفكير/الاستنتاج، مما يسمح للنموذج بأخذ وقت أطول لتوليد الاستجابات.
هذا يمكن أن يؤدي إلى إجابات أكثر عمقاً وتفصيلاً، ولكنه سيزيد من وقت الاستجابة.
يؤثر هذا الإعداد على كل من النماذج الهجينة ونماذج التفكير فقط، وفي بعض الحالات قد يؤدي إلى جودة إجمالية أقل من المتوقع. بالنسبة لنماذج التفكير فقط مثل Qwen3-VL قد يتعين دمج هذا الإعداد مع Prefill لضمان منع التفكير.

النماذج التي تدعم هذه الميزة مميزة بأيقونة ." + "hint": "يُمكّن وضع التفكير/الاستدلال، مما يسمح للنموذج بأخذ المزيد من الوقت لتوليد الاستجابات. هذا قد يؤدي إلى إجابات أكثر دقة وتفصيلاً، ولكنه سيزيد من وقت الاستجابة. تؤثر هذه الإعدادات على النماذج الهجينة ونماذج التفكير فقط، وفي بعضها قد تؤدي إلى جودة إجمالية أقل من المتوقع. بالنسبة لنماذج التفكير فقط مثل Qwen3-VL، قد يلزم دمج هذا الإعداد مع 'prefill' لضمان منع التفكير. النماذج التي تدعم هذه الميزة مميزة بأيقونة ." }, { - "id": 660, + "id": 45, "label": "Target subject", "localized": "الموضوع المستهدف", "reload": "", - "hint": "" + "hint": "الموضوع المراد معالجته" }, { - "id": 661, + "id": 46, "label": "Tool", "localized": "أداة", "reload": "", - "hint": "" + "hint": "أداة" }, { - "id": 662, + "id": 47, "label": "Textbox", - "localized": "مربع نص", + "localized": "مربع النص", "reload": "", - "hint": "" + "hint": "مربع إدخال النص" }, { - "id": 663, + "id": 48, "label": "Tile overlap", - "localized": "تداخل المربعات", + "localized": "تداخل التجانب", "reload": "", - "hint": "بالنسبة لترقية SD (upscale)، كم بكسل يجب أن يكون هناك من التداخل بين المربعات. تتداخل المربعات بحيث عندما يتم دمجها مرة أخرى في صورة واحدة، لا يكون هناك خط فاصل مرئي بوضوح" + "hint": "بالنسبة لـ SD upscale، يحدد مقدار التداخل بالبكسل بين الأجزاء (Tiles). يتم التداخل بحيث عند دمج الأجزاء مرة أخرى في صورة واحدة، لا توجد فواصل مرئية بوضوح." }, { - "id": 664, + "id": 49, "label": "T2I Strength", "localized": "قوة T2I", "reload": "", - "hint": "" + "hint": "شدة تأثير تحويل النص إلى صورة" }, { - "id": 665, + "id": 50, "label": "Time embedding mix", - "localized": "مزيج تضمين الوقت", + "localized": "دمج التضمين الزمني", "reload": "", - "hint": "" + "hint": "مزيج التضمين الزمني" }, { - "id": 666, + "id": 51, "label": "Tiling options", - "localized": "خيارات التكرار", + "localized": "خيارات التجانب", "reload": "", - "hint": "" + "hint": "إعدادات التجانب" }, { - "id": 667, + "id": 52, "label": "Tiny", "localized": "صغير جداً", "reload": "", - "hint": "" + "hint": "حجم صغير جداً" }, { - "id": 668, + "id": 53, "label": "True guidance", - "localized": "التوجيه الحقيقي", + "localized": "توجيه حقيقي", "reload": "", - "hint": "" + "hint": "تفعيل التوجيه الحقيقي" }, { - "id": 669, + "id": 54, "label": "Tile frames", - "localized": "إطارات المربعات", + "localized": "إطارات التجانب", "reload": "", - "hint": "" + "hint": "تجانب الإطارات" }, { - "id": 670, + "id": 55, "label": "Task", "localized": "المهمة", "reload": "", - "hint": "يغير المهمة التي سيقوم بها النموذج. يمكن استخدام أوامر نصية عادية عندما يتم ضبط المهمة على Use Prompt.
عند تحديد خيارات أخرى، راجع نص التلميح داخل حقل Prompt الفارغ للإرشاد." + "hint": "يغير المهمة التي سيقوم بها النموذج. يمكن استخدام مطالبات نصية عادية عندما يتم تعيين المهمة على 'استخدام المطالبة' (Use Prompt). عند اختيار خيارات أخرى، راجع نص التلميح داخل حقل 'المطالبة' الفارغ للحصول على التوجيه." }, { - "id": 671, + "id": 56, "label": "Tagger Model", - "localized": "نموذج الوسم", + "localized": "نموذج التصنيف", "reload": "", - "hint": "النموذج المستخدم لوسم الصور.
نماذج WaifuDiffusion (wd-*): واصمات حديثة مع عتبات منفصلة للعام وللشخصيات.
DeepBooru: واصم قديم، يستخدم العتبة العامة فقط." + "hint": "النموذج المستخدم لتصنيف الصور. نماذج WaifuDiffusion (wd-*): مصنفات حديثة ذات عتبات منفصلة عامة وللشخصيات. DeepBooru: مصنف قديم، يستخدم العتبة العامة فقط." }, { - "id": 672, + "id": 57, "label": "Torch", "localized": "Torch", "reload": "", - "hint": "" + "hint": "إطار عمل Torch" }, { - "id": 673, + "id": 58, "label": "Transformers load using Run:ai streamer", "localized": "تحميل Transformers باستخدام Run:ai streamer", "reload": "", - "hint": "" + "hint": "تحميل نماذج Transformers عبر Run:ai" }, { - "id": 674, + "id": 59, "label": "Temporal steps", - "localized": "خطوات زمنية", + "localized": "الخطوات الزمنية", "reload": "", - "hint": "" + "hint": "عدد الخطوات الزمنية" }, { - "id": 675, + "id": 60, "label": "TE", - "localized": "TE", + "localized": "مُشفّر النص (TE)", "reload": "", - "hint": "" + "hint": "اختصار Text Encoder" }, { - "id": 676, + "id": 61, "label": "true", "localized": "صحيح", "reload": "", - "hint": "" + "hint": "تفعيل/صحيح" }, { - "id": 677, + "id": 62, "label": "Text encoder model", - "localized": "نموذج مشفر النص", + "localized": "نموذج مُشفّر النص", "reload": "", - "hint": "" + "hint": "تحديد نموذج تشفير النص" }, { - "id": 678, + "id": 63, "label": "Text encoder cache size", - "localized": "حجم ذاكرة التخزين المؤقت لمشفر النص", + "localized": "حجم ذاكرة التخزين المؤقت لمُشفّر النص", "reload": "", - "hint": "" + "hint": "حجم الذاكرة المؤقتة لترميز النص" }, { - "id": 679, + "id": 64, "label": "T5: Use shared instance of text encoder", - "localized": "T5: استخدام نسخة مشتركة من مشفر النص", + "localized": "T5: استخدام نسخة مشتركة من مُشفّر النص", "reload": "", - "hint": "" + "hint": "مشاركة نسخة مُشفّر النص لـ T5" }, { - "id": 680, + "id": 65, "label": "Tunable ops limit", "localized": "حد العمليات القابلة للضبط", "reload": "", - "hint": "" + "hint": "الحد الأقصى للعمليات القابلة للتعديل" }, { - "id": 681, + "id": 66, "label": "ToMe", "localized": "ToMe", "reload": "", - "hint": "" + "hint": "تقنية دمج الرموز (Token Merging)" }, { - "id": 682, + "id": 67, "label": "ToDo", "localized": "ToDo", "reload": "", - "hint": "" + "hint": "قائمة المهام" }, { - "id": 683, + "id": 68, "label": "ToMe token merging ratio", - "localized": "نسبة دمج الرموز ToMe", + "localized": "نسبة دمج رموز ToMe", "reload": "", - "hint": "تمكين دمج الرموز الفائضة عبر tomesd لتحسين السرعة والذاكرة، 0=معطل" + "hint": "تمكين دمج الرموز الزائدة عبر tomesd لتحسين السرعة والذاكرة، 0=معطل" }, { - "id": 684, + "id": 69, "label": "ToDo token merging ratio", - "localized": "نسبة دمج الرموز ToDo", + "localized": "نسبة دمج رموز ToDo", "reload": "", - "hint": "تمكين دمج الرموز الفائضة عبر todo لتحسين السرعة والذاكرة، 0=معطل" + "hint": "تمكين دمج الرموز الزائدة عبر todo لتحسين السرعة والذاكرة، 0=معطل" }, { - "id": 685, + "id": 70, "label": "TaylorSeer", "localized": "TaylorSeer", "reload": "", - "hint": "" + "hint": "أداة TaylorSeer" }, { - "id": 686, + "id": 71, "label": "TeaCache cache enabled", - "localized": "تمكين تخزين TeaCache مؤقتاً", + "localized": "تفعيل ذاكرة TeaCache", "reload": "", - "hint": "" + "hint": "تشغيل ذاكرة التخزين المؤقت TeaCache" }, { - "id": 687, + "id": 72, "label": "TeaCache L1 threshold", "localized": "عتبة TeaCache L1", "reload": "", - "hint": "" + "hint": "قيمة عتبة L1 لـ TeaCache" }, { - "id": 688, + "id": 73, "label": "TAESD", "localized": "TAESD", "reload": "", - "hint": "" + "hint": "نموذج فك التشفير التلقائي (TAESD)" }, { - "id": 689, + "id": 74, "label": "TAESD variant", "localized": "نسخة TAESD", "reload": "", - "hint": "" + "hint": "تحديد إصدار TAESD" }, { - "id": 690, + "id": 75, "label": "TAESD decode layers", - "localized": "طبقات فك ترميز TAESD", + "localized": "طبقات فك تشفير TAESD", "reload": "", - "hint": "" + "hint": "عدد طبقات فك التشفير لـ TAESD" }, { - "id": 691, + "id": 76, "label": "Tensorboard flush period", - "localized": "فترة إفراغ Tensorboard", + "localized": "فترة مسح Tensorboard", "reload": "", - "hint": "" + "hint": "فترة تحديث Tensorboard" }, { - "id": 692, + "id": 77, "label": "Tertiary model", - "localized": "نموذج ثالث", + "localized": "النموذج الثالث", "reload": "", - "hint": "" + "hint": "النموذج الثالث المستخدم في الدمج" }, { - "id": 693, - "label": "Target model type", - "localized": "نوع النموذج المستهدف", + "id": 78, + "label": "Time period", + "localized": "الفترة الزمنية", "reload": "", - "hint": "" + "hint": "الفترة الزمنية" }, { - "id": 694, + "id": 79, "label": "T2I-Adapter unit 1", "localized": "وحدة T2I-Adapter 1", "reload": "", - "hint": "" + "hint": "وحدة محول التجانب 1" }, { - "id": 695, + "id": 80, "label": "T2I-Adapter unit 2", "localized": "وحدة T2I-Adapter 2", "reload": "", - "hint": "" + "hint": "وحدة محول التجانب 2" }, { - "id": 696, + "id": 81, "label": "T2I-Adapter unit 3", "localized": "وحدة T2I-Adapter 3", "reload": "", - "hint": "" + "hint": "وحدة محول التجانب 3" }, { - "id": 697, + "id": 82, "label": "T2I-Adapter unit 4", "localized": "وحدة T2I-Adapter 4", "reload": "", - "hint": "" + "hint": "وحدة محول التجانب 4" } ], "u": [ { - "id": 755, - "label": "Unload model", - "localized": "إلغاء تحميل النموذج", + "id": 0, + "label": "prompt_enhance_unload", + "localized": "prompt_enhance_unload", "reload": "", - "hint": "إلغاء تحميل النموذج المحمل حالياً" + "hint": "إلغاء تحميل النموذج الحالي" }, { - "id": 756, + "id": 1, "label": "Upload", "localized": "رفع", "reload": "", "hint": "" }, { - "id": 757, + "id": 2, "label": "Unload", "localized": "إلغاء التحميل", "reload": "", "hint": "" }, { - "id": 758, + "id": 3, "label": "Update all installed", - "localized": "تحديث جميع المثبتات", + "localized": "تحديث الكل المثبت", "reload": "", "hint": "تحديث الإضافات المثبتة إلى أحدث إصدار متاح" }, { - "id": 759, + "id": 4, "label": "Update", "localized": "تحديث", "reload": "", "hint": "" }, { - "id": 760, + "id": 5, "label": "User interface", "localized": "واجهة المستخدم", "reload": "", - "hint": "مراجعة وضبط تفضيلات واجهة المستخدم" + "hint": "مراجعة وتعيين تفضيلات واجهة المستخدم" }, { - "id": 761, + "id": 6, "label": "Update all", "localized": "تحديث الكل", "reload": "", "hint": "" }, { - "id": 762, + "id": 7, + "label": "UNet/DiT", + "localized": "UNet/DiT", + "reload": "", + "hint": "" + }, + { + "id": 8, "label": "Upscale", - "localized": "ترقية الدقة", + "localized": "رفع الدقة", "reload": "", - "hint": "ترقية دقة الصورة" + "hint": "رفع دقة الصورة" }, { - "id": 763, + "id": 9, "label": "UI Tabs", - "localized": "تبويبات الواجهة", + "localized": "علامات تبويب الواجهة", "reload": "", "hint": "" }, { - "id": 764, + "id": 10, "label": "Upscaling", - "localized": "ترقية الدقة (Upscaling)", + "localized": "رفع الدقة", "reload": "", "hint": "" }, { - "id": 765, + "id": 11, "label": "Use segmentation", - "localized": "استخدام التجزئة", + "localized": "استخدام التقطيع (Segmentation)", "reload": "", - "hint": "تشغيل المحسن باستخدام قناع التجزئة (Segmentation Mask)" + "hint": "تشغيل أداة التفصيل باستخدام قناع التقطيع" }, { - "id": 766, + "id": 12, "label": "Unload adapter", "localized": "إلغاء تحميل المحول (Adapter)", "reload": "", - "hint": "إلغاء تحميل محول IP فوراً بعد التوليد. وإلا فسيظل محول IP محملاً للاستخدام الأسرع في عملية التوليد التالية" + "hint": "إلغاء تحميل IP adapter فوراً بعد التوليد. خلاف ذلك، سيبقى المحول محملاً لتسريع عملية التوليد القادمة" }, { - "id": 767, + "id": 13, "label": "Use same seed", - "localized": "استخدام نفس البذرة", + "localized": "استخدام نفس البذرة (Seed)", "reload": "", "hint": "" }, { - "id": 768, + "id": 14, "label": "Use defaults", - "localized": "استخدام الافتراضيات", + "localized": "استخدام الإعدادات الافتراضية", "reload": "", "hint": "" }, { - "id": 769, + "id": 15, "label": "Use text inputs", "localized": "استخدام مدخلات نصية", "reload": "", "hint": "" }, { - "id": 770, + "id": 16, "label": "Use random seeds", "localized": "استخدام بذور عشوائية", "reload": "", "hint": "" }, { - "id": 771, + "id": 17, "label": "Use vision", - "localized": "استخدام الرؤية", + "localized": "استخدام الرؤية الحاسوبية", "reload": "", - "hint": "تضمين صورة الإدخال عند تحسين الوصف.

متاح فقط للنماذج القادرة على الرؤية، والمميزة بأيقونة ." + "hint": "تضمين صورة الإدخال عند تحسين النص الموجه (Prompt). متاح فقط للنماذج التي تدعم الرؤية والمميزة بأيقونة ." }, { - "id": 772, + "id": 18, "label": "Use samplers", - "localized": "استخدام أدوات العينات (Samplers)", + "localized": "استخدام أداة أخذ العينات (Sampler)", "reload": "", - "hint": "تمكين لاستخدام أخذ العينات (اختيار الرموز عشوائياً بناءً على طرق مثل Top-k أو Top-p) أو تعطيله لاستخدام فك التشفير الجشع (اختيار الرمز الأكثر احتمالاً في كل خطوة).
التمكين يجعل المخرجات أكثر تنوعاً وإبداعاً ولكن أقل حتمية." + "hint": "فعّل هذا الخيار لاستخدام أخذ العينات (اختيار عشوائي للرموز بناءً على طرق مثل Top-k أو Top-p) أو عطل الخيار لاستخدام فك التشفير الجشع (اختيار الرمز الأكثر احتمالاً في كل خطوة). التفعيل يجعل المخرجات أكثر تنوعاً وإبداعاً ولكن أقل حتمية." }, { - "id": 773, + "id": 19, "label": "Unload after processing", "localized": "إلغاء التحميل بعد المعالجة", "reload": "", "hint": "" }, { - "id": 774, + "id": 20, "label": "up", - "localized": "لأعلى", + "localized": "up", "reload": "", "hint": "" }, { - "id": 775, + "id": 21, "label": "Upscaler", - "localized": "مرقي الدقة (Upscaler)", + "localized": "رافع الدقة", "reload": "", - "hint": "ما هو النموذج المدرب مسبقاً الذي سيتم استخدامه لعملية ترقية الدقة." + "hint": "نموذج رفع الدقة المدرب مسبقاً الذي سيتم استخدامه لعملية رفع الدقة." }, { - "id": 776, + "id": 22, "label": "Units", - "localized": "الوحدات", + "localized": "وحدات", "reload": "", "hint": "" }, { - "id": 777, + "id": 23, "label": "Unload processor", "localized": "إلغاء تحميل المعالج", "reload": "", "hint": "" }, { - "id": 778, + "id": 24, "label": "Use spaces", - "localized": "استخدام المسافات", + "localized": "استخدام مسافات", "reload": "", - "hint": "استبدال الشرطات السفلية بمسافات في مخرجات الوسوم.
تفضل بعض أنظمة الأوصاف المسافات بين الكلمات بينما يستخدم البعض الآخر الشرطات السفلية." + "hint": "استبدال الشرطات السفلية بمسافات في مخرجات الوسوم. بعض أنظمة التوجيه تفضل المسافات بين الكلمات (مثلاً 'long hair') بينما تستخدم أخرى الشرطات السفلية (مثلاً 'long_hair')." }, { - "id": 779, + "id": 25, "label": "Username", "localized": "اسم المستخدم", "reload": "", "hint": "" }, { - "id": 780, + "id": 26, "label": "UNET model", "localized": "نموذج UNET", "reload": "", "hint": "" }, { - "id": 781, + "id": 27, "label": "Use torch streams", - "localized": "استخدام دفق Torch", + "localized": "استخدام مسارات Torch", "reload": "", "hint": "" }, { - "id": 782, + "id": 28, "label": "Use SVD quantization", - "localized": "استخدام تكميم SVD", + "localized": "استخدام كمية SVD", "reload": "", "hint": "" }, { - "id": 783, + "id": 29, "label": "Use Dynamic quantization", - "localized": "استخدام التكميم الديناميكي", + "localized": "استخدام الكمية الديناميكية", "reload": "", "hint": "" }, { - "id": 784, + "id": 30, "label": "Use quantized MatMul", - "localized": "استخدام MatMul المكمم", + "localized": "استخدام ضرب المصفوفات المكمم (Quantized MatMul)", "reload": "", "hint": "" }, { - "id": 785, + "id": 31, "label": "Use quantized MatMul with conv", - "localized": "استخدام MatMul المكمم مع conv", + "localized": "استخدام ضرب المصفوفات المكمم مع الالتفاف (Conv)", "reload": "", "hint": "" }, { - "id": 786, + "id": 32, "label": "Use line break as prompt segment marker", - "localized": "استخدام فاصل الأسطر كعلامة لتقسيم الوصف", + "localized": "استخدام فاصل الأسطر كعلامة لتقسيم النص الموجه", "reload": "", "hint": "" }, { - "id": 787, + "id": 33, "label": "Use zeros for prompt padding", - "localized": "استخدام الأصفار لحشو الوصف", + "localized": "استخدام الأصفار لحشوة النص الموجه", "reload": "", - "hint": "فرض موتر (Tensor) صفري كامل عندما يكون الوصف فارغاً لإزالة أي ضوضاء متبقية" + "hint": "فرض موتر صفري كامل عندما يكون النص الموجه فارغاً لإزالة أي ضجيج متبقي" }, { - "id": 788, + "id": 34, "label": "Upcast sampling", - "localized": "ترقية نوع العينات (Upcast)", + "localized": "رفع دقة أخذ العينات", "reload": "", - "hint": "عادة ما ينتج نتائج مشابهة لـ --no-half مع أداء أفضل مع استخدام ذاكرة أقل" + "hint": "عادةً ما ينتج نتائج مشابهة لـ --no-half مع أداء أفضل واستهلاك أقل للذاكرة" }, { - "id": 789, + "id": 35, "label": "Unset", - "localized": "غير معين", + "localized": "إلغاء التعيين", "reload": "", "hint": "" }, { - "id": 790, + "id": 36, "label": "UI save only saves selected image", - "localized": "حفظ الواجهة يحفظ الصورة المختارة فقط", + "localized": "حفظ الصور المختارة فقط في الواجهة", "reload": "", "hint": "" }, { - "id": 791, + "id": 37, "label": "Use image gallery cache", "localized": "استخدام ذاكرة التخزين المؤقت لمعرض الصور", "reload": "", "hint": "" }, { - "id": 792, + "id": 38, "label": "Use fixed width thumbnails", - "localized": "استخدام صور مصغرة ثابتة العرض", + "localized": "استخدام صور مصغرة بعرض ثابت", "reload": "", "hint": "" }, { - "id": 793, + "id": 39, "label": "UI theme", "localized": "سمة الواجهة", "reload": "", "hint": "" }, { - "id": 794, + "id": 40, "label": "UI request timeout", "localized": "مهلة طلب الواجهة", "reload": "", "hint": "" }, { - "id": 795, + "id": 41, "label": "UI locale", - "localized": "اللغة المحلية للواجهة", + "localized": "لغة الواجهة", "reload": "", "hint": "" }, { - "id": 796, + "id": 42, "label": "Unload upscaler after processing", - "localized": "إلغاء تحميل مرقي الدقة بعد المعالجة", + "localized": "إلغاء تحميل رافع الدقة بعد المعالجة", "reload": "", "hint": "" }, { - "id": 797, + "id": 43, "label": "Upscaler latent steps", - "localized": "خطوات مرقي الدقة الكامنة (Latent Steps)", + "localized": "خطوات رافع الدقة الكامن", "reload": "", "hint": "" }, { - "id": 798, + "id": 44, "label": "Upscaler tile size", - "localized": "حجم بلاطة مرقي الدقة", + "localized": "حجم البلاطة لرافع الدقة", "reload": "", - "hint": "0 = بدون تبليط" + "hint": "0 = بدون تقسيم (Tiling)" }, { - "id": 799, + "id": 45, "label": "Upscaler tile overlap", - "localized": "تداخل بلاطات مرقي الدقة", + "localized": "تداخل البلاطات لرافع الدقة", "reload": "", - "hint": "القيم المنخفضة = تظهر طبقات مرئية" + "hint": "قيم منخفضة = ظهور فواصل مرئية" }, { - "id": 800, + "id": 46, "label": "Use cached model config when available", "localized": "استخدام إعدادات النموذج المخزنة مؤقتاً عند توفرها", "reload": "", "hint": "" }, { - "id": 801, + "id": 47, "label": "UI show on startup", - "localized": "إظهار الواجهة عند البدء", + "localized": "إظهار الواجهة عند بدء التشغيل", "reload": "", "hint": "" }, { - "id": 802, + "id": 48, "label": "UI sidebar width (%)", "localized": "عرض الشريط الجانبي للواجهة (%)", "reload": "", "hint": "" }, { - "id": 803, + "id": 49, "label": "UI height (%)", "localized": "ارتفاع الواجهة (%)", "reload": "", "hint": "" }, { - "id": 804, + "id": 50, "label": "UI fetch network info on mouse-over", - "localized": "جلب معلومات الشبكة عند تمرير الماوس", + "localized": "جلب معلومات الشبكة عند تمرير الفأرة", "reload": "", "hint": "" }, { - "id": 805, + "id": 51, "label": "Use reference values when available", "localized": "استخدام القيم المرجعية عند توفرها", "reload": "", "hint": "" }, { - "id": 806, + "id": 52, "label": "user", "localized": "مستخدم", "reload": "", "hint": "" }, { - "id": 807, + "id": 53, "label": "Upcast attention layer", - "localized": "ترقية طبقة الانتباه (Upcast)", + "localized": "رفع دقة طبقة الانتباه (Attention Layer)", "reload": "", "hint": "" }, { - "id": 808, + "id": 54, "label": "Use separate base dict", "localized": "استخدام قاموس أساسي منفصل", "reload": "", "hint": "" }, { - "id": 809, + "id": 55, "label": "Use model EMA weights when possible", - "localized": "استخدام أوزان EMA للنموذج كلما أمكن", + "localized": "استخدام أوزان EMA للنموذج عند الإمكان", "reload": "", "hint": "" }, { - "id": 810, + "id": 56, "label": "Use Kohya method for handling multiple LoRA", - "localized": "استخدام طريقة Kohya للتعامل مع عدة LoRA", + "localized": "استخدام طريقة Kohya للتعامل مع أكثر من LoRA", "reload": "", "hint": "" }, { - "id": 811, + "id": 57, "label": "UI scripts order", "localized": "ترتيب سكربتات الواجهة", "reload": "", "hint": "" }, { - "id": 812, + "id": 58, "label": "Use upscaler as suffix", - "localized": "استخدام مرقي الدقة كلاحقة", + "localized": "استخدام رافع الدقة كلاحقة", "reload": "", "hint": "" }, { - "id": 813, + "id": 59, "label": "Unload Current Model from VRAM", "localized": "إلغاء تحميل النموذج الحالي من ذاكرة الفيديو (VRAM)", "reload": "", "hint": "" }, { - "id": 814, + "id": 60, "label": "unet", "localized": "unet", "reload": "", "hint": "" }, { - "id": 815, + "id": 61, "label": "Upsample", "localized": "زيادة العينات (Upsample)", "reload": "", @@ -10566,458 +10797,458 @@ ], "v": [ { - "id": 7, - "label": "Video", + "id": 0, + "label": "video_nav", "localized": "فيديو", "reload": "n/a", - "hint": "إنشاء مقاطع فيديو باستخدام طرق مختلفة
يدعم نص-إلى-صورة، وصورة-إلى-صورة للإطار الأول والأخير، وما إلى ذلك." + "hint": "إنشاء فيديوهات باستخدام طرق مختلفة
يدعم التحويل من نص إلى صورة، ومن صورة إلى صورة (الإطار الأول-الأخير)، وغيرها." }, { - "id": 15, - "label": "Video Params", - "localized": "معلمات الفيديو", + "id": 1, + "label": "video_params_outputs", + "localized": "معاملات الفيديو", "reload": "n/a", - "hint": "إعدادات متعلقة بتشفير ملف فيديو المخرج" + "hint": "الإعدادات المتعلقة بترميز ملف الفيديو الناتج" }, { - "id": 0, + "id": 2, "label": "VLM Caption", - "localized": "وصف VLM", + "localized": "شرح VLM", "reload": "n/a", - "hint": "تحليل الصورة باستخدام نموذج لغة الرؤية (VLM)" + "hint": "تحليل الصورة باستخدام نموذج الرؤية واللغة (VLM)" }, { - "id": 0, + "id": 3, "label": "Variational Auto Encoder", "localized": "المشفر التلقائي المتغير (VAE)", "reload": "n/a", - "hint": "إعدادات متعلقة بالمشفر التلقائي المتغير وعملية فك تشفير الصور أثناء التوليد" + "hint": "الإعدادات المتعلقة بالمشفر التلقائي المتغير (VAE) وعملية فك تشفير الصورة أثناء التوليد" }, { - "id": 0, - "label": "VAE", - "localized": "VAE", - "reload": "n/a", - "hint": "المشفر التلقائي المتغير (Variational Auto Encoder): النموذج المستخدم لتشغيل فك تشفير الصور في نهاية عملية التوليد" - }, - { - "id": 0, + "id": 4, "label": "Video Output", - "localized": "مخرج الفيديو", + "localized": "مخرجات الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 5, "label": "Variation", - "localized": "التنويع", + "localized": "التباين", "reload": "n/a", - "hint": "بذرة ثانوية يتم خلطها مع البذرة الأساسية" + "hint": "بذرة (seed) ثانوية يتم خلطها مع البذرة الأساسية" }, { - "id": 0, + "id": 6, "label": "Variation strength", - "localized": "قوة التنويع", + "localized": "قوة التباين", "reload": "n/a", - "hint": "مدى قوة التباين المراد إنتاجه. عند القيمة 0، لن يكون هناك تأثير. عند القيمة 1، ستحصل على الصورة الكاملة مع بذرة التنويع (باستثناء أخذ العينات السلفي ancestral samplers، حيث ستحصل على شيء عشوائي)" + "hint": "مدى قوة التباين المطلوب إنتاجه. عند القيمة 0، لن يكون هناك تأثير. عند القيمة 1، ستحصل على الصورة الكاملة باستخدام بذرة التباين (باستثناء أدوات أخذ العينات من نوع ancestral، حيث ستحصل على نتيجة مختلفة)." }, { - "id": 0, + "id": 7, + "label": "Vignette", + "localized": "تظليل الحواف", + "reload": "n/a", + "hint": "تطبيق تعتيم شعاعي للحواف مما يوجه التركيز نحو مركز الصورة.
القيم الأعلى تنتج تلاشياً أقوى من المركز إلى الزوايا.

اضبط على 0 للتعطيل. يحاكي تلاشي الضوء الطبيعي الذي يظهر في العدسات السينمائية والقديمة." + }, + { + "id": 8, "label": "VAE type", "localized": "نوع VAE", "reload": "n/a", - "hint": "اختر ما إذا كنت تريد تشغيل VAE الكامل، أو VAE بجودة منخفضة، أو محاولة استخدام خدمة VAE عن بعد" + "hint": "اختر ما إذا كنت تريد تشغيل VAE كامل، أو VAE بجودة منخفضة، أو محاولة استخدام خدمة VAE عن بُعد" }, { - "id": 0, - "label": "Vibrance", - "localized": "الحيوية", - "reload": "n/a", - "hint": "" - }, - { - "id": 0, + "id": 9, "label": "Version", "localized": "الإصدار", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 10, "label": "Video format", - "localized": "صيغة الفيديو", + "localized": "تنسيق الفيديو", "reload": "n/a", - "hint": "تنسيق وترميز فيديو المخرج" + "hint": "تنسيق وبرنامج ترميز الفيديو الناتج" }, { - "id": 0, + "id": 11, "label": "Video duration", "localized": "مدة الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 12, "label": "Video engine", "localized": "محرك الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 13, "label": "Video model", "localized": "نموذج الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 14, "label": "VAE decode", "localized": "فك تشفير VAE", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 15, "label": "Video interpolation", - "localized": "إقحام الفيديو", + "localized": "استيفاء الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 16, "label": "Video codec", "localized": "ترميز الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 17, "label": "Video options", "localized": "خيارات الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 18, "label": "Video save video", - "localized": "حفظ فيديو الفيديو", + "localized": "حفظ الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 19, "label": "Video save frames", "localized": "حفظ إطارات الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 20, "label": "Video save safetensors", - "localized": "حفظ safetensors الفيديو", + "localized": "حفظ بصيغة Safetensors", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 21, "label": "Video file", "localized": "ملف الفيديو", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 22, "label": "VLM Model", "localized": "نموذج VLM", "reload": "n/a", - "hint": "حدد النموذج المستخدم لمهام لغة الرؤية.

النماذج التي تدعم وضع التفكير مميزة بأيقونة ." + "hint": "اختر النموذج الذي تريد استخدامه لمهام الرؤية واللغة.

النماذج التي تدعم وضع التفكير مميزة بأيقونة ." }, { - "id": 0, + "id": 23, "label": "VLM Max Tokens", - "localized": "أقصى عدد رموز VLM", + "localized": "الحد الأقصى لرموز VLM", "reload": "n/a", - "hint": "أقصى عدد من الرموز (tokens) التي يمكن للنموذج توليدها في رده.
النموذج ليس على دراية بهذا الحد أثناء التوليد ولن يجعله يحاول إنشاء ردود أكثر تفصيلاً أو إيجازاً، بل يحدد فقط حداً صارماً للطول، وسيقطع الرد قسرياً عند الوصول إلى الحد." + "hint": "الحد الأقصى لعدد الرموز (tokens) التي يمكن للنموذج توليدها في رده.
لا يدرك النموذج هذا الحد أثناء التوليد، ولن يجعله يحاول توليد استجابات أكثر تفصيلاً أو إيجازاً، بل يضع حداً صارماً للطول، وسيقطع الاستجابة قسراً عند الوصول إلى هذا الحد." }, { - "id": 0, + "id": 24, "label": "VLM Num Beams", - "localized": "عدد حزم VLM", + "localized": "عدد المسارات (Beams) في VLM", "reload": "n/a", - "hint": "يحافظ على مسارات مرشحة متعددة في وقت واحد ويختار أفضل تسلسل إجمالي.
مثل استكشاف عدة مسودات في وقت واحد للعثور على الأفضل. أكثر دقة ولكنه أبطأ بكثير وأقل إبداعاً من العينات العشوائية.
لا ينصح به بشكل عام، فمعظم نماذج VLM الحديثة تعمل بشكل أفضل مع طرق أخذ العينات (sampling).
اضبطه على 1 للتعطيل." + "hint": "يحتفظ بمسارات مرشحة متعددة في وقت واحد ويختار أفضل تسلسل بشكل عام.
يشبه استكشاف عدة مسودات في وقت واحد للعثور على الأفضل. أكثر دقة ولكنه أبطأ بكثير وأقل إبداعاً من أخذ العينات العشوائي.
بشكل عام غير مستحسن، فالعديد من نماذج VLM الحديثة تعمل بشكل أفضل مع طرق أخذ العينات.
اضبط القيمة على 1 للتعطيل." }, { - "id": 0, + "id": 25, "label": "VLM Temperature", - "localized": "حرارة VLM", + "localized": "درجة حرارة VLM", "reload": "n/a", - "hint": "يتحكم في العشوائية في اختيار الرموز. القيم المنخفضة (مثلاً 0.1) تجعل المخرجات أكثر تركيزاً وحتمية، حيث تختار دائماً الرموز ذات الاحتمالية العالية.
القيم الأعلى (مثلاً 0.9) تزيد من الإبداع والتنوع من خلال السماح بالرموز الأقل احتمالية.

اضبطه على 0 للحصول على مخرجات حتمية تماماً (يختار دائماً الرمز الأكثر احتمالية)." + "hint": "يتحكم في العشوائية عند اختيار الرموز. القيم المنخفضة (مثل 0.1) تجعل المخرجات أكثر تركيزاً ومحددة، حيث تختار دائماً الرموز ذات الاحتمالية العالية.
القيم الأعلى (مثل 0.9) تزيد من الإبداع والتنوع من خلال السماح باختيار رموز أقل احتمالاً.

اضبط على 0 للحصول على مخرجات محددة تماماً (يختار دائماً الرمز الأكثر احتمالاً)." }, { - "id": 0, + "id": 26, "label": "VLM", "localized": "VLM", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 27, + "label": "VAE", + "localized": "VAE", + "reload": "n/a", + "hint": "المشفر التلقائي المتغير (Variational Auto Encoder): نموذج يُستخدم لتشغيل فك تشفير الصورة في نهاية عملية التوليد" + }, + { + "id": 28, "label": "VAE model", "localized": "نموذج VAE", "reload": "n/a", - "hint": "يساعد VAE في التفاصيل الدقيقة في الصورة النهائية وقد يغير الألوان أيضاً" + "hint": "يساعد VAE في تحسين التفاصيل الدقيقة في الصورة النهائية وقد يغير الألوان أيضاً" }, { - "id": 0, + "id": 29, "label": "VAE slicing", "localized": "تقطيع VAE", "reload": "n/a", - "hint": "يفك تشفير دفعات الصور الكامنة (latents) صورة تلو الأخرى عند محدودية ذاكرة الفيديو (VRAM). يوفر دفعة أداء بسيطة في فك تشفير VAE للدفعات متعددة الصور" + "hint": "فك تشفير الصور الكامنة (latents) دفعة واحدة لكل صورة، مع ذاكرة فيديو (VRAM) محدودة. يوفر زيادة بسيطة في الأداء عند فك تشفير VAE للصور المجمعة" }, { - "id": 0, + "id": 30, "label": "VAE tiling", "localized": "تبليط VAE", "reload": "n/a", - "hint": "تقسيم الصور الكبيرة إلى بلاطات متداخلة عند محدودية ذاكرة الفيديو (VRAM). يؤدي إلى زيادة طفيفة في وقت المعالجة" + "hint": "تقسيم الصور الكبيرة إلى مربعات متداخلة (tiles) عند محدودية ذاكرة الفيديو. يؤدي إلى زيادة طفيفة في وقت المعالجة" }, { - "id": 0, + "id": 31, "label": "VAE tile size", "localized": "حجم بلاطة VAE", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 32, "label": "VAE tile overlap", - "localized": "تداخل بلاطات VAE", + "localized": "تداخل بلاطة VAE", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 33, "label": "verbose", - "localized": "مطول (verbose)", + "localized": "إسهاب (Verbose)", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 34, "label": "VAE sliced encode", - "localized": "تشفير VAE مقطع", + "localized": "ترميز VAE مقطع", "reload": "n/a", "hint": "" }, { - "id": 0, + "id": 35, "label": "VGen params", - "localized": "معلمات VGen", + "localized": "معاملات VGen", "reload": "n/a", "hint": "" } ], "w": [ - { - "id": 0, - "label": "Wiki", - "localized": "Wiki", - "reload": "", - "hint": "ويكي (موسوعة المعلومات)" - }, { "id": 1, - "label": "Wildcards", - "localized": "Wildcards", + "label": "Wiki", + "localized": "ويكي", "reload": "", - "hint": "الرموز البديلة (Wildcards)" + "hint": "ويكي" }, { "id": 2, - "label": "WanAI", - "localized": "WanAI", + "label": "Wildcards", + "localized": "البطاقات البديلة (Wildcards)", "reload": "", - "hint": "نموذج WanAI" + "hint": "البطاقات البديلة (Wildcards)" }, { "id": 3, - "label": "Watermarking", - "localized": "العلامة المائية", + "label": "WanAI", + "localized": "وان إيه آي (WanAI)", "reload": "", - "hint": "إضافة علامة مائية للصور لحماية الحقوق" + "hint": "وان إيه آي (WanAI)" }, { "id": 4, + "label": "Watermarking", + "localized": "العلامة المائية", + "reload": "", + "hint": "إضافة علامة مائية" + }, + { + "id": 5, "label": "Width", "localized": "العرض", "reload": "", "hint": "عرض الصورة" }, - { - "id": 5, - "label": "Warmth", - "localized": "الدفء", - "reload": "", - "hint": "درجة حرارة اللون أو الدفء في الصورة" - }, { "id": 6, "label": "Weight", "localized": "الوزن", "reload": "", - "hint": "قوة أو وزن التأثير المستخدم" + "hint": "الوزن" }, { "id": 7, "label": "Width after", "localized": "العرض بعد", "reload": "", - "hint": "العرض النهائي بعد التعديل" + "hint": "العرض بعد" }, { "id": 8, "label": "Width mask", "localized": "قناع العرض", "reload": "", - "hint": "قناع التحكم في العرض" + "hint": "قناع العرض" }, { "id": 9, "label": "WebP lossless compression", - "localized": "ضغط WebP غير منقوص", + "localized": "ضغط WebP بدون فقدان", "reload": "", - "hint": "استخدام ضغط WebP الذي يحافظ على جودة الصورة الكاملة" + "hint": "ضغط WebP بدون فقدان" }, { "id": 10, - "label": "Weights clip", - "localized": "تقييد الأوزان", + "label": "wavelet", + "localized": "المويجات (wavelet)", "reload": "", - "hint": "إجبار الأوزان المدمجة على ألا تتجاوز قيم النموذج الأصلي، مما يمنع احتراق الصورة أو التشبع المفرط" + "hint": "المويجات (wavelet)" + }, + { + "id": 11, + "label": "Weights clip", + "localized": "قص الأوزان", + "reload": "", + "hint": "فرض دمج الأوزان بحيث لا تكون أثقل من النموذج الأصلي، مما يمنع الاحتراق والنماذج المشبعة بشكل مفرط" } ], "x": [ { - "id": 0, + "id": 1, "label": "XS", "localized": "XS", "reload": "", "hint": "" }, { - "id": 1, + "id": 2, "label": "X components", "localized": "مكونات X", "reload": "", "hint": "" }, { - "id": 2, + "id": 3, "label": "X overlap", "localized": "تداخل X", "reload": "", "hint": "" }, - { - "id": 3, - "label": "X-axis tiles", - "localized": "مربعات محور X", - "reload": "", - "hint": "" - }, { "id": 4, - "label": "X-axis tile overlap", - "localized": "تداخل مربعات محور X", + "label": "X-axis tiles", + "localized": "بلاطات المحور السيني (X)", "reload": "", "hint": "" }, { "id": 5, + "label": "X-axis tile overlap", + "localized": "تداخل بلاطات المحور السيني (X)", + "reload": "", + "hint": "" + }, + { + "id": 6, "label": "X type", "localized": "نوع X", "reload": "", "hint": "" }, { - "id": 6, + "id": 7, "label": "X values", "localized": "قيم X", "reload": "", - "hint": "افصل بين قيم محور X باستخدام الفواصل" + "hint": "افصل بين قيم المحور السيني (X) باستخدام الفواصل" }, { - "id": 7, + "id": 8, "label": "xhinker", "localized": "xhinker", "reload": "", "hint": "" }, { - "id": 8, + "id": 9, "label": "xFormers", "localized": "xFormers", "reload": "", - "hint": "تحسين الذاكرة. غير حتمي (نتائج مختلفة في كل مرة)" + "hint": "تحسين استخدام الذاكرة. غير حتمي (يعطي نتائج مختلفة في كل مرة)" }, { - "id": 9, + "id": 10, "label": "xet", "localized": "xet", "reload": "", "hint": "" }, { - "id": 10, + "id": 11, "label": "XYZ Grid", "localized": "شبكة XYZ", "reload": "", - "hint": "شبكة XYZ هي وحدة قوية تنشئ شبكة صور بناءً على تغيير بارامترات توليد متعددة" + "hint": "شبكة XYZ هي وحدة قوية تقوم بإنشاء شبكة صور بناءً على تغيير معلمات توليد متعددة" } ], "y": [ { "id": 0, "label": "Y components", - "localized": "مكونات المحور الصادي (Y)", + "localized": "مكونات Y", "reload": "", - "hint": "تحديد مكونات المحور الصادي لتقسيم الصور" + "hint": "مكونات المحور الصادي (Y)" }, { "id": 0, "label": "Y overlap", - "localized": "تداخل المحور الصادي (Y)", + "localized": "تداخل Y", "reload": "", - "hint": "مقدار التداخل بين المربعات على طول المحور الصادي" + "hint": "تداخل المحور الصادي (Y)" }, { "id": 0, "label": "Y-axis tiles", - "localized": "مربعات المحور الصادي (Y)", + "localized": "بلاطات المحور Y", "reload": "", - "hint": "عدد المربعات (Tiles) على طول المحور الصادي" + "hint": "تقسيمات المحور الصادي (Y)" }, { "id": 0, "label": "Y-axis tile overlap", - "localized": "تداخل مربعات المحور الصادي (Y)", + "localized": "تداخل بلاطات المحور Y", "reload": "", - "hint": "حجم التداخل بين المربعات المتجاورة على المحور الصادي" + "hint": "تداخل التقسيمات على المحور الصادي (Y)" }, { "id": 0, "label": "Y type", - "localized": "نوع المحور الصادي (Y)", + "localized": "نوع Y", "reload": "", - "hint": "نوع البيانات أو المعلمة المستخدمة للمحور الصادي" + "hint": "نوع المحور الصادي (Y)" }, { "id": 0, "label": "Y values", - "localized": "قيم المحور الصادي (Y)", + "localized": "قيم Y", "reload": "", - "hint": "افصل بين قيم المحور الصادي باستخدام الفواصل" + "hint": "افصل بين قيم المحور الصادي (Y) باستخدام الفواصل" } ], "z": [ @@ -11025,50 +11256,43 @@ "id": 0, "label": "ZImageTurbo", "localized": "ZImageTurbo", - "reload": "", + "reload": "false", "hint": "ZImageTurbo" }, { "id": 1, - "label": "zimage", - "localized": "zimage", - "reload": "", - "hint": "zimage" + "label": "ZeroStar init steps", + "localized": "خطوات التهيئة لـ ZeroStar", + "reload": "false", + "hint": "عدد خطوات التهيئة لخوارزمية ZeroStar" }, { "id": 2, - "label": "ZeroStar init steps", - "localized": "خطوات التهيئة ZeroStar", - "reload": "", - "hint": "خطوات التهيئة الأولية لمحرك ZeroStar" - }, - { - "id": 3, "label": "Zero", "localized": "Zero", - "reload": "", + "reload": "false", "hint": "Zero" }, { - "id": 4, + "id": 3, "label": "Z type", "localized": "نوع المحور Z", - "reload": "", - "hint": "تحديد نوع المحور Z لشبكة الاحتمالات" + "reload": "false", + "hint": "حدد نوع المتغير للمحور Z في الشبكة" + }, + { + "id": 4, + "label": "Z values", + "localized": "قيم المحور Z", + "reload": "false", + "hint": "افصل القيم الخاصة بالمحور Z باستخدام الفواصل" }, { "id": 5, - "label": "Z values", - "localized": "قيم المحور Z", - "reload": "", - "hint": "افصل القيم للمحور Z باستخدام الفواصل" - }, - { - "id": 6, "label": "Zoe Depth", - "localized": "عمق Zoe", - "reload": "", - "hint": "استخراج خريطة العمق باستخدام نموذج Zoe" + "localized": "Zoe Depth", + "reload": "false", + "hint": "نموذج تقدير العمق Zoe Depth" } ] -} +} \ No newline at end of file diff --git a/html/locale_bn.json b/html/locale_bn.json index 5cb6ef568..f6581acde 100644 --- a/html/locale_bn.json +++ b/html/locale_bn.json @@ -1,74 +1,74 @@ { "0": [ { - "id": 0, + "id": 1, "label": "1st Stage", - "localized": "১ম পর্যায়", - "reload": "", - "hint": "প্রথম ধাপের প্রক্রিয়া (First Stage)" + "localized": "প্রথম পর্যায়", + "reload": "false", + "hint": "এটি প্রথম পর্যায়ের সেটিং।" }, { - "id": 0, + "id": 2, "label": "2nd Stage", - "localized": "২য় পর্যায়", - "reload": "", - "hint": "দ্বিতীয় ধাপের প্রক্রিয়া (Second Stage)" + "localized": "দ্বিতীয় পর্যায়", + "reload": "false", + "hint": "এটি দ্বিতীয় পর্যায়ের সেটিং।" }, { - "id": 0, + "id": 3, "label": "2nd Scale", - "localized": "২য় স্কেল", - "reload": "", - "hint": "দ্বিতীয় ধাপের স্কেলিং প্যারামিটার" + "localized": "দ্বিতীয় স্কেল", + "reload": "false", + "hint": "দ্বিতীয় পর্যায়ের স্কেলিং ফ্যাক্টর নির্ধারণ করুন।" }, { - "id": 0, + "id": 4, "label": "2nd Restart step", - "localized": "২য় রিস্টার্ট স্টেপ", - "reload": "", - "hint": "দ্বিতীয় ধাপে যেখান থেকে পুনরায় শুরু করতে হবে" + "localized": "দ্বিতীয় রিস্টার্ট ধাপ", + "reload": "false", + "hint": "দ্বিতীয় পর্যায়ের রিস্টার্ট ধাপের সংখ্যা।" }, { - "id": 0, + "id": 5, "label": "3rd Stage", - "localized": "৩য় পর্যায়", - "reload": "", - "hint": "তৃতীয় ধাপের প্রক্রিয়া (Third Stage)" + "localized": "তৃতীয় পর্যায়", + "reload": "false", + "hint": "এটি তৃতীয় পর্যায়ের সেটিং।" }, { - "id": 0, + "id": 6, "label": "3rd Scale", - "localized": "৩য় স্কেল", - "reload": "", - "hint": "তৃতীয় ধাপের স্কেলিং প্যারামিটার" + "localized": "তৃতীয় স্কেল", + "reload": "false", + "hint": "তৃতীয় পর্যায়ের স্কেলিং ফ্যাক্টর নির্ধারণ করুন।" }, { - "id": 0, + "id": 7, "label": "3rd Restart step", - "localized": "৩য় রিস্টার্ট স্টেপ", - "reload": "", - "hint": "তৃতীয় ধাপে যেখান থেকে পুনরায় শুরু করতে হবে" + "localized": "তৃতীয় রিস্টার্ট ধাপ", + "reload": "false", + "hint": "তৃতীয় পর্যায়ের রিস্টার্ট ধাপের সংখ্যা।" }, { - "id": 0, + "id": 8, "label": "4th Stage", - "localized": "৪র্থ পর্যায়", - "reload": "", - "hint": "চতুর্থ ধাপের প্রক্রিয়া (Fourth Stage)" + "localized": "চতুর্থ পর্যায়", + "reload": "false", + "hint": "এটি চতুর্থ পর্যায়ের সেটিং।" }, { - "id": 0, + "id": 9, "label": "4th Scale", - "localized": "৪র্থ স্কেল", - "reload": "", - "hint": "চতুর্থ ধাপের স্কেলিং প্যারামিটার" + "localized": "চতুর্থ স্কেল", + "reload": "false", + "hint": "চতুর্থ পর্যায়ের স্কেলিং ফ্যাক্টর নির্ধারণ করুন।" }, { - "id": 0, + "id": 10, "label": "4th Restart step", - "localized": "৪র্থ রিস্টার্ট স্টেপ", - "reload": "", - "hint": "চতুর্থ ধাপে যেখান থেকে পুনরায় শুরু করতে হবে" + "localized": "চতুর্থ রিস্টার্ট ধাপ", + "reload": "false", + "hint": "চতুর্থ পর্যায়ের রিস্টার্ট ধাপের সংখ্যা।" } ], "_": [ @@ -76,1226 +76,1261 @@ "id": 0, "label": "⟲", "localized": "⟲", - "reload": "", - "hint": "রিফ্রেশ (পুনরায় সতেজ) করুন" + "reload": "txt2img_styles_refresh", + "hint": "রিফ্রেশ করুন" }, { - "id": 0, + "id": 1, "label": "↶", "localized": "↶", - "reload": "", - "hint": "নির্বাচিত স্টাইলটি প্রম্পটে প্রয়োগ করুন" + "reload": "txt2img_styles_apply", + "hint": "নির্বাচিত স্টাইলটি প্রম্পটে প্রয়োগ করুন" }, { - "id": 0, + "id": 2, "label": "↷", "localized": "↷", - "reload": "", + "reload": "txt2img_styles_save", "hint": "বর্তমান প্রম্পটটি স্টাইল হিসেবে সংরক্ষণ করুন" }, { - "id": 0, + "id": 3, "label": "⇅", "localized": "⇅", - "reload": "", + "reload": "txt2img_res_btn_swap", "hint": "মানগুলো অদলবদল করুন" }, { - "id": 0, + "id": 4, "label": "🎲️", "localized": "🎲️", - "reload": "", + "reload": "txt2img_seed_random", "hint": "র‍্যান্ডম সিড (Random Seed) ব্যবহার করুন" }, { - "id": 0, + "id": 5, "label": "⬅️", "localized": "⬅️", - "reload": "", - "hint": "সর্বশেষ পরিচিত জেনারেট করা ছবির সিড পুনরায় ব্যবহার করুন" + "reload": "txt2img_seed_reuse", + "hint": "সর্বশেষ তৈরি করা ছবির সিড পুনরায় ব্যবহার করুন" }, { - "id": 0, + "id": 6, "label": "🕮", "localized": "🕮", - "reload": "", - "hint": "সর্বশেষ জেনারেট করা ছবির প্যারামিটারগুলো স্টাইল টেমপ্লেট হিসেবে সংরক্ষণ করুন" + "reload": "txt2img_guider_docs", + "hint": "সর্বশেষ তৈরি করা ছবির প্যারামিটারগুলো স্টাইল টেমপ্লেট হিসেবে সংরক্ষণ করুন" }, { - "id": 0, + "id": 7, "label": "📐", "localized": "📐", - "reload": "", + "reload": "txt2img_resize_detect_size", "hint": "বিদ্যমান ছবি থেকে আকার পরিমাপ করুন" }, { - "id": 0, + "id": 8, "label": "☲", "localized": "☲", - "reload": "", - "hint": "ভিউ টাইপ বা দেখার ধরন পরিবর্তন করুন" + "reload": "txt2img_yolo_models_list", + "hint": "ভিউ টাইপ পরিবর্তন করুন" }, { - "id": 0, + "id": 9, "label": "⊜", "localized": "⊜", - "reload": "", + "reload": "xyz_grid_x_list", "hint": "পূরণ করুন" }, { - "id": 0, + "id": 10, "label": "", "localized": "", - "reload": "", - "hint": "ছবির ক্যাপশন লিখুন" + "reload": "txt2img_caption_output", + "hint": "ছবির ক্যাপশন দিন" }, { - "id": 0, + "id": 11, "label": "⁜", "localized": "⁜", - "reload": "", + "reload": "txt2img_image_fit", "hint": "ইমেজ ফিট পদ্ধতি পরিবর্তন করুন" }, { - "id": 0, + "id": 12, "label": "➠ Control", "localized": "➠ কন্ট্রোল", "reload": "", "hint": "ছবিটি কন্ট্রোল ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 13, "label": "➠ Text", "localized": "➠ টেক্সট", "reload": "", "hint": "ছবিটি টেক্সট ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 14, "label": "➠ Image", "localized": "➠ ইমেজ", "reload": "", "hint": "ছবিটি ইমেজ ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 15, "label": "➠ Process", "localized": "➠ প্রসেস", "reload": "", "hint": "ছবিটি প্রসেস ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 16, "label": "➠ Caption", "localized": "➠ ক্যাপশন", "reload": "", "hint": "ছবিটি ক্যাপশন ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 17, "label": "➠ Sketch", "localized": "➠ স্কেচ", "reload": "", "hint": "ছবিটি স্কেচ ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 18, "label": "➠ Inpaint", - "localized": "➠ ইনপেইন্ট", + "localized": "➠ ইনপেইনট", "reload": "", - "hint": "ছবিটি ইনপেইন্ট ইন্টারফেসে পাঠান" + "hint": "ছবিটি ইনপেইনট ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 19, "label": "➠ Composite", "localized": "➠ কম্পোজিট", "reload": "", - "hint": "ছবিটি ইনপেইন্ট স্কেচ ইন্টারফেসে পাঠান" + "hint": "ছবিটি ইনপেইনট স্কেচ ইন্টারফেসে পাঠান" }, { - "id": 0, + "id": 20, "label": "⬆️", "localized": "⬆️", - "reload": "", + "reload": "controlnet_unit-0-upload", "hint": "ছবি আপলোড করুন" }, { - "id": 0, + "id": 21, "label": "🔄", "localized": "🔄", - "reload": "", + "reload": "controlnet_unit-0-reset", "hint": "মানগুলো রিসেট করুন" }, { - "id": 0, + "id": 22, "label": "🖼️", "localized": "🖼️", - "reload": "", - "hint": "প্রিভিউ বা পূর্বরূপ দেখুন" + "reload": "controlnet_unit-0-preview", + "hint": "প্রিভিউ দেখুন" }, { - "id": 0, + "id": 23, "label": "↺", "localized": "↺", - "reload": "", - "hint": "অবিলম্বে নির্বাচন প্রয়োগ করুন" + "reload": "video_model_load", + "hint": "তাৎক্ষণিকভাবে নির্বাচনটি প্রয়োগ করুন" }, { - "id": 0, + "id": 24, "label": "", "localized": "", - "reload": "", - "hint": "নাম অনুযায়ী সাজান, আরোহী ক্রমে" + "reload": "component-5878", + "hint": "নাম অনুযায়ী সাজান (আরোহী ক্রম)" }, { - "id": 0, + "id": 25, "label": "", "localized": "", - "reload": "", - "hint": "নাম অনুযায়ী সাজান, অবরোহী ক্রমে" + "reload": "component-5879", + "hint": "নাম অনুযায়ী সাজান (অবরোহী ক্রম)" }, { - "id": 0, + "id": 26, "label": "", "localized": "", - "reload": "", - "hint": "আকার অনুযায়ী সাজান, আরোহী ক্রমে" + "reload": "component-5880", + "hint": "আকার অনুযায়ী সাজান (আরোহী ক্রম)" }, { - "id": 0, + "id": 27, "label": "", "localized": "", - "reload": "", - "hint": "আকার অনুযায়ী সাজান, অবরোহী ক্রমে" + "reload": "component-5881", + "hint": "আকার অনুযায়ী সাজান (অবরোহী ক্রম)" }, { - "id": 0, + "id": 28, "label": "", "localized": "", - "reload": "", - "hint": "রেজোলিউশন অনুযায়ী সাজান, আরোহী ক্রমে" + "reload": "component-5882", + "hint": "রেজোলিউশন অনুযায়ী সাজান (আরোহী ক্রম)" }, { - "id": 0, + "id": 29, "label": "", "localized": "", - "reload": "", - "hint": "রেজোলিউশন অনুযায়ী সাজান, অবরোহী ক্রমে" + "reload": "component-5883", + "hint": "রেজোলিউশন অনুযায়ী সাজান (অবরোহী ক্রম)" }, { - "id": 0, + "id": 30, "label": "", "localized": "", - "reload": "", - "hint": "সময় অনুযায়ী সাজান, আরোহী ক্রমে" + "reload": "component-5884", + "hint": "সময় অনুযায়ী সাজান (আরোহী ক্রম)" }, { - "id": 0, + "id": 31, "label": "", "localized": "", - "reload": "", - "hint": "সময় অনুযায়ী সাজান, অবরোহী ক্রমে" + "reload": "component-5885", + "hint": "সময় অনুযায়ী সাজান (অবরোহী ক্রম)" }, { - "id": 0, + "id": 32, "label": "⊗", "localized": "⊗", - "reload": "", + "reload": "quicksettings_clear", "hint": "মানগুলো রিসেট করুন" }, { - "id": 0, + "id": 33, "label": "🔍", "localized": "🔍", - "reload": "", + "reload": "docs_btn_search", "hint": "অনুসন্ধান করুন" }, { - "id": 0, + "id": 34, "label": "⇨", "localized": "⇨", - "reload": "", - "hint": "প্রিসেট প্রয়োগ করুন" + "reload": "component-5667", + "hint": "প্রিসেট প্রয়োগ করুন" }, { - "id": 0, + "id": 35, "label": "※", "localized": "※", - "reload": "", - "hint": "নির্বাচিত হলে রিফাইনার মডেল হিসেবে লোড করুন, অন্যথায় বেস মডেল হিসেবে লোড করুন" + "reload": "txt2img_extra_model", + "hint": "নির্বাচিত হলে মডেলটিকে রিফাইনার মডেল হিসেবে লোড করুন, অন্যথায় বেস মডেল হিসেবে লোড করুন" }, { - "id": 0, + "id": 36, "label": "🔎︎", "localized": "🔎︎", - "reload": "", - "hint": "হারানো মেটাডেটা এবং প্রিভিউয়ের জন্য CivitAI স্ক্যান করুন" + "reload": "txt2img_extra_scan", + "hint": "মিসিং মেটাডেটা এবং প্রিভিউয়ের জন্য CivitAI স্ক্যান করুন" }, { - "id": 0, + "id": 37, "label": "⇕", "localized": "⇕", - "reload": "", - "hint": "সাজানোর ধরন: নাম, আকার, অথবা সময় অনুযায়ী" + "reload": "txt2img_extra_sort", + "hint": "সাজানোর ক্রম: নাম (আরোহী/অবরোহী), আকার (সর্ববৃহৎ/সর্বনিম্ন), সময় (সর্বশেষ/পুরানো)" }, { - "id": 0, + "id": 38, "label": "✕", "localized": "✕", - "reload": "", + "reload": "txt2img_extra_close", "hint": "বন্ধ করুন" + }, + { + "id": 39, + "label": "_Guidance scale", + "localized": "_গাইডেন্স স্কেল", + "reload": "", + "hint": "গাইডেন্স স্কেল" + }, + { + "id": 40, + "label": "_Guidance rescale", + "localized": "_গাইডেন্স রিস্কেল", + "reload": "", + "hint": "গাইডেন্স রিস্কেল" + }, + { + "id": 41, + "label": "_Guidance start", + "localized": "_গাইডেন্স শুরু", + "reload": "", + "hint": "গাইডেন্স শুরু" + }, + { + "id": 42, + "label": "_Guidance stop", + "localized": "_গাইডেন্স থামুন", + "reload": "", + "hint": "গাইডেন্স থামুন" } ], "a": [ { "id": 0, - "label": "Advanced", - "localized": "উন্নত (Advanced)", - "reload": "txt2img_advanced", + "label": "txt2img_advanced", + "localized": "উন্নত", + "reload": "", "hint": "ইমেজ তৈরির জন্য ব্যবহৃত উন্নত সেটিংস" }, { - "id": 1, - "label": "Adapters", - "localized": "অ্যাডাপ্টার্স", - "reload": "txt2img_adapters", - "hint": "আইপি অ্যাডাপ্টার (IP Adapters) সংক্রান্ত সেটিংস" + "id": 0, + "label": "txt2img_adapters", + "localized": "অ্যাডাপ্টার", + "reload": "", + "hint": "আইপি অ্যাডাপ্টার (IP Adapters) সম্পর্কিত সেটিংস" }, { - "id": 2, - "label": "Apply to model", - "localized": "মডেলের ওপর প্রয়োগ করুন", - "reload": "component-941", + "id": 0, + "label": "component-981", + "localized": "মডেলের উপর প্রয়োগ করুন", + "reload": "", "hint": "" }, { - "id": 3, - "label": "Analyze", - "localized": "বিশ্লেষণ করুন", - "reload": "btn_clip_analyze_img", + "id": 0, + "label": "btn_clip_analyze_img", + "localized": "বিশ্লেষণ", + "reload": "", "hint": "" }, { - "id": 4, - "label": "Apply changes", - "localized": "পরিবর্তনগুলো প্রয়োগ করুন", - "reload": "component-8587", - "hint": "সমস্ত পরিবর্তন প্রয়োগ করুন এবং সার্ভার রিস্টার্ট করুন" + "id": 0, + "label": "component-8740", + "localized": "পরিবর্তনগুলি প্রয়োগ করুন", + "reload": "", + "hint": "সমস্ত পরিবর্তন প্রয়োগ করুন এবং সার্ভার রিস্টার্ট করুন" }, { - "id": 5, - "label": "Apply settings", - "localized": "সেটিংস প্রয়োগ করুন", - "reload": "settings_submit", - "hint": "বর্তমান সেটিংস সংরক্ষণ করুন, সার্ভার রিস্টার্ট করার পরামর্শ দেওয়া হচ্ছে" + "id": 0, + "label": "settings_submit", + "localized": "সেটিংস প্রয়োগ করুন", + "reload": "", + "hint": "বর্তমান সেটিংস সংরক্ষণ করুন, সার্ভার রিস্টার্ট করার পরামর্শ দেওয়া হলো" }, { - "id": 6, - "label": "Analyze model", - "localized": "মডেল বিশ্লেষণ করুন", - "reload": "component-5478", + "id": 0, + "label": "component-5578", + "localized": "মডেল বিশ্লেষণ", + "reload": "", "hint": "" }, { - "id": 7, + "id": 0, "label": "All", - "localized": "All", + "localized": "সব", "reload": "", "hint": "" }, { - "id": 8, - "label": "artist", - "localized": "শিল্পী", - "reload": "", - "hint": "" - }, - { - "id": 9, + "id": 0, "label": "Alpha", "localized": "আলফা", "reload": "", "hint": "" }, { - "id": 10, + "id": 0, "label": "Advanced Options", "localized": "উন্নত বিকল্পসমূহ", "reload": "", "hint": "" }, { - "id": 11, + "id": 0, "label": "Appearance", - "localized": "চেহারা (Appearance)", + "localized": "উপস্থিতি", "reload": "", "hint": "" }, { - "id": 12, + "id": 0, "label": "Answer", "localized": "উত্তর", "reload": "", "hint": "" }, { - "id": 13, + "id": 0, "label": "Adjust start", - "localized": "অ্যাডজাস্ট শুরু", + "localized": "শুরু সমন্বয় করুন", "reload": "", - "hint": "সিগমা অ্যাডজাস্টমেন্ট শুরুর ধাপ" + "hint": "সিগমা (sigma) সমন্বয় যখন শুরু হয় সেই ধাপ" }, { - "id": 14, + "id": 0, "label": "Adjust end", - "localized": "অ্যাডজাস্ট শেষ", + "localized": "শেষ সমন্বয় করুন", "reload": "", - "hint": "সিগমা অ্যাডজাস্টমেন্ট শেষের ধাপ" + "hint": "সিগমা (sigma) সমন্বয় যখন শেষ হয় সেই ধাপ" }, { - "id": 15, + "id": 0, "label": "AutoGuidance dropout", "localized": "অটো-গাইডেন্স ড্রপআউট", "reload": "", "hint": "" }, { - "id": 16, + "id": 0, "label": "AutoGuidance layers", - "localized": "অটো-গাইডেন্স লেয়ারসমূহ", + "localized": "অটো-গাইডেন্স লেয়ার", "reload": "", "hint": "" }, { - "id": 17, + "id": 0, "label": "AutoGuidance config", - "localized": "অটো-গাইডেন্স কনফিগারেশন", + "localized": "অটো-গাইডেন্স কনফিগ", "reload": "", "hint": "" }, { - "id": 18, + "id": 0, "label": "APG momentum", - "localized": "APG মোমেন্টাম", + "localized": "এপিজি মোমেন্টাম", "reload": "", "hint": "" }, { - "id": 19, + "id": 0, "label": "APG rescale", - "localized": "APG রিস্কেল", + "localized": "এপিজি রিস্কেল", "reload": "", "hint": "" }, { - "id": 20, + "id": 0, "label": "Attention guidance", "localized": "অ্যাটেনশন গাইডেন্স", "reload": "", - "hint": "PAG (Perturbed-Attention Guidance)-এর জন্য ব্যবহৃত CFG স্কেল" + "hint": "পিএজি (PAG: Perturbed-Attention Guidance) এর সাথে ব্যবহৃত সিএফজি (CFG) স্কেল" }, { - "id": 21, + "id": 0, "label": "Adaptive scaling", "localized": "অ্যাডাপ্টিভ স্কেলিং", "reload": "", - "hint": "অ্যাটেনশন গাইডেন্স স্কেলের জন্য অ্যাডাপ্টিভ মডিফায়ার" + "hint": "অ্যাটেনশন গাইডেন্স স্কেলের জন্য অ্যাডাপ্টিভ মডিফায়ার" }, { - "id": 22, - "label": "Active IP adapters", - "localized": "সক্রিয় আইপি অ্যাডাপ্টার", + "id": 0, + "label": "Apply to hires", + "localized": "হায়ার রেসোলিউশনে প্রয়োগ করুন", "reload": "", - "hint": "সক্রিয় আইপি অ্যাডাপ্টারের সংখ্যা" + "hint": "" }, { - "id": 23, + "id": 0, + "label": "Active IP adapters", + "localized": "সক্রিয় আইপি অ্যাডাপ্টার", + "reload": "", + "hint": "সক্রিয় আইপি অ্যাডাপ্টারের সংখ্যা" + }, + { + "id": 0, "label": "Adapter", "localized": "অ্যাডাপ্টার", "reload": "", "hint": "আইপি অ্যাডাপ্টার মডেল" }, { - "id": 24, + "id": 0, "label": "Anchor settings", "localized": "অ্যাঙ্কর সেটিংস", "reload": "", "hint": "" }, { - "id": 25, + "id": 0, "label": "Alpha preset", "localized": "আলফা প্রিসেট", "reload": "", "hint": "" }, { - "id": 26, + "id": 0, "label": "Append heatmaps to results", - "localized": "ফলাফলে হিটম্যাপ যুক্ত করুন", + "localized": "ফলাফলের সাথে হিটম্যাপ যুক্ত করুন", "reload": "", "hint": "" }, { - "id": 27, + "id": 0, "label": "Auto apply", - "localized": "স্বয়ংক্রিয়ভাবে প্রয়োগ", + "localized": "স্বয়ংক্রিয়ভাবে প্রয়োগ করুন", "reload": "", "hint": "" }, { - "id": 28, - "label": "Amplify LUT", - "localized": "LUT এমপ্লিফাই করুন", - "reload": "", - "hint": "" - }, - { - "id": 29, + "id": 0, "label": "Add time info", - "localized": "সময়ের তথ্য যুক্ত করুন", + "localized": "সময়ের তথ্য যুক্ত করুন", "reload": "", "hint": "" }, { - "id": 30, + "id": 0, "label": "Add text info", - "localized": "টেক্সট তথ্য যুক্ত করুন", + "localized": "পাঠ্য তথ্য যুক্ত করুন", "reload": "", "hint": "" }, { - "id": 31, + "id": 0, "label": "Add metadata", "localized": "মেটাডেটা যুক্ত করুন", "reload": "", "hint": "" }, { - "id": 32, + "id": 0, "label": "Allowed languages", - "localized": "অনুমোদিত ভাষাসমূহ", + "localized": "অনুমোদিত ভাষা", "reload": "", "hint": "" }, { - "id": 33, + "id": 0, "label": "Allowed alphabets", - "localized": "অনুমোদিত বর্ণমালাসমূহ", + "localized": "অনুমোদিত বর্ণমালা", "reload": "", "hint": "" }, { - "id": 34, + "id": 0, "label": "Apply to prompt", - "localized": "প্রম্পটে প্রয়োগ করুন", + "localized": "প্রম্পটে প্রয়োগ করুন", "reload": "", - "hint": "উন্নত ফলাফলটি স্বয়ংক্রিয়ভাবে প্রম্পট ইনপুট বক্সে কপি করুন" + "hint": "উন্নত ফলাফলটি স্বয়ংক্রিয়ভাবে প্রম্পট ইনপুট বক্সে কপি করুন" }, { - "id": 35, + "id": 0, "label": "Auto enhance", - "localized": "স্বয়ংক্রিয় বর্ধন (Auto enhance)", + "localized": "স্বয়ংক্রিয়ভাবে উন্নত করুন", "reload": "", - "hint": "প্রতিটি ইমেজ তৈরির আগে স্বয়ংক্রিয়ভাবে প্রম্পট উন্নত করুন" + "hint": "প্রতিবার ইমেজ তৈরির আগে প্রম্পট স্বয়ংক্রিয়ভাবে উন্নত করুন" }, { - "id": 36, + "id": 0, "label": "ACI: Color to Mask", - "localized": "ACI: কালার টু মাস্ক", + "localized": "এসিআই: কালার টু মাস্ক", "reload": "", - "hint": "আপনি যে রঙটি মাস্ক এবং ইনপেইন্ট করতে চান তা নির্বাচন করুন। স্বয়ংক্রিয়ভাবে নির্বাচন করতে ইমেজের রঙের ওপর ক্লিক করুন। সঠিক ফলাফলের জন্য গ্রিন স্ক্রিনের মতো ছবি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।" + "hint": "আপনি যে রঙটি মাস্ক এবং ইনপেইন্ট করতে চান তা নির্বাচন করুন। স্বয়ংক্রিয়ভাবে নির্বাচন করতে ইমেজের রঙের উপর ক্লিক করুন।
নিখুঁত ফলাফলের জন্য গ্রিন স্ক্রিনের মতো ইমেজ ব্যবহার করার পরামর্শ দেওয়া হয়।" }, { - "id": 37, + "id": 0, "label": "ACI: Color tolerance", - "localized": "ACI: কালার টলারেন্স", + "localized": "এসিআই: কালার টলারেন্স", "reload": "", - "hint": "মাস্কে একই ধরনের রঙ অন্তর্ভুক্ত করতে টলারেন্স সামঞ্জস্য করুন। কম মান = শুধুমাত্র খুব একই ধরনের রঙ মাস্ক করবে। উচ্চ মান = একই ধরনের রঙের বিস্তৃত পরিসর মাস্ক করবে।" + "hint": "মাস্কে অনুরূপ রঙ অন্তর্ভুক্ত করার জন্য টলারেন্স সমন্বয় করুন। কম মান = শুধুমাত্র খুব অনুরূপ রঙ মাস্ক করবে। বেশি মান = আরও বিস্তৃত পরিসরের অনুরূপ রঙ মাস্ক করবে।" }, { - "id": 38, + "id": 0, "label": "ACI: Denoising strength", - "localized": "ACI: ডিনয়েসিং স্ট্রেংথ", + "localized": "এসিআই: ডিনয়েজিং স্ট্রেংথ", "reload": "", - "hint": "কাঙ্ক্ষিত ইনপেইন্ট পরিমাণ অর্জন করতে ডিনয়েসিং স্ট্রেংথ পরিবর্তন করুন।" + "hint": "ইনপেইন্টের কাঙ্ক্ষিত পরিমাণ অর্জন করতে ডিনয়েজিং স্ট্রেংথ পরিবর্তন করুন।" }, { - "id": 39, + "id": 0, "label": "ACI: Mask dilate", - "localized": "ACI: মাস্ক ডাইলেট", + "localized": "এসিআই: মাস্ক ডাইলেট", "reload": "", "hint": "" }, { - "id": 40, + "id": 0, "label": "ACI: Mask erode", - "localized": "ACI: মাস্ক ইরোড", + "localized": "এসিআই: মাস্ক ইরোড", "reload": "", - "hint": "মাস্কে একটি ইনসাইড অফসেট প্রয়োগ করতে প্যাডিং সামঞ্জস্য করুন। (প্রান্তের অবশিষ্টাংশ সরাতে প্রস্তাবিত মান = ২)" + "hint": "মাস্কের ভিতরে অফসেট প্রয়োগ করতে প্যাডিং সমন্বয় করুন। (প্রান্তের অবশিষ্ট অংশগুলি সরাতে প্রস্তাবিত মান = ২)" }, { - "id": 41, + "id": 0, "label": "ACI: Mask blur", - "localized": "ACI: মাস্ক ব্লার", + "localized": "এসিআই: মাস্ক ব্লার", "reload": "", - "hint": "ইমেজ এবং ইনপেইন্ট করা এলাকার মধ্যে একটি মসৃণ রূপান্তর প্রয়োগ করতে ব্লার সামঞ্জস্য করুন। (শার্পনেসের জন্য প্রস্তাবিত মান = ০)" + "hint": "ইমেজ এবং ইনপেইন্ট করা অঞ্চলের মধ্যে একটি মসৃণ রূপান্তর তৈরি করতে ব্লার সমন্বয় করুন। (স্পষ্টতার জন্য প্রস্তাবিত মান = ০)" }, { - "id": 42, + "id": 0, "label": "Adaptive restore", "localized": "অ্যাডাপ্টিভ রিস্টোর", "reload": "", "hint": "" }, { - "id": 43, + "id": 0, "label": "Apply noise", - "localized": "নয়েজ প্রয়োগ করুন", + "localized": "নয়েজ প্রয়োগ করুন", "reload": "", "hint": "" }, { - "id": 44, + "id": 0, "label": "Auto min score", "localized": "অটো মিনিমাম স্কোর", "reload": "", "hint": "" }, { - "id": 45, + "id": 0, "label": "Auto-segment", - "localized": "অটো-সেগমেন্ট", + "localized": "স্বয়ংক্রিয় সেগমেন্টেশন", "reload": "", "hint": "" }, { - "id": 46, + "id": 0, "label": "Auto-mask", - "localized": "অটো-মাস্ক", + "localized": "স্বয়ংক্রিয় মাস্কিং", "reload": "", "hint": "" }, { - "id": 47, + "id": 0, "label": "Active", - "localized": "সক্রিয়", + "localized": "সক্রিয়", "reload": "", "hint": "" }, { - "id": 48, + "id": 0, "label": "Attention", "localized": "অ্যাটেনশন", "reload": "", "hint": "" }, { - "id": 49, + "id": 0, "label": "Adain", - "localized": "Adain", + "localized": "অ্যাডেইন (Adain)", "reload": "", "hint": "" }, { - "id": 50, + "id": 0, "label": "Attention Adain", - "localized": "অ্যাটেনশন Adain", + "localized": "অ্যাটেনশন অ্যাডেইন", "reload": "", "hint": "" }, { - "id": 51, + "id": 0, "label": "Apply filter", - "localized": "ফিল্টার প্রয়োগ করুন", + "localized": "ফিল্টার প্রয়োগ করুন", "reload": "", "hint": "" }, { - "id": 52, + "id": 0, "label": "Alpha matting", "localized": "আলফা ম্যাটিং", "reload": "", "hint": "" }, { - "id": 53, + "id": 0, "label": "Append Caption Files", - "localized": "ক্যাপশন ফাইল যুক্ত করুন", + "localized": "ক্যাপশন ফাইল সংযুক্ত করুন", "reload": "", - "hint": "বিদ্যমান ক্যাপশন ফাইলগুলো ওভাররাইট করার পরিবর্তে সেগুলোর শেষে যুক্ত করুন। ইতিমধ্যে ক্যাপশন আছে এমন ছবিতে অতিরিক্ত বর্ণনা বা ট্যাগ যোগ করার জন্য দরকারী।" + "hint": "বিদ্যমান ক্যাপশন ফাইলগুলি ওভাররাইট না করে তাতে যুক্ত করুন।
ইতিমধ্যে ক্যাপশন থাকা ইমেজে অতিরিক্ত বিবরণ বা ট্যাগ যোগ করার জন্য দরকারী।" }, { - "id": 54, + "id": 0, "label": "a1111", "localized": "a1111", "reload": "", "hint": "" }, { - "id": 55, + "id": 0, "label": "Autocast", - "localized": "অটো-কাস্ট", + "localized": "অটোকাস্ট", "reload": "", - "hint": "রানটাইমের সময় স্বয়ংক্রিয়ভাবে প্রিসিশন নির্ধারণ করুন" + "hint": "রানটাইমের সময় স্বয়ংক্রিয়ভাবে প্রিসিশন নির্ধারণ করুন" }, { - "id": 56, + "id": 0, "label": "Auto", "localized": "অটো", "reload": "", "hint": "" }, { - "id": 57, + "id": 0, + "label": "Automatic server status monitor rate", + "localized": "স্বয়ংক্রিয় সার্ভার স্ট্যাটাস মনিটর রেট", + "reload": "", + "hint": "" + }, + { + "id": 0, + "label": "Automatic server memory monitor rate", + "localized": "স্বয়ংক্রিয় সার্ভার মেমরি মনিটর রেট", + "reload": "", + "hint": "" + }, + { + "id": 0, + "label": "API base rate limit rate", + "localized": "এপিআই বেস রেট লিমিট রেট", + "reload": "", + "hint": "" + }, + { + "id": 0, "label": "accuracy", "localized": "নির্ভুলতা (Accuracy)", "reload": "", "hint": "" }, { - "id": 58, + "id": 0, "label": "atiadlxx (AMD only)", "localized": "atiadlxx (শুধুমাত্র AMD)", "reload": "", "hint": "" }, { - "id": 59, + "id": 0, "label": "aot_ts_nvfuser", "localized": "aot_ts_nvfuser", "reload": "", "hint": "" }, { - "id": 60, + "id": 0, "label": "Additional image browser folders", - "localized": "অতিরিক্ত ইমেজ ব্রাউজার ফোল্ডারসমূহ", + "localized": "অতিরিক্ত ইমেজ ব্রাউজার ফোল্ডার", "reload": "", "hint": "" }, { - "id": 61, + "id": 0, "label": "Add system information to metadata", - "localized": "মেটাডেটায় সিস্টেম তথ্য যোগ করুন", + "localized": "মেটাডেটাতে সিস্টেম তথ্য যুক্ত করুন", "reload": "", "hint": "" }, { - "id": 62, + "id": 0, "label": "Autolaunch browser upon startup", - "localized": "স্টার্টআপের সময় স্বয়ংক্রিয়ভাবে ব্রাউজার চালু করুন", + "localized": "স্টার্টআপে স্বয়ংক্রিয়ভাবে ব্রাউজার চালু করুন", "reload": "", "hint": "" }, { - "id": 63, + "id": 0, "label": "Allowed aspect ratios", "localized": "অনুমোদিত অ্যাসপেক্ট রেশিও", "reload": "", "hint": "" }, { - "id": 64, + "id": 0, "label": "Approximate", - "localized": "আন্দাজ করা (Approximate)", + "localized": "আনুমানিক", "reload": "", - "hint": "স্বল্পমূল্যের নিউরাল নেটওয়ার্ক অ্যাপ্রক্সিমেশন। VAE-এর তুলনায় খুব দ্রুত, কিন্তু ৪ গুণ ছোট রেজোলিউশন এবং নিম্ন মানের ছবি তৈরি করে।" + "hint": "সাশ্রয়ী নিউরাল নেটওয়ার্ক অ্যাপ্রক্সিমেশন। ভিএই (VAE) এর তুলনায় খুব দ্রুত, কিন্তু ৪ গুণ ছোট অনুভূমিক/উল্লম্ব রেজোলিউশন এবং নিম্নমানের ছবি তৈরি করে" }, { - "id": 65, + "id": 0, "label": "Additional postprocessing operations", - "localized": "অতিরিক্ত পোস্ট-প্রসেসিং অপারেশন", + "localized": "অতিরিক্ত পোস্ট-প্রসেসিং অপারেশনসমূহ", "reload": "", "hint": "" }, { - "id": 66, + "id": 0, "label": "Apply color correction", - "localized": "কালার কারেকশন প্রয়োগ করুন", + "localized": "কালার কারেকশন প্রয়োগ করুন", "reload": "", "hint": "" }, { - "id": 67, + "id": 0, "label": "Apply mask as overlay", - "localized": "ওভারলে হিসেবে মাস্ক প্রয়োগ করুন", + "localized": "ওভারলে হিসেবে মাস্ক প্রয়োগ করুন", "reload": "", "hint": "" }, { - "id": 68, + "id": 0, "label": "Apply sRGB linearization", - "localized": "sRGB লিনিয়ারাইজেশন প্রয়োগ করুন", + "localized": "sRGB লিনিয়ারাইজেশন প্রয়োগ করুন", "reload": "", "hint": "" }, { - "id": 69, + "id": 0, "label": "Available networks", - "localized": "উপলব্ধ নেটওয়ার্কসমূহ", + "localized": "উপলব্ধ নেটওয়ার্কসমূহ", "reload": "", "hint": "" }, { - "id": 70, + "id": 0, "label": "Auto-convert SD15 embeddings to SDXL", - "localized": "SD15 এমবেডিং স্বয়ংক্রিয়ভাবে SDXL-এ রূপান্তর করুন", + "localized": "SD15 এমবেডিংগুলো স্বয়ংক্রিয়ভাবে SDXL-এ রূপান্তর করুন", "reload": "", "hint": "" }, { - "id": 71, + "id": 0, "label": "alias", - "localized": "alias", + "localized": "অ্যালিয়াস", "reload": "", "hint": "" }, { - "id": 72, + "id": 0, "label": "Attention query chunk size", - "localized": "Attention query চাঙ্ক সাইজ", + "localized": "অ্যাটেনশন কুয়েরি চাঙ্ক সাইজ", "reload": "", "hint": "" }, { - "id": 73, + "id": 0, "label": "Attention kv chunk size", - "localized": "Attention kv চাঙ্ক সাইজ", + "localized": "অ্যাটেনশন কেভি চাঙ্ক সাইজ", "reload": "", "hint": "" }, { - "id": 74, + "id": 0, "label": "Attention chunking threshold", - "localized": "Attention চাঙ্কিং থ্রেশহোল্ড", + "localized": "অ্যাটেনশন চাঙ্কিং থ্রেশহোল্ড", "reload": "", "hint": "" }, { - "id": 75, + "id": 0, "label": "Attempt VAE roll back for NaN values", - "localized": "NaN মানের জন্য VAE রোল ব্যাক করার চেষ্টা করুন", + "localized": "NaN মানগুলোর জন্য ভিএই (VAE) রোল ব্যাক করার চেষ্টা করুন", "reload": "", - "hint": "Torch 2.1 এবং NaN চেক সক্ষম থাকা প্রয়োজন" + "hint": "টর্চ (Torch) ২.১ প্রয়োজন এবং NaN চেক চালু থাকতে হবে" }, { - "id": 76, + "id": 0, "label": "Add extended info to filename when saving grid", - "localized": "গ্রিড সেভ করার সময় ফাইলে বর্ধিত তথ্য যোগ করুন", + "localized": "গ্রিড সেভ করার সময় ফাইলের নামে অতিরিক্ত তথ্য যোগ করুন", "reload": "", "hint": "" }, { - "id": 77, + "id": 0, "label": "Add LoRA to prompt", "localized": "প্রম্পটে LoRA যোগ করুন", "reload": "", "hint": "" }, { - "id": 78, + "id": 0, "label": "Alpha Ratio", - "localized": "আলফা রেশিও", + "localized": "আলফা অনুপাত", "reload": "", "hint": "" }, { - "id": 79, + "id": 0, "label": "ALPHA Block Weight Preset", - "localized": "আলফা ব্লক ওয়েট প্রিসেট", + "localized": "আলফা ব্লক ওয়েট প্রিসেট", "reload": "", "hint": "" }, { - "id": 80, + "id": 0, "label": "Automatically determine rank", - "localized": "স্বয়ংক্রিয়ভাবে র্যাঙ্ক নির্ধারণ করুন", + "localized": "স্বয়ংক্রিয়ভাবে র‍্যাঙ্ক নির্ধারণ করুন", "reload": "", "hint": "" }, { - "id": 81, + "id": 0, "label": "Autorank ratio", - "localized": "অটো-র্যাঙ্ক রেশিও", + "localized": "অটোর‍্যাঙ্ক অনুপাত", "reload": "", "hint": "" }, { - "id": 82, + "id": 0, "label": "Advanced guidance params", - "localized": "উন্নত গাইডেন্স প্যারামিটারসমূহ", + "localized": "উন্নত গাইডেন্স প্যারামিটার", "reload": "", "hint": "" }, { - "id": 83, + "id": 0, "label": "Adapter 1", "localized": "অ্যাডাপ্টার ১", "reload": "", "hint": "" }, { - "id": 84, + "id": 0, "label": "Adapter 2", "localized": "অ্যাডাপ্টার ২", "reload": "", "hint": "" }, { - "id": 85, + "id": 0, "label": "Adapter 3", "localized": "অ্যাডাপ্টার ৩", "reload": "", "hint": "" }, { - "id": 86, + "id": 0, "label": "Adapter 4", "localized": "অ্যাডাপ্টার ৪", "reload": "", "hint": "" }, { - "id": 87, + "id": 0, "label": "Audio", "localized": "অডিও", "reload": "", "hint": "" - }, - { - "id": 88, - "label": "Advanced Options", - "localized": "উন্নত বিকল্পসমূহ", - "reload": "", - "hint": "" - }, - { - "id": 89, - "label": "Advanced Options", - "localized": "উন্নত বিকল্পসমূহ", - "reload": "", - "hint": "" - }, - { - "id": 90, - "label": "Advanced Options", - "localized": "উন্নত বিকল্পসমূহ", - "reload": "", - "hint": "" } ], "b": [ { "id": 0, "label": "Batch", - "localized": "ব্যাচ (Batch)", + "localized": "ব্যাচ", "reload": "", - "hint": "ব্যাচ প্রসেসিং সেটিংস" + "hint": "ব্যাচ প্রসেসিং বা প্রক্রিয়াকরণের সেটিংস" }, { - "id": 1, + "id": 0, "label": "Batch Caption", "localized": "ব্যাচ ক্যাপশন", "reload": "", "hint": "" }, { - "id": 2, + "id": 0, "label": "Batch Tag", "localized": "ব্যাচ ট্যাগ", "reload": "", "hint": "" }, { - "id": 3, + "id": 0, "label": "Benchmark", - "localized": "বেঞ্চমার্ক (Benchmark)", + "localized": "বেঞ্চমার্ক", "reload": "", "hint": "বেঞ্চমার্ক রান করুন" }, { - "id": 4, + "id": 0, "label": "Backend Settings", "localized": "ব্যাকএন্ড সেটিংস", "reload": "", "hint": "কম্পিউট ব্যাকএন্ড সম্পর্কিত সেটিংস: torch, onnx এবং olive" }, { - "id": 5, - "label": "body", - "localized": "body", - "reload": "", - "hint": "" - }, - { - "id": 6, + "id": 0, "label": "Beta", - "localized": "বিটা (Beta)", + "localized": "বিটা", "reload": "", "hint": "" }, { - "id": 7, + "id": 0, "label": "Balanced Offload", "localized": "ব্যালেন্সড অফলোড", "reload": "", "hint": "" }, { - "id": 8, + "id": 0, "label": "BitsAndBytes", - "localized": "BitsAndBytes", + "localized": "বিটসঅ্যান্ডবাইটস্‌", "reload": "", "hint": "" }, { - "id": 9, + "id": 0, "label": "Batch count", - "localized": "ব্যাচ সংখ্যা", + "localized": "ব্যাচ কাউন্ট", "reload": "", - "hint": "কতগুলো ব্যাচে ছবি তৈরি করা হবে (এটি জেনারেশন পারফরম্যান্স বা VRAM ব্যবহারের ওপর প্রভাব ফেলে না)" + "hint": "কতগুলো ইমেজের ব্যাচ তৈরি করতে হবে (এটি জেনারেশন পারফরম্যান্স বা VRAM ব্যবহারের ওপর কোনো প্রভাব ফেলে না)" }, { - "id": 10, + "id": 0, "label": "Batch size", "localized": "ব্যাচ সাইজ", "reload": "", - "hint": "একটি সিঙ্গেল ব্যাচে কতগুলো ছবি তৈরি করা হবে (এটি VRAM ব্যবহার বাড়িয়ে জেনারেশন পারফরম্যান্স বৃদ্ধি করে)" + "hint": "একটি ব্যাচে কতগুলো ইমেজ তৈরি করতে হবে (এটি উচ্চ VRAM ব্যবহারের বিনিময়ে জেনারেশন পারফরম্যান্স বাড়ায়)" }, { - "id": 11, + "id": 0, "label": "Beta schedule", "localized": "বিটা শিডিউল", "reload": "", - "hint": "বিটা (প্রতি ধাপে নয়েজের শক্তি) কীভাবে বাড়বে তা নির্ধারণ করে। অপশনসমূহ:
- default: মডেলের ডিফল্ট
- linear: প্রতি ধাপে সমানভাবে নয়েজ কমায়
- scaled: লিনিয়ারের স্কোয়ারড সংস্করণ, শুধুমাত্র Stable Diffusion-এ ব্যবহৃত হয়
- cosine: আরও মসৃণ হ্রাস, প্রায়ই কম ধাপে ভালো ফলাফল দেয়
- sigmoid: তীব্র পরিবর্তন, পরীক্ষামূলক" + "hint": "বিটা (প্রতি ধাপে নয়েজ বা নয়েজ শক্তি) কীভাবে বৃদ্ধি পায় তা নির্ধারণ করে। বিকল্পসমূহ:
- default: মডেলের ডিফল্ট
- linear: প্রতি ধাপে নয়েজ সমানভাবে হ্রাস করে
- scaled: লিনিয়ারের বর্গ সংস্করণ, শুধুমাত্র স্টেবল ডিফিউশন (Stable Diffusion) দ্বারা ব্যবহৃত হয়
- cosine: মসৃণ হ্রাস, কম ধাপে প্রায়শই ভালো ফলাফল দেয়
- sigmoid: তীক্ষ্ণ পরিবর্তন, পরীক্ষামূলক" }, { - "id": 12, + "id": 0, "label": "Base shift", "localized": "বেস শিফট", "reload": "", - "hint": "ডাইনামিক শিফটিং ব্যবহারের সময় কম রেজোলিউশনের জন্য সর্বনিম্ন শিফট ভ্যালু।" + "hint": "ডায়নামিক শিফটিং ব্যবহারের সময় কম রেজোলিউশনের জন্য সর্বনিম্ন শিফট মান।" }, { - "id": 13, + "id": 0, "label": "Brightness", - "localized": "উজ্জ্বলতা", + "localized": "ব্রাইটনেস", "reload": "", - "hint": "" + "hint": "সামগ্রিক ইমেজের উজ্জ্বলতা সামঞ্জস্য করে।
পজিটিভ মান ইমেজকে উজ্জ্বল করে, নেগেটিভ মান অন্ধকার করে।

লিনিয়ার স্পেসে সমস্ত পিক্সেল জুড়ে সমানভাবে প্রয়োগ করা হয়।" }, { - "id": 14, + "id": 0, "label": "Block", "localized": "ব্লক", "reload": "", "hint": "" }, { - "id": 15, + "id": 0, "label": "Block size", "localized": "ব্লক সাইজ", "reload": "", "hint": "" }, { - "id": 16, + "id": 0, "label": "Banned words", - "localized": "নিষিদ্ধ শব্দসমূহ", + "localized": "নিষিদ্ধ শব্দ", "reload": "", "hint": "" }, { - "id": 17, + "id": 0, "label": "Blur", - "localized": "ব্লার (Blur)", + "localized": "ব্লার", "reload": "", "hint": "" }, { - "id": 18, + "id": 0, "label": "Batch input directory", "localized": "ব্যাচ ইনপুট ডিরেক্টরি", "reload": "", "hint": "" }, { - "id": 19, + "id": 0, "label": "Batch output directory", "localized": "ব্যাচ আউটপুট ডিরেক্টরি", "reload": "", "hint": "" }, { - "id": 20, + "id": 0, "label": "Batch mask directory", "localized": "ব্যাচ মাস্ক ডিরেক্টরি", "reload": "", "hint": "" }, { - "id": 21, + "id": 0, "label": "Background threshold", "localized": "ব্যাকগ্রাউন্ড থ্রেশহোল্ড", "reload": "", "hint": "" }, { - "id": 22, + "id": 0, + "label": "Body", + "localized": "বডি", + "reload": "", + "hint": "" + }, + { + "id": 0, "label": "Boost", - "localized": "বুস্ট (Boost)", + "localized": "বুস্ট", "reload": "", "hint": "" }, { - "id": 23, + "id": 0, "label": "Base", - "localized": "বেস (Base)", + "localized": "বেস", "reload": "", - "hint": "ইমেজ জেনারেশন চালানোর জন্য ব্যবহৃত মূল সেটিংস" + "hint": "ইমেজ জেনারেশনের জন্য ব্যবহৃত মূল সেটিংস" }, { - "id": 24, + "id": 0, "label": "Blend strength", - "localized": "ব্লেন্ড শক্তি", + "localized": "ব্লেন্ড স্ট্রেংথ", "reload": "", "hint": "" }, { - "id": 25, + "id": 0, "label": "Base model", "localized": "বেস মডেল", "reload": "", - "hint": "সব অপারেশনের জন্য ব্যবহৃত প্রধান মডেল" + "hint": "সমস্ত অপারেশনের জন্য ব্যবহৃত প্রধান মডেল" }, { - "id": 26, + "id": 0, "label": "Backend", "localized": "ব্যাকএন্ড", "reload": "", "hint": "" }, { - "id": 27, + "id": 0, "label": "Benchmark steps", "localized": "বেঞ্চমার্ক স্টেপস", "reload": "", "hint": "" }, { - "id": 28, + "id": 0, "label": "Benchmark level", "localized": "বেঞ্চমার্ক লেভেল", "reload": "", "hint": "" }, { - "id": 29, - "label": "balanced", - "localized": "ব্যালেন্সড", + "id": 0, + "label": "Benchmark Image width", + "localized": "বেঞ্চমার্ক ইমেজ প্রস্থ", "reload": "", "hint": "" }, { - "id": 30, + "id": 0, + "label": "Benchmark Image height", + "localized": "বেঞ্চমার্ক ইমেজ উচ্চতা", + "reload": "", + "hint": "" + }, + { + "id": 0, + "label": "balanced", + "localized": "balanced", + "reload": "", + "hint": "" + }, + { + "id": 0, "label": "block_level", "localized": "block_level", "reload": "", "hint": "" }, { - "id": 31, + "id": 0, "label": "Backend storage", "localized": "ব্যাকএন্ড স্টোরেজ", "reload": "", "hint": "" }, { - "id": 32, + "id": 0, "label": "BF16", "localized": "BF16", "reload": "", - "hint": "হিসাবনিকেশের জন্য পরিবর্তিত ১৬-বিট ফ্লোটিং পয়েন্ট প্রিসিশন ব্যবহার করুন" + "hint": "গণনার জন্য পরিবর্তিত ১৬-বিট ফ্লোটিং পয়েন্ট প্রিসিশন ব্যবহার করুন" }, { - "id": 33, + "id": 0, "label": "Batch matrix-matrix", "localized": "ব্যাচ ম্যাট্রিক্স-ম্যাট্রিক্স", "reload": "", - "hint": "অ্যাটেনশনের জন্য স্ট্যান্ডার্ড ব্যাচড ম্যাট্রিক্স মাল্টিপ্লিকেশন। নির্ভরযোগ্য কিন্তু VRAM-সাশ্রয়ী নয়।" + "hint": "অ্যাটেনশনের জন্য স্ট্যান্ডার্ড ব্যাচড ম্যাট্রিক্স গুণন। নির্ভরযোগ্য কিন্তু VRAM-দক্ষ নয়।" }, { - "id": 34, + "id": 0, "label": "BCFHW", "localized": "BCFHW", "reload": "", "hint": "" }, { - "id": 35, + "id": 0, "label": "BFCHW", "localized": "BFCHW", "reload": "", "hint": "" }, { - "id": 36, + "id": 0, "label": "BCHW", "localized": "BCHW", "reload": "", "hint": "" }, { - "id": 37, + "id": 0, "label": "Batch mode uses sequential seeds", - "localized": "ব্যাচ মোড পর্যায়ক্রমিক সিড ব্যবহার করবে", + "localized": "ব্যাচ মোড সিকোয়েন্সিয়াল সিড ব্যবহার করে", "reload": "", "hint": "" }, { - "id": 38, + "id": 0, "label": "Batch uses original name", - "localized": "ব্যাচ মূল নাম ব্যবহার করবে", + "localized": "ব্যাচ আসল নাম ব্যবহার করে", "reload": "", "hint": "" }, { - "id": 39, + "id": 0, "label": "Base images folder", "localized": "বেস ইমেজ ফোল্ডার", "reload": "", "hint": "" }, { - "id": 40, + "id": 0, "label": "Base grids folder", "localized": "বেস গ্রিড ফোল্ডার", "reload": "", "hint": "" }, { - "id": 41, + "id": 0, "label": "Build info on first access", "localized": "প্রথম অ্যাক্সেসে বিল্ড ইনফো", "reload": "", - "hint": "সার্ভার স্টার্টআপের সময় EN পেজ বিল্ড করা থেকে বিরত রাখে এবং পরিবর্তে অনুরোধ করা হলে বিল্ড করে" + "hint": "সার্ভার স্টার্টআপে EN পেজ তৈরি করা থেকে সার্ভারকে বিরত রাখে এবং অনুরোধ করা হলে তা তৈরি করে" }, { - "id": 42, + "id": 0, "label": "Beta Ratio", - "localized": "বিটা রেশিও", + "localized": "বিটা অনুপাত", "reload": "", "hint": "" }, { - "id": 43, + "id": 0, "label": "BETA Block Weight Preset", "localized": "বিটা ব্লক ওয়েট প্রিসেট", "reload": "", "hint": "" }, { - "id": 44, + "id": 0, "label": "Base model type", "localized": "বেস মডেলের ধরন", "reload": "", @@ -1304,1465 +1339,1542 @@ ], "c": [ { - "id": 6, + "id": 0, "label": "Caption", - "localized": "ক্যাপশন (Caption)", + "localized": "ক্যাপশন", "reload": "", - "hint": "বিদ্যমান ছবিগুলো বিশ্লেষণ করুন এবং টেক্সট বর্ণনা তৈরি করুন" + "hint": "বিদ্যমান চিত্রগুলি বিশ্লেষণ করুন এবং পাঠ্য বিবরণ তৈরি করুন" }, { "id": 1, "label": "Contributors", - "localized": "অবদানকারী", - "reload": "", - "hint": "" - }, - { - "id": 11, - "label": "Clear", - "localized": "পরিষ্কার করুন", - "reload": "", - "hint": "প্রম্পটগুলো মুছে ফেলুন" - }, - { - "id": 4, - "label": "Check status", - "localized": "অবস্থা যাচাই করুন", + "localized": "অবদানকারীরা", "reload": "", "hint": "" }, { "id": 2, + "label": "Corrections", + "localized": "সংশোধন", + "reload": "", + "hint": "জেনারেশন প্রক্রিয়া চলাকালীন ছবির রঙ/শার্পনেস/ব্রাইটনেস সংশোধন নিয়ন্ত্রণ করুন" + }, + { + "id": 3, + "label": "Clear", + "localized": "মুছুন", + "reload": "", + "hint": "প্রম্পটগুলি মুছুন" + }, + { + "id": 4, + "label": "Check status", + "localized": "স্থিতি পরীক্ষা করুন", + "reload": "", + "hint": "" + }, + { + "id": 5, + "label": "Copy", + "localized": "অনুলিপি", + "reload": "", + "hint": "" + }, + { + "id": 6, "label": "Composite", "localized": "কম্পোজিট", "reload": "", "hint": "" }, { - "id": 14, + "id": 7, "label": "Control", - "localized": "নিয়ন্ত্রণ (Control)", + "localized": "নিয়ন্ত্রণ", "reload": "", - "hint": "পূর্ণ নির্দেশনার সাথে ছবি তৈরি করুন" + "hint": "সম্পূর্ণ নির্দেশনার সাথে ছবি তৈরি করুন" }, { - "id": 3, + "id": 8, "label": "ControlNet", - "localized": "কন্ট্রোল-নেট (ControlNet)", + "localized": "কন্ট্রোলনেট", "reload": "", - "hint": "কন্ট্রোল-নেট একটি উন্নত নির্দেশনা মডেল" + "hint": "কন্ট্রোলনেট একটি উন্নত নির্দেশনামূলক মডেল" }, { - "id": 16, + "id": 9, "label": "Controls", "localized": "নিয়ন্ত্রণসমূহ", "reload": "", "hint": "" }, { - "id": 7, + "id": 10, "label": "CaptionCaption", - "localized": "ক্যাপশন-ক্যাপশন", + "localized": "ক্যাপশনক্যাপশন", "reload": "", "hint": "" }, { - "id": 5, + "id": 11, "label": "Console", "localized": "কনসোল", "reload": "", "hint": "" }, { - "id": 20, + "id": 12, "label": "Check for updates", - "localized": "আপডেট যাচাই করুন", + "localized": "আপডেট চেক করুন", "reload": "", "hint": "" }, { - "id": 8, + "id": 13, "label": "Change log", "localized": "পরিবর্তন লগ", "reload": "", "hint": "" }, { - "id": 9, + "id": 14, "label": "Compute Settings", "localized": "কম্পিউট সেটিংস", "reload": "", - "hint": "কম্পিউট প্রিসিশন, ক্রস অ্যাটেনশন এবং কম্পিউটিং প্ল্যাটফর্মের অপ্টিমাইজেশন সংক্রান্ত সেটিংস" + "hint": "কম্পিউট প্রিসিশন, ক্রস অ্যাটেনশন এবং কম্পিউটিং প্ল্যাটফর্মের অপ্টিমাইজেশনের সাথে সম্পর্কিত সেটিংস" }, { - "id": 10, + "id": 15, "label": "Current", "localized": "বর্তমান", "reload": "", - "hint": "বর্তমানে লোড করা মডেলের ভিতরের মডিউলগুলো বিশ্লেষণ করুন" + "hint": "বর্তমানে লোড করা মডেলের ভিতরের মডিউলগুলি বিশ্লেষণ করুন" }, { - "id": 12, + "id": 16, "label": "CivitAI", - "localized": "সিভিট-এআই (CivitAI)", + "localized": "সিভিটএআই", "reload": "", - "hint": "CivitAI থেকে মডেল খুঁজুন এবং ডাউনলোড করুন" + "hint": "সিভিটএআই (CivitAI) থেকে মডেলগুলি অনুসন্ধান এবং ডাউনলোড করুন" }, { - "id": 13, + "id": 17, "label": "Calculate missing hashes", "localized": "অনুপস্থিত হ্যাশ গণনা করুন", "reload": "", "hint": "" }, { - "id": 15, + "id": 18, "label": "Community", "localized": "কমিউনিটি", "reload": "", "hint": "" }, { - "id": 17, + "id": 19, "label": "Cloud", "localized": "ক্লাউড", "reload": "", "hint": "" }, { - "id": 18, + "id": 20, "label": "Close", "localized": "বন্ধ করুন", "reload": "", "hint": "" }, { - "id": 19, + "id": 21, "label": "Change model", "localized": "মডেল পরিবর্তন করুন", "reload": "", "hint": "" }, { - "id": 21, + "id": 22, "label": "Change refiner", "localized": "রিফাইনার পরিবর্তন করুন", "reload": "", "hint": "" }, { - "id": 22, + "id": 23, "label": "Change VAE", - "localized": "VAE পরিবর্তন করুন", + "localized": "ভিএই (VAE) পরিবর্তন করুন", "reload": "", "hint": "" }, { - "id": 23, + "id": 24, + "label": "Change UNet", + "localized": "ইউনেট (UNet) পরিবর্তন করুন", + "reload": "", + "hint": "" + }, + { + "id": 25, "label": "Change reference", "localized": "রেফারেন্স পরিবর্তন করুন", "reload": "", "hint": "" }, { - "id": 24, - "label": "Corrections", - "localized": "সংশোধনী", + "id": 26, + "label": "Color Grading", + "localized": "কালার গ্রেডিং", "reload": "", - "hint": "জেনারেট প্রক্রিয়া চলাকালীন ছবির রঙ/শার্পেন/ব্রাইটনেস সংশোধন নিয়ন্ত্রণ করুন" + "hint": "জেনারেশন-পরবর্তী রঙের সমন্বয়, যা প্রতিটি ছবির জন্য জেনারেশনের পরে এবং মাস্ক ওভারলে-এর আগে প্রয়োগ করা হয়।" }, { - "id": 25, + "id": 27, "label": "Control Methods", "localized": "নিয়ন্ত্রণ পদ্ধতি", "reload": "", "hint": "" }, { - "id": 26, + "id": 28, "label": "Control Media", - "localized": "নিয়ন্ত্রণ মিডিয়া", + "localized": "কন্ট্রোল মিডিয়া", "reload": "", - "hint": "নিয়ন্ত্রণ প্রক্রিয়াকরণের জন্য আলাদা ইনিশিয়ালাইজেশন ইমেজ হিসাবে ইনপুট ইমেজ যোগ করুন" + "hint": "কন্ট্রোল প্রসেসিংয়ের জন্য ইনপুট ছবিকে আলাদা ইনিশিয়ালাইজেশন ছবি হিসেবে যোগ করুন" }, { - "id": 27, - "label": "ChronoEdit", - "localized": "ক্রোনো-এডিট", + "id": 29, + "label": "Create Video", + "localized": "ভিডিও তৈরি করুন", "reload": "", "hint": "" }, { - "id": 28, + "id": 30, + "label": "ChronoEdit", + "localized": "ক্রোনোএডিট", + "reload": "", + "hint": "" + }, + { + "id": 31, "label": "Cross Attention", "localized": "ক্রস অ্যাটেনশন", "reload": "", "hint": "" }, { - "id": 29, + "id": 32, "label": "CLiP Skip", - "localized": "ক্লিপ স্কিপ (CLIP Skip)", + "localized": "ক্লিপ স্কিপ", "reload": "", - "hint": "CLIP মডেলের জন্য আর্লি স্টপিং প্যারামিটার; ১ মানে স্বাভাবিকের মতো শেষ লেয়ারে থামা, ২ মানে শেষটির আগের লেয়ারে থামা, ইত্যাদি" + "hint": "ক্লিপ (CLIP) মডেলের জন্য আর্লি স্টপিং প্যারামিটার; ১ মানে সাধারণত শেষ লেয়ারে থামবে, ২ মানে পেনাল্টিমেট লেয়ারে থামবে ইত্যাদি।" }, { - "id": 30, + "id": 33, "label": "Cache-DiT", "localized": "ক্যাশ-ডিআইটি (Cache-DiT)", "reload": "", "hint": "" }, { - "id": 31, + "id": 34, "label": "CFG-Zero", "localized": "সিএফজি-জিরো (CFG-Zero)", "reload": "", "hint": "" }, { - "id": 32, + "id": 35, "label": "Cache folders", "localized": "ক্যাশ ফোল্ডার", "reload": "", "hint": "" }, { - "id": 33, + "id": 36, "label": "Custom model loader", "localized": "কাস্টম মডেল লোডার", "reload": "", "hint": "" }, { - "id": 34, + "id": 37, "label": "Client log", "localized": "ক্লায়েন্ট লগ", "reload": "", "hint": "" }, { - "id": 35, + "id": 38, "label": "CLIP Analysis", "localized": "ক্লিপ বিশ্লেষণ", "reload": "", "hint": "" }, - { - "id": 36, - "label": "Context", - "localized": "কনটেক্সট (Context)", - "reload": "", - "hint": "" - }, - { - "id": 37, - "label": "Correction mode", - "localized": "সংশোধনী মোড", - "reload": "", - "hint": "" - }, - { - "id": 38, - "label": "Color", - "localized": "রঙ", - "reload": "", - "hint": "" - }, { "id": 39, - "label": "Center", - "localized": "কেন্দ্র", + "label": "Context", + "localized": "কনটেক্সট", "reload": "", "hint": "" }, { "id": 40, - "label": "Color grading", - "localized": "কালার গ্রেডিং", + "label": "Contrast", + "localized": "কনট্রাস্ট", + "reload": "", + "hint": "আলো এবং অন্ধকার এলাকার মধ্যে পার্থক্য সামঞ্জস্য করে। পজিটিভ মান কনট্রাস্ট বাড়ায়, যা অন্ধকারকে আরও অন্ধকার এবং আলোকে আরও উজ্জ্বল করে। নেগেটিভ মান টোনাল পরিসরকে আরও সমান দেখায়।" + }, + { + "id": 41, + "label": "Color temp", + "localized": "কালার টেম্প", + "reload": "", + "hint": "কেলভিনে রঙের তাপমাত্রা পরিবর্তন করে। কম মান (যেমন, ২০০০কে) উষ্ণ, অ্যাম্বার টোন তৈরি করে। উচ্চ মান (যেমন, ১২০০০কে) শীতল, নীলাভ টোন তৈরি করে। ডিফল্ট ৬৫০০কে হলো নিরপেক্ষ দিনের আলো।" + }, + { + "id": 42, + "label": "CLAHE clip", + "localized": "ক্লাহ (CLAHE) ক্লিপ", + "reload": "", + "hint": "কনট্রাস্ট লিমিটেড অ্যাডাপ্টিভ হিস্টোগ্রাম ইকুয়ালাইজেশনের জন্য ক্লিপ লিমিট। উচ্চ মান স্থানীয় কনট্রাস্ট বৃদ্ধিতে সহায়তা করে, যা সমতল অঞ্চলে বিস্তারিত ফুটিয়ে তোলে। ১.০-৩.০ সাধারণ মান।" + }, + { + "id": 43, + "label": "CLAHE grid", + "localized": "ক্লাহ (CLAHE) গ্রিড", + "reload": "", + "hint": "ক্লাহ টাইল অঞ্চলের জন্য গ্রিডের আকার। ছোট গ্রিড (যেমন, ২-৪) কম বিশদ, আরও গ্লোবাল ইকুয়ালাইজেশন তৈরি করে। বড় গ্রিড (যেমন, ১২-১৬) সূক্ষ্ম স্থানীয় বিস্তারিত উন্নত করে।" + }, + { + "id": 44, + "label": "Correction mode", + "localized": "সংশোধন মোড", "reload": "", "hint": "" }, { - "id": 41, + "id": 45, "label": "Crop to portrait", - "localized": "পোট্রেট ক্রপ করুন", + "localized": "পোর্ট্রেটে ক্রপ করুন", "reload": "", - "hint": "আইপি অ্যাডাপ্টার ইনপুট হিসেবে ব্যবহার করার আগে ইনপুট ইমেজটিকে শুধুমাত্র পোট্রেটে ক্রপ করুন" + "hint": "আইপি অ্যাডাপ্টার (IP adapter) ইনপুট হিসেবে ব্যবহার করার আগে ইনপুট ছবিকে শুধুমাত্র পোর্ট্রেট আকারে ক্রপ করুন" }, { - "id": 42, + "id": 46, "label": "Concept Tokens", "localized": "কনসেপ্ট টোকেন", "reload": "", "hint": "" }, { - "id": 43, + "id": 47, "label": "Colormap", - "localized": "কালার-ম্যাপ", + "localized": "কালারম্যাপ", "reload": "", "hint": "" }, { - "id": 44, + "id": 48, "label": "Cosine scale 1", "localized": "কোসাইন স্কেল ১", "reload": "", "hint": "" }, { - "id": 45, + "id": 49, "label": "Cosine scale 2", "localized": "কোসাইন স্কেল ২", "reload": "", "hint": "" }, { - "id": 46, + "id": 50, "label": "Cosine scale 3", "localized": "কোসাইন স্কেল ৩", "reload": "", "hint": "" }, { - "id": 47, + "id": 51, "label": "Cache model", "localized": "ক্যাশ মডেল", "reload": "", "hint": "" }, { - "id": 48, + "id": 52, "label": "Cosine scale", "localized": "কোসাইন স্কেল", "reload": "", "hint": "" }, { - "id": 49, + "id": 53, "label": "Cosine Background", "localized": "কোসাইন ব্যাকগ্রাউন্ড", "reload": "", "hint": "" }, { - "id": 50, + "id": 54, "label": "Control guidance", "localized": "নিয়ন্ত্রণ নির্দেশিকা", "reload": "", "hint": "" }, { - "id": 51, - "label": "Contrast", - "localized": "কন্ট্রাস্ট", - "reload": "", - "hint": "" - }, - { - "id": 52, + "id": 55, "label": "comma", "localized": "কমা", "reload": "", "hint": "" }, - { - "id": 53, - "label": "Columns", - "localized": "কলামসমূহ", - "reload": "", - "hint": "" - }, - { - "id": 54, - "label": "Create video", - "localized": "ভিডিও তৈরি করুন", - "reload": "", - "hint": "" - }, - { - "id": 55, - "label": "Censor", - "localized": "সেন্সর (Censor)", - "reload": "", - "hint": "" - }, { "id": 56, + "label": "Columns", + "localized": "কলাম", + "reload": "", + "hint": "" + }, + { + "id": 57, + "label": "Censor", + "localized": "সেন্সর", + "reload": "", + "hint": "" + }, + { + "id": 58, "label": "Check language", "localized": "ভাষা পরীক্ষা করুন", "reload": "", "hint": "" }, { - "id": 57, + "id": 59, "label": "Check policy violations", "localized": "নীতি লঙ্ঘন পরীক্ষা করুন", "reload": "", "hint": "" }, { - "id": 58, + "id": 60, "label": "Check banned words", "localized": "নিষিদ্ধ শব্দ পরীক্ষা করুন", "reload": "", "hint": "" }, - { - "id": 59, - "label": "Control preprocess input images", - "localized": "ইনপুট ইমেজের প্রি-প্রসেস নিয়ন্ত্রণ করুন", - "reload": "", - "hint": "" - }, - { - "id": 60, - "label": "Control override denoise strength", - "localized": "ডিনয়েজ স্ট্রেংথ ওভাররাইড নিয়ন্ত্রণ করুন", - "reload": "", - "hint": "" - }, { "id": 61, - "label": "Color variation", - "localized": "রঙের বৈচিত্র্য", + "label": "Control preprocess input images", + "localized": "নিয়ন্ত্রণ প্রিপ্রসেস ইনপুট ছবি", "reload": "", "hint": "" }, { "id": 62, + "label": "Control override denoise strength", + "localized": "নিয়ন্ত্রণ ওভাররাইড ডিনয়েজ শক্তি", + "reload": "", + "hint": "" + }, + { + "id": 63, + "label": "Color variation", + "localized": "রঙের ভিন্নতা", + "reload": "", + "hint": "" + }, + { + "id": 64, "label": "Change rate", "localized": "পরিবর্তনের হার", "reload": "", "hint": "" }, { - "id": 63, + "id": 65, "label": "Context after", "localized": "পরবর্তী কনটেক্সট", "reload": "", "hint": "" }, { - "id": 64, + "id": 66, "label": "Context mask", "localized": "কনটেক্সট মাস্ক", "reload": "", "hint": "" }, - { - "id": 65, - "label": "Control only", - "localized": "শুধুমাত্র নিয়ন্ত্রণ (Control only)", - "reload": "", - "hint": "এটি আমাদের বিভিন্ন অপশনের উপর ভিত্তি করে কন্ট্রোল-নেট বা আইপি অ্যাডাপ্টার ধরণের কাজগুলোর জন্য উৎস হিসেবে নিচের কন্ট্রোল ইনপুটটি ব্যবহার করে।" - }, - { - "id": 66, - "label": "CN Mode", - "localized": "সিএন মোড (CN Mode)", - "reload": "", - "hint": "" - }, { "id": 67, - "label": "CN Strength", - "localized": "সিএন স্ট্রেংথ (CN Strength)", + "label": "Control only", + "localized": "শুধুমাত্র নিয়ন্ত্রণ", "reload": "", - "hint": "" + "hint": "এটি যেকোনো কন্ট্রোলনেট বা আইপি অ্যাডাপ্টার টাস্কের জন্য শুধুমাত্র নিচের কন্ট্রোল ইনপুটকে উৎস হিসেবে ব্যবহার করে।" }, { "id": 68, - "label": "CN Start", - "localized": "সিএন শুরু (CN Start)", + "label": "CN Mode", + "localized": "সিএন (CN) মোড", "reload": "", "hint": "" }, { "id": 69, - "label": "CN End", - "localized": "সিএন শেষ (CN End)", + "label": "CN Strength", + "localized": "সিএন (CN) শক্তি", "reload": "", "hint": "" }, { "id": 70, - "label": "CN Tiles", - "localized": "সিএন টাইলস (CN Tiles)", + "label": "CN Start", + "localized": "সিএন (CN) শুরু", "reload": "", "hint": "" }, { "id": 71, + "label": "CN End", + "localized": "সিএন (CN) শেষ", + "reload": "", + "hint": "" + }, + { + "id": 72, + "label": "CN Tiles", + "localized": "সিএন (CN) টাইলস", + "reload": "", + "hint": "" + }, + { + "id": 73, "label": "Control factor", "localized": "নিয়ন্ত্রণ ফ্যাক্টর", "reload": "", "hint": "" }, - { - "id": 72, - "label": "ControlNet-XS", - "localized": "কন্ট্রোল-নেট-এক্সএস", - "reload": "", - "hint": "" - }, - { - "id": 73, - "label": "Coarse", - "localized": "মোটা দাগে (Coarse)", - "reload": "", - "hint": "" - }, { "id": 74, + "label": "ControlNet-XS", + "localized": "কন্ট্রোলনেট-এক্সএস (ControlNet-XS)", + "reload": "", + "hint": "" + }, + { + "id": 75, + "label": "Coarse", + "localized": "মোটা (Coarse)", + "reload": "", + "hint": "" + }, + { + "id": 76, "label": "Color map", "localized": "কালার ম্যাপ", "reload": "", "hint": "" }, - { - "id": 75, - "label": "Crop to fit", - "localized": "ফিট করতে ক্রপ করুন", - "reload": "", - "hint": "যদি আপনার সোর্স ইমেজের ডাইমেনশন (যেমন ৫১২x৫১০) আপনার টার্গেট ডাইমেনশন (যেমন ১০২৪x৭৬৮) থেকে আলাদা হয়, তবে এই ফাংশনটি আপনার আপস্কেল করা ইমেজটিকে আপনার টার্গেট সাইজ ইমেজে ফিট করবে। বাড়তি অংশ ক্রপ করা হবে।" - }, - { - "id": 76, - "label": "CLiP Model", - "localized": "ক্লিপ মডেল (CLIP Model)", - "reload": "", - "hint": "ইমেজ-টেক্সট সিমিলারিটি ম্যাচিংয়ের জন্য ব্যবহৃত CLIP মডেল।
বড় মডেলগুলো (ViT-L, ViT-H) বেশি নির্ভুল কিন্তু ধীর গতির এবং বেশি VRAM ব্যবহার করে।" - }, { "id": 77, - "label": "Caption Model", - "localized": "ক্যাপশন মডেল", + "label": "Crop to fit", + "localized": "ফিট করার জন্য ক্রপ করুন", "reload": "", - "hint": "প্রাথমিক ছবির ক্যাপশন তৈরি করতে ব্যবহৃত BLIP মডেল।
ক্যাপশন মডেলটি ছবির বিষয়বস্তু বর্ণনা করে যা পরবর্তীতে CLIP স্টাইল এবং ফ্লেভার টার্ম দিয়ে সমৃদ্ধ করে।" + "hint": "যদি আপনার উৎসের ছবির মাত্রা (যেমন ৫১২x৫১০) আপনার লক্ষ্যমাত্রার মাত্রা (যেমন ১০২৪x৭৬৮) থেকে আলাদা হয়, তবে এই ফাংশনটি আপনার আপস্কেল করা ছবিটিকে লক্ষ্যমাত্রার আকার অনুযায়ী ফিট করবে। অতিরিক্ত অংশ ক্রপ করা হবে।" }, { "id": 78, - "label": "Chunk Size", - "localized": "চাঙ্ক সাইজ (Chunk Size)", + "label": "CLiP Model", + "localized": "ক্লিপ (CLIP) মডেল", "reload": "", - "hint": "বর্ণনার ক্যান্ডিডেটগুলো (ফ্লেভার) প্রসেস করার ব্যাচ সাইজ। উচ্চতর মান ইন্টারোগেশন দ্রুত করে কিন্তু VRAM ব্যবহার বাড়িয়ে দেয়।" + "hint": "ছবি এবং পাঠ্যের সাদৃশ্য মিলনের জন্য ব্যবহৃত ক্লিপ মডেল। বড় মডেলগুলি (ViT-L, ViT-H) বেশি নির্ভুল তবে ধীর এবং বেশি ভি-র‍্যাম (VRAM) ব্যবহার করে।" }, { "id": 79, - "label": "CLiP Num Beams", - "localized": "ক্লিপ বিম সংখ্যা", + "label": "Caption Model", + "localized": "ক্যাপশন মডেল", "reload": "", - "hint": "ক্যাপশন জেনারেশনের সময় বিম সার্চের জন্য বিম সংখ্যা। উচ্চতর মান বেশি সম্ভাবনা অনুসন্ধান করে কিন্তু ধীর গতির হয়।" + "hint": "প্রাথমিক ইমেজ ক্যাপশন তৈরি করতে ব্যবহৃত ব্লিপ (BLIP) মডেল। ক্যাপশন মডেলটি ছবির বিষয়বস্তু বর্ণনা করে যা ক্লিপ এরপর স্টাইল এবং ফ্লেভার টার্ম দিয়ে সমৃদ্ধ করে।" }, { "id": 80, - "label": "Character threshold", - "localized": "ক্যারেক্টার থ্রেশহোল্ড", + "label": "clip: max length", + "localized": "ক্লিপ: সর্বোচ্চ দৈর্ঘ্য", "reload": "", - "hint": "চরিত্র-নির্দিষ্ট ট্যাগের জন্য কনফিডেন্স থ্রেশহোল্ড (যেমন, চরিত্রের নাম, নির্দিষ্ট বৈশিষ্ট্য)।
শুধুমাত্র এই থ্রেশহোল্ডের উপরে কনফিডেন্স থাকা ট্যাগগুলো অন্তর্ভুক্ত করা হয়।
উচ্চতর মান বেশি সিলেক্টিভ, নিম্নতর মান আরও সম্ভাব্য ম্যাচ অন্তর্ভুক্ত করে।
DeepBooru মডেল দ্বারা সমর্থিত নয়।" + "hint": "" }, { "id": 81, + "label": "clip: chunk size", + "localized": "ক্লিপ: চাঙ্ক সাইজ", + "reload": "", + "hint": "" + }, + { + "id": 82, + "label": "clip: min flavors", + "localized": "ক্লিপ: সর্বনিম্ন ফ্লেভার", + "reload": "", + "hint": "" + }, + { + "id": 83, + "label": "clip: max flavors", + "localized": "ক্লিপ: সর্বোচ্চ ফ্লেভার", + "reload": "", + "hint": "" + }, + { + "id": 84, + "label": "clip: intermediates", + "localized": "ক্লিপ: ইন্টারমিডিয়েট", + "reload": "", + "hint": "" + }, + { + "id": 85, + "label": "clip: num beams", + "localized": "ক্লিপ: বিমের সংখ্যা", + "reload": "", + "hint": "" + }, + { + "id": 86, + "label": "Character threshold", + "localized": "ক্যারেক্টার থ্রেশহোল্ড", + "reload": "", + "hint": "চরিত্র-নির্দিষ্ট ট্যাগের জন্য কনফিডেন্স থ্রেশহোল্ড (যেমন, চরিত্রের নাম, নির্দিষ্ট বৈশিষ্ট্য)। শুধুমাত্র এই থ্রেশহোল্ডের উপরে থাকা ট্যাগগুলি অন্তর্ভুক্ত করা হয়।" + }, + { + "id": 87, "label": "Cross-attention", "localized": "ক্রস-অ্যাটেনশন", "reload": "", "hint": "" }, { - "id": 82, + "id": 88, "label": "cpu", "localized": "সিপিইউ (CPU)", "reload": "", - "hint": "শুধুমাত্র CPU এবং RAM ব্যবহার করে: সবচেয়ে ধীর কিন্তু মেমরি স্বল্পতা (OOM) হওয়ার সম্ভাবনা সবচেয়ে কম" + "hint": "শুধুমাত্র সিপিইউ এবং র‍্যাম ব্যবহার করে: সবচেয়ে ধীর কিন্তু ওওএম (OOM) হওয়ার সম্ভাবনা সবচেয়ে কম।" }, { - "id": 83, + "id": 89, "label": "Cached models", - "localized": "ক্যাশ করা মডেলসমূহ", + "localized": "ক্যাশ করা মডেল", "reload": "", - "hint": "দ্রুত অ্যাক্সেসের জন্য র‍্যামে (RAM) জমা রাখা মডেলের সংখ্যা" + "hint": "দ্রুত অ্যাক্সেসের জন্য র‍্যামে সংরক্ষণ করা মডেলের সংখ্যা।" }, { - "id": 84, + "id": 90, "label": "combined", "localized": "সম্মিলিত", "reload": "", "hint": "" }, { - "id": 85, + "id": 91, "label": "Compress ratio", - "localized": "কম্প্রেস রেশিও", + "localized": "কম্প্রেস অনুপাত", "reload": "", "hint": "" }, { - "id": 86, + "id": 92, "label": "compel", - "localized": "কম্পেল (Compel)", + "localized": "কম্পেল (compel)", "reload": "", "hint": "" }, { - "id": 87, + "id": 93, "label": "Channels last", - "localized": "চ্যানেলস লাস্ট (Channels last)", + "localized": "চ্যানেল লাস্ট", "reload": "", "hint": "" }, { - "id": 88, + "id": 94, "label": "cuDNN full-depth benchmark", "localized": "cuDNN ফুল-ডেপথ বেঞ্চমার্ক", "reload": "", "hint": "" }, { - "id": 89, + "id": 95, "label": "cuDNN benchmark limit", "localized": "cuDNN বেঞ্চমার্ক লিমিট", "reload": "", "hint": "" }, { - "id": 90, + "id": 96, "label": "cudaMallocAsync", - "localized": "কুডা-ম্যালক-অ্যাসিঙ্ক (cudaMallocAsync)", + "localized": "কুডা-ম্যালক-অ্যাসিন্ক (cudaMallocAsync)", "reload": "", - "hint": "CUDA অ্যাসিঙ্ক মেমরি অ্যালোকেটর ব্যবহার করে। এটি পারফরম্যান্স উন্নত করে এবং VRAM ফ্র্যাগমেন্টেশন কমায়, কিন্তু কিছু GPU-তে অস্থিতিশীলতার কারণ হতে পারে।" + "hint": "কুডা (CUDA) অ্যাসিন্ক মেমরি অ্যালোকেটর ব্যবহার করে। কর্মক্ষমতা এবং ভি-র‍্যাম বিভাজন উন্নত করে, তবে কিছু জিপিইউ-তে অস্থিরতা সৃষ্টি করতে পারে।" }, { - "id": 91, + "id": 97, "label": "CLiP skip enabled", "localized": "ক্লিপ স্কিপ সক্রিয়", "reload": "", "hint": "" }, { - "id": 92, + "id": 98, "label": "Cache-DiT enabled", "localized": "ক্যাশ-ডিআইটি সক্রিয়", "reload": "", "hint": "" }, { - "id": 93, + "id": 99, "label": "Cache-DiT F-compute blocks", "localized": "ক্যাশ-ডিআইটি এফ-কম্পিউট ব্লক", "reload": "", "hint": "" }, { - "id": 94, + "id": 100, "label": "Cache-DiT B-compute blocks", "localized": "ক্যাশ-ডিআইটি বি-কম্পিউট ব্লক", "reload": "", "hint": "" }, { - "id": 95, + "id": 101, "label": "Cache-DiT residual diff threshold", "localized": "ক্যাশ-ডিআইটি রেসিডুয়াল ডিফারেন্স থ্রেশহোল্ড", "reload": "", "hint": "" }, { - "id": 96, + "id": 102, "label": "Cache-DiT warmup steps", - "localized": "ক্যাশ-ডিআইটি ওয়ার্মআপ স্টেপস", + "localized": "ক্যাশ-ডিআইটি ওয়ার্মআপ ধাপ", "reload": "", "hint": "" }, { - "id": 97, + "id": 103, "label": "CFG-Zero enabled", "localized": "সিএফজি-জিরো সক্রিয়", "reload": "", "hint": "" }, { - "id": 98, + "id": 104, "label": "CFG-Zero star", "localized": "সিএফজি-জিরো স্টার", "reload": "", "hint": "" }, { - "id": 99, + "id": 105, "label": "CFG-Zero steps", - "localized": "সিএফজি-জিরো স্টেপস", + "localized": "সিএফজি-জিরো ধাপ", "reload": "", "hint": "" }, { - "id": 100, + "id": 106, "label": "cudagraphs", - "localized": "কুডা-গ্রাফস (Cudagraphs)", + "localized": "কুডাগ্রাফস", "reload": "", "hint": "" }, { - "id": 101, + "id": 107, "label": "Cleanup temporary folder on startup", - "localized": "স্টার্টআপে সাময়িক ফোল্ডার পরিষ্কার করুন", + "localized": "স্টার্টআপে অস্থায়ী ফোল্ডার পরিষ্কার করুন", "reload": "", "hint": "" }, { - "id": 102, + "id": 108, "label": "Create ZIP archive for multiple images", "localized": "একাধিক ছবির জন্য জিপ (ZIP) আর্কাইভ তৈরি করুন", "reload": "", "hint": "" }, { - "id": 103, + "id": 109, "label": "cover", - "localized": "কভার (Cover)", + "localized": "কভার", "reload": "", - "hint": "সম্পূর্ণ এলাকা জুড়ে থাকবে" + "hint": "সম্পূর্ণ এলাকা কভার করুন" }, { - "id": 104, + "id": 110, "label": "Compact view", - "localized": "সংক্ষিপ্ত দৃশ্য", + "localized": "কম্প্যাক্ট ভিউ", "reload": "", "hint": "" }, { - "id": 105, + "id": 111, + "label": "CivitAI token", + "localized": "সিভিটএআই টোকেন", + "reload": "", + "hint": "" + }, + { + "id": 112, + "label": "CivitAI save to subfolders", + "localized": "সিভিটএআই সাব-ফোল্ডারে সেভ করুন", + "reload": "", + "hint": "" + }, + { + "id": 113, + "label": "CivitAI subfolder template", + "localized": "সিভিটএআই সাব-ফোল্ডার টেমপ্লেট", + "reload": "", + "hint": "" + }, + { + "id": 114, + "label": "CivitAI discard downloads with hash mismatch", + "localized": "হ্যাশ অমিল হলে সিভিটএআই ডাউনলোড বাতিল করুন", + "reload": "", + "hint": "" + }, + { + "id": 115, "label": "Cache text encoder results", "localized": "টেক্সট এনকোডার ফলাফল ক্যাশ করুন", "reload": "", "hint": "" }, { - "id": 106, + "id": 116, "label": "contain", - "localized": "কনটেইন (Contain)", + "localized": "কন্টেইন", "reload": "", "hint": "" }, { - "id": 107, + "id": 117, "label": "Ctrl+up/down word delimiters", "localized": "Ctrl+up/down শব্দ বিভাজক", "reload": "", "hint": "" }, { - "id": 108, + "id": 118, "label": "Ctrl+up/down precision when editing (attention:1.1)", - "localized": "সম্পাদনার সময় Ctrl+up/down প্রিসিশন (attention:1.1)", + "localized": "সম্পাদনার সময় Ctrl+up/down প্রিসিশন (অ্যাটেনশন:১.১)", "reload": "", "hint": "" }, { - "id": 109, + "id": 119, "label": "Ctrl+up/down precision when editing ", - "localized": "সম্পাদনার সময় Ctrl+up/down প্রিসিশন ", + "localized": "সম্পাদনার সময় Ctrl+up/down প্রিসিশন <এক্সট্রা নেটওয়ার্ক:০.৯>", "reload": "", "hint": "" }, { - "id": 110, + "id": 120, "label": "Cached VAEs", - "localized": "ক্যাশ করা VAEs", + "localized": "ক্যাশ করা ভিএই (VAEs)", "reload": "", "hint": "" }, { - "id": 111, + "id": 121, "label": "ckpt", "localized": "সিকেপিটি (ckpt)", "reload": "", "hint": "" }, { - "id": 112, + "id": 122, "label": "Comma separated list with optional strength per LoRA", - "localized": "প্রতি LoRA প্রতি ঐচ্ছিক স্ট্রেংথ সহ কমা দ্বারা পৃথক করা তালিকা", + "localized": "লোরা (LoRA) প্রতি ঐচ্ছিক শক্তির সাথে কমা দ্বারা পৃথক তালিকা", "reload": "", "hint": "" }, { - "id": 113, - "label": "CivitAI token", - "localized": "সিভিট-এআই টোকেন", - "reload": "", - "hint": "" - }, - { - "id": 114, + "id": 123, "label": "Custom pipeline", "localized": "কাস্টম পাইপলাইন", "reload": "", "hint": "" }, { - "id": 115, + "id": 124, "label": "Custom model", "localized": "কাস্টম মডেল", "reload": "", "hint": "" }, - { - "id": 116, - "label": "ControlNet unit 1", - "localized": "কন্ট্রোল-নেট ইউনিট ১", - "reload": "", - "hint": "" - }, - { - "id": 117, - "label": "ControlNet unit 2", - "localized": "কন্ট্রোল-নেট ইউনিট ২", - "reload": "", - "hint": "" - }, - { - "id": 118, - "label": "ControlNet unit 3", - "localized": "কন্ট্রোল-নেট ইউনিট ৩", - "reload": "", - "hint": "" - }, - { - "id": 119, - "label": "ControlNet unit 4", - "localized": "কন্ট্রোল-নেট ইউনিট ৪", - "reload": "", - "hint": "" - }, - { - "id": 120, - "label": "ControlNet-XS unit 1", - "localized": "কন্ট্রোল-নেট-এক্সএস ইউনিট ১", - "reload": "", - "hint": "" - }, - { - "id": 121, - "label": "ControlNet-XS unit 2", - "localized": "কন্ট্রোল-নেট-এক্সএস ইউনিট ২", - "reload": "", - "hint": "" - }, - { - "id": 122, - "label": "ControlNet-XS unit 3", - "localized": "কন্ট্রোল-নেট-এক্সএস ইউনিট ৩", - "reload": "", - "hint": "" - }, - { - "id": 123, - "label": "ControlNet-XS unit 4", - "localized": "কন্ট্রোল-নেট-এক্সএস ইউনিট ৪", - "reload": "", - "hint": "" - }, - { - "id": 124, - "label": "Control-LLLite unit 1", - "localized": "কন্ট্রোল-এলএল-লাইট ইউনিট ১", - "reload": "", - "hint": "" - }, { "id": 125, - "label": "Control-LLLite unit 2", - "localized": "কন্ট্রোল-এলএল-লাইট ইউনিট ২", + "label": "ControlNet unit 1", + "localized": "কন্ট্রোলনেট ইউনিট ১", "reload": "", "hint": "" }, { "id": 126, - "label": "Control-LLLite unit 3", - "localized": "কন্ট্রোল-এলএল-লাইট ইউনিট ৩", + "label": "ControlNet unit 2", + "localized": "কন্ট্রোলনেট ইউনিট ২", "reload": "", "hint": "" }, { "id": 127, - "label": "Control-LLLite unit 4", - "localized": "কন্ট্রোল-এলএল-লাইট ইউনিট ৪", + "label": "ControlNet unit 3", + "localized": "কন্ট্রোলনেট ইউনিট ৩", "reload": "", "hint": "" }, { "id": 128, + "label": "ControlNet unit 4", + "localized": "কন্ট্রোলনেট ইউনিট ৪", + "reload": "", + "hint": "" + }, + { + "id": 129, + "label": "ControlNet-XS unit 1", + "localized": "কন্ট্রোলনেট-এক্সএস ইউনিট ১", + "reload": "", + "hint": "" + }, + { + "id": 130, + "label": "ControlNet-XS unit 2", + "localized": "কন্ট্রোলনেট-এক্সএস ইউনিট ২", + "reload": "", + "hint": "" + }, + { + "id": 131, + "label": "ControlNet-XS unit 3", + "localized": "কন্ট্রোলনেট-এক্সএস ইউনিট ৩", + "reload": "", + "hint": "" + }, + { + "id": 132, + "label": "ControlNet-XS unit 4", + "localized": "কন্ট্রোলনেট-এক্সএস ইউনিট ৪", + "reload": "", + "hint": "" + }, + { + "id": 133, + "label": "Control-LLLite unit 1", + "localized": "কন্ট্রোল-এলএললাইট (LLLite) ইউনিট ১", + "reload": "", + "hint": "" + }, + { + "id": 134, + "label": "Control-LLLite unit 2", + "localized": "কন্ট্রোল-এলএললাইট (LLLite) ইউনিট ২", + "reload": "", + "hint": "" + }, + { + "id": 135, + "label": "Control-LLLite unit 3", + "localized": "কন্ট্রোল-এলএললাইট (LLLite) ইউনিট ৩", + "reload": "", + "hint": "" + }, + { + "id": 136, + "label": "Control-LLLite unit 4", + "localized": "কন্ট্রোল-এলএললাইট (LLLite) ইউনিট ৪", + "reload": "", + "hint": "" + }, + { + "id": 137, "label": "Control settings", "localized": "নিয়ন্ত্রণ সেটিংস", "reload": "", "hint": "" }, { - "id": 129, + "id": 138, "label": "Canny", "localized": "ক্যানি (Canny)", "reload": "", "hint": "" }, { - "id": 130, + "id": 139, "label": "Condition", - "localized": "কন্ডিশন", + "localized": "শর্ত", "reload": "", "hint": "" }, { - "id": 131, + "id": 140, + "label": "Caption: Advanced Options", + "localized": "ক্যাপশন: উন্নত বিকল্প", + "reload": "", + "hint": "" + }, + { + "id": 141, "label": "Caption: Batch", "localized": "ক্যাপশন: ব্যাচ", "reload": "", "hint": "" }, { - "id": 132, + "id": 142, "label": "Control elements", - "localized": "নিয়ন্ত্রণ উপাদানসমূহ", + "localized": "নিয়ন্ত্রণ উপাদান", "reload": "", - "hint": "নিয়ন্ত্রণ উপাদানগুলো হলো উন্নত মডেল যা জেনারেশনকে কাঙ্ক্ষিত ফলাফলের দিকে পরিচালিত করতে পারে" + "hint": "নিয়ন্ত্রণ উপাদান হলো উন্নত মডেল যা জেনারেশনকে কাঙ্ক্ষিত ফলাফলের দিকে পরিচালিত করতে পারে" } ], "d": [ { - "id": -1, + "id": 0, "label": "Docs", - "localized": "নথি (Docs)", + "localized": "নথিপত্র", "reload": "", - "hint": "ডকুমেন্টেশন বা নির্দেশিকা দেখুন" + "hint": "" }, { - "id": -2, + "id": 0, "label": "Discord", - "localized": "ডিসকর্ড (Discord)", + "localized": "ডিসকর্ড", "reload": "", - "hint": "ডিসকর্ড কমিউনিটিতে যোগ দিন" + "hint": "" }, { - "id": -3, + "id": 0, "label": "Detail", "localized": "বিস্তারিত", "reload": "", - "hint": "ডিটেক্ট করা অবজেক্টের জন্য উচ্চ রেজোলিউশনে অতিরিক্ত জেনারেশন রান করে" + "hint": "ডিটেইলার (Detailer) শনাক্ত করা অবজেক্টগুলোর জন্য উচ্চ রেজোলিউশনে অতিরিক্ত জেনারেশন চালায়" }, { - "id": -4, + "id": 0, "label": "Delete", - "localized": "মুছে ফেলুন", + "localized": "মুছুন", "reload": "", - "hint": "ছবিটি মুছে ফেলুন" + "hint": "ছবি মুছুন" }, { - "id": -5, + "id": 0, "label": "Default", "localized": "ডিফল্ট", "reload": "", "hint": "" }, { - "id": -6, + "id": 0, "label": "Download updates", "localized": "আপডেট ডাউনলোড করুন", "reload": "", "hint": "" }, { - "id": -7, + "id": 0, "label": "Download model", "localized": "মডেল ডাউনলোড করুন", "reload": "", "hint": "" }, { - "id": -8, + "id": 0, "label": "Diffusers", - "localized": "ডিফিউজার্স (Diffusers)", + "localized": "ডিফিউজারস", "reload": "", "hint": "" }, { - "id": -9, + "id": 0, "label": "Distilled", - "localized": "ডিস্টিলড (Distilled)", + "localized": "ডিস্টিলড", "reload": "", "hint": "" }, { - "id": -10, + "id": 0, "label": "Description", - "localized": "বিবরণ", + "localized": "বর্ণনা", "reload": "", "hint": "" }, { - "id": -11, + "id": 0, "label": "Details", - "localized": "বিস্তারিত বিবরণ", + "localized": "বিস্তারিত", "reload": "", "hint": "" }, { - "id": -12, + "id": 0, "label": "Detailer", - "localized": "ডিটেইলার (Detailer)", + "localized": "ডিটেইলার", "reload": "", - "hint": "ডিটেক্ট করা অবজেক্টের জন্য উচ্চ রেজোলিউশনে অতিরিক্ত জেনারেশন রান করে" + "hint": "ডিটেইলার শনাক্ত করা অবজেক্টগুলোর জন্য উচ্চ রেজোলিউশনে অতিরিক্ত জেনারেশন চালায়" }, { - "id": -13, + "id": 0, "label": "Denoise", - "localized": "ডিনয়েজ", + "localized": "ডিনয়েজ", "reload": "", - "hint": "ডিনয়েজিং সেটিংস। ডিনয়েজ যত বেশি হবে, জেনারেশনের সময় বর্তমান ছবির কন্টেন্ট তত বেশি পরিবর্তন হতে পারে" + "hint": "ডিনয়েজিং সেটিংস। উচ্চ ডিনয়েজ মানে হলো জেনারেশনের সময় বিদ্যমান ছবির অনেক বেশি অংশ পরিবর্তনের অনুমতি দেওয়া হয়" }, { - "id": -14, + "id": 0, "label": "DirectML", - "localized": "DirectML", + "localized": "ডাইরেক্টএমএল", "reload": "", "hint": "" }, { - "id": -15, + "id": 0, "label": "Download model from huggingface", - "localized": "HuggingFace থেকে মডেল ডাউনলোড করুন", + "localized": "হাগিংফেস (HuggingFace) থেকে মডেল ডাউনলোড করুন", "reload": "", "hint": "" }, { - "id": -16, + "id": 0, "label": "Dropdown", - "localized": "ড্রপডাউন (Dropdown)", + "localized": "ড্রপডাউন", "reload": "", "hint": "" }, { - "id": -17, + "id": 0, "label": "dynamic", - "localized": "ডায়নামিক", + "localized": "ডাইনামিক", "reload": "", - "hint": "ডায়নামিক শিফটিং আপনার ছবির রেজোলিউশনের উপর ভিত্তি করে ডিনয়েজিং শিডিউল স্বয়ংক্রিয়ভাবে সমন্বয় করে।

তফসিলকারী প্রকৃত ছবির রেজোলিউশনের উপর ভিত্তি করে base_shift এবং max_shift-এর মধ্যে ইন্টারপোলেট করে।

এটি সক্রিয় করলে স্ট্যাটিক ফ্লো শিফট নিষ্ক্রিয় হয়।" + "hint": "ডাইনামিক শিফটিং আপনার ছবির রেজোলিউশনের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে ডিনয়েজিং শিডিউল সামঞ্জস্য করে।

এই শিডিউলার প্রকৃত ছবির রেজোলিউশনের উপর ভিত্তি করে base_shift এবং max_shift-এর মধ্যে ইন্টারপোলেট করে।

এটি সক্রিয় করলে স্ট্যাটিক ফ্লো শিফট নিষ্ক্রিয় হয়ে যায়।" }, { - "id": -18, + "id": 0, "label": "Detailer models", "localized": "ডিটেইলার মডেলসমূহ", "reload": "", - "hint": "ডিটেইলিংয়ের জন্য কোন ডিটেকশন মডেলগুলো ব্যবহার করা হবে তা নির্বাচন করুন" + "hint": "ডিটেইলিং-এর জন্য ব্যবহার করতে ডিটেকশন মডেল নির্বাচন করুন" }, { - "id": -19, + "id": 0, "label": "Detailer list", "localized": "ডিটেইলার তালিকা", "reload": "", "hint": "" }, { - "id": -20, + "id": 0, "label": "Detailer classes", "localized": "ডিটেইলার ক্লাসসমূহ", "reload": "", - "hint": "নির্বাচিত ডিটেইলার মডেলটি মাল্টি-ক্লাস হলে নির্দিষ্ট ক্লাসগুলো উল্লেখ করুন" + "hint": "নির্বাচিত ডিটেইলার মডেলটি মাল্টি-ক্লাস মডেল হলে নির্দিষ্ট ক্লাস ব্যবহার করতে তা উল্লেখ করুন" }, { - "id": -21, + "id": 0, "label": "Detailer prompt", "localized": "ডিটেইলার প্রম্পট", "reload": "", - "hint": "ডিটেইলারের জন্য আলাদা প্রম্পট ব্যবহার করুন। না থাকলে এটি প্রাথমিক প্রম্পট ব্যবহার করবে" + "hint": "ডিটেইলারের জন্য আলাদা প্রম্পট ব্যবহার করুন। যদি না দেওয়া হয়, তবে এটি প্রাথমিক প্রম্পট ব্যবহার করবে" }, { - "id": -22, + "id": 0, "label": "Detailer negative prompt", "localized": "ডিটেইলার নেগেটিভ প্রম্পট", "reload": "", - "hint": "ডিটেইলারের জন্য আলাদা নেগেটিভ প্রম্পট ব্যবহার করুন। না থাকলে এটি প্রাথমিক নেগেটিভ প্রম্পট ব্যবহার করবে" + "hint": "ডিটেইলারের জন্য আলাদা নেগেটিভ প্রম্পট ব্যবহার করুন। যদি না দেওয়া হয়, তবে এটি প্রাথমিক নেগেটিভ প্রম্পট ব্যবহার করবে" }, { - "id": -23, + "id": 0, "label": "Detailer steps", - "localized": "ডিটেইলার স্টেপস", + "localized": "ডিটেইলার ধাপসমূহ", "reload": "", - "hint": "ডিটেইলার প্রক্রিয়ার জন্য কতটি স্টেপ চালানো হবে" + "hint": "ডিটেইলার প্রক্রিয়ার জন্য কতগুলো ধাপ চালানো হবে তার সংখ্যা" }, { - "id": -24, + "id": 0, "label": "Detailer strength", - "localized": "ডিটেইলার স্ট্রেন্থ", + "localized": "ডিটেইলার শক্তি", "reload": "", - "hint": "ডিটেইলার প্রক্রিয়ার ডিনয়েজিং স্ট্রেন্থ" + "hint": "ডিটেইলার প্রক্রিয়ার ডিনয়েজিং শক্তি" }, { - "id": -25, + "id": 0, "label": "Detailer resolution", "localized": "ডিটেইলার রেজোলিউশন", "reload": "", "hint": "" }, { - "id": -26, + "id": 0, "label": "Denoising batch size", - "localized": "ডিনয়েজিং ব্যাচ সাইজ", + "localized": "ডিনয়েজিং ব্যাচ সাইজ", "reload": "", "hint": "" }, { - "id": -27, + "id": 0, "label": "Dilate tau", - "localized": "ডাইলেট টাউ (Dilate tau)", + "localized": "ডাইলেট টাউ", "reload": "", "hint": "" }, { - "id": -28, + "id": 0, "label": "Draw legend", "localized": "লিজেন্ড আঁকুন", "reload": "", "hint": "" }, { - "id": -29, + "id": 0, "label": "Denoising strength", - "localized": "ডিনয়েজিং স্ট্রেন্থ", + "localized": "ডিনয়েজিং শক্তি", "reload": "", - "hint": "অ্যালগরিদম ছবির কন্টেন্টের প্রতি কতটা কম গুরুত্ব দেবে তা নির্ধারণ করে। ০-তে কিছুই পরিবর্তন হবে না, এবং ১-এ আপনি একটি সম্পূর্ণ সম্পর্কহীন ছবি পাবেন। ১.০-এর নিচের মানের ক্ষেত্রে প্রসেসিং স্যাম্পলিং স্টেপসের চেয়ে কম সময় নেবে" + "hint": "অ্যালগরিদম ছবির বিষয়বস্তুকে কতটা গুরুত্ব দেবে তা নির্ধারণ করে। ০-তে, কিছুই পরিবর্তন হবে না, এবং ১-এ আপনি একটি সম্পর্কহীন ছবি পাবেন। ১.০-এর কম মানের ক্ষেত্রে, স্যাম্পলিং স্টেপস স্লাইডারে যা উল্লেখ করা হয়েছে তার চেয়ে কম ধাপে প্রসেসিং সম্পন্ন হবে" }, { - "id": -30, + "id": 0, "label": "Denoise start", - "localized": "ডিনয়েজ শুরু", + "localized": "ডিনয়েজ শুরু", "reload": "", - "hint": "বেস মডেল কখন শেষ হবে এবং রিফাইনার কখন শুরু হবে তা উল্লেখ করে ডিনয়েজ স্ট্রেন্থ ওভাররাইড করুন। শুধুমাত্র রিফাইনার ব্যবহারের ক্ষেত্রে প্রযোজ্য। ০ বা ১ সেট করা হলে ডিফল্ট ডিনয়েজিং স্ট্রেন্থ ব্যবহৃত হবে" + "hint": "বেস মডেল কখন শেষ হবে এবং রিফাইনার কখন শুরু হবে তা উল্লেখ করে ডিনয়েজ শক্তি ওভাররাইড করুন। এটি শুধুমাত্র রিফাইনার ব্যবহারের ক্ষেত্রে প্রযোজ্য। যদি ০ বা ১ সেট করা থাকে, তবে ডিনয়েজিং শক্তি ব্যবহার করা হবে" }, { - "id": -31, + "id": 0, "label": "down", - "localized": "নিচে (down)", + "localized": "নিচে (Down)", "reload": "", "hint": "" }, { - "id": -32, + "id": 0, "label": "Decode chunks", - "localized": "চাঙ্ক ডিকোড করুন", + "localized": "ডিকোড চাঙ্কস", "reload": "", "hint": "" }, { - "id": -33, + "id": 0, "label": "Dilate", - "localized": "ডাইলেট (Dilate)", + "localized": "ডাইলেট", "reload": "", "hint": "" }, { - "id": -34, + "id": 0, "label": "Depth and normal", - "localized": "ডেপথ এবং নরমাল (Depth and normal)", + "localized": "ডেপথ এবং নরমাল", "reload": "", "hint": "" }, { - "id": -35, + "id": 0, "label": "Distance threshold", "localized": "দূরত্বের থ্রেশহোল্ড", "reload": "", "hint": "" }, { - "id": -36, + "id": 0, "label": "Depth threshold", - "localized": "ডেপথ থ্রেশহোল্ড", + "localized": "গভীরতার (ডেপথ) থ্রেশহোল্ড", "reload": "", "hint": "" }, { - "id": -37, + "id": 0, "label": "Denoising steps", - "localized": "ডিনয়েজিং স্টেপস", + "localized": "ডিনয়েজিং ধাপসমূহ", "reload": "", "hint": "" }, { - "id": -38, + "id": 0, "label": "Depth map", - "localized": "ডেপথ ম্যাপ (Depth map)", + "localized": "ডেপথ ম্যাপ", "reload": "", "hint": "" }, { - "id": -39, + "id": 0, "label": "Dynamic shift", - "localized": "ডায়নামিক শিফট", + "localized": "ডাইনামিক শিফট", "reload": "", "hint": "" }, { - "id": -40, + "id": 0, "label": "Duration", - "localized": "সময়কাল (Duration)", + "localized": "সময়কাল", "reload": "", "hint": "" }, { - "id": -41, + "id": 0, "label": "Device Info", "localized": "ডিভাইসের তথ্য", "reload": "", "hint": "" }, { - "id": -42, + "id": 0, "label": "Diffusers load using Run:ai streamer", - "localized": "Run:ai স্ট্রিমার ব্যবহার করে ডিফিউজার্স লোড করুন", + "localized": "Run:ai স্ট্রিমার ব্যবহার করে ডিফিউজারস লোড করুন", "reload": "", "hint": "" }, { - "id": -43, + "id": 0, "label": "Disable accelerate", - "localized": "অ্যাকসেলারেট (accelerate) নিষ্ক্রিয় করুন", + "localized": "অ্যাক্সিলারেট (Accelerate) নিষ্ক্রিয় করুন", "reload": "", "hint": "" }, { - "id": -44, + "id": 0, "label": "Disable T5 text encoder", - "localized": "T5 টেক্সট এনকোডার নিষ্ক্রিয় করুন", + "localized": "T5 টেক্সট এনকোডার নিষ্ক্রিয় করুন", "reload": "", "hint": "" }, { - "id": -45, + "id": 0, "label": "Dynamic loss threshold", - "localized": "ডায়নামিক লস থ্রেশহোল্ড", + "localized": "ডাইনামিক লস থ্রেশহোল্ড", "reload": "", "hint": "" }, { - "id": -46, + "id": 0, "label": "Dequantize using torch.compile", - "localized": "torch.compile ব্যবহার করে ডিকুয়ান্টাইজ করুন", + "localized": "torch.compile ব্যবহার করে ডিকোয়াটাইজ করুন", "reload": "", "hint": "" }, { - "id": -47, + "id": 0, "label": "Dequantize using full precision", - "localized": "ফুল প্রিসিশন ব্যবহার করে ডিকুয়ান্টাইজ করুন", + "localized": "ফুল প্রিসিশন ব্যবহার করে ডিকোয়াটাইজ করুন", "reload": "", "hint": "" }, { - "id": -48, + "id": 0, "label": "Disabled", - "localized": "নিষ্ক্রিয়", + "localized": "নিষ্ক্রিয়", "reload": "", "hint": "" }, { - "id": -49, + "id": 0, "label": "Dynamic Attention BMM", - "localized": "ডায়নামিক অ্যাটেনশন BMM", + "localized": "ডাইনামিক অ্যাটেনশন BMM", "reload": "", - "hint": "একবারে করার পরিবর্তে ধাপে ধাপে অ্যাটেনশন গণনা সম্পন্ন করে। এতে জেনারেশনের সময় ধীর হয় কিন্তু মেমরি ব্যবহার অনেক কমে যায়" + "hint": "একসাথে না করে ধাপে ধাপে অ্যাটেনশন গণনা করে। এতে ইনফারেন্সের সময় ধীর হলেও মেমোরি ব্যবহার অনেক কমে যায়" }, { - "id": -50, + "id": 0, "label": "Dynamic attention", - "localized": "ডায়নামিক অ্যাটেনশন", + "localized": "ডাইনামিক অ্যাটেনশন", "reload": "", - "hint": "প্রতি ধাপে ডায়নামিকভাবে অ্যাটেনশন গণনা সমন্বয় করে। এটি VRAM সাশ্রয় করে তবে জেনারেশনের গতি কমিয়ে দেয়।" + "hint": "প্রতিটি ধাপে ডাইনামিকভাবে অ্যাটেনশন গণনা সামঞ্জস্য করে। এটি VRAM বাঁচায় কিন্তু জেনারেশন ধীর করে দেয়।" }, { - "id": -51, + "id": 0, "label": "Dynamic Attention slicing rate", - "localized": "ডায়নামিক অ্যাটেনশন স্লাইসিং রেট", + "localized": "ডাইনামিক অ্যাটেনশন স্লাইসিং রেট", "reload": "", "hint": "" }, { - "id": -52, + "id": 0, "label": "Dynamic Attention trigger rate", - "localized": "ডায়নামিক অ্যাটেনশন ট্রিগার রেট", + "localized": "ডাইনামিক অ্যাটেনশন ট্রিগার রেট", "reload": "", "hint": "" }, { - "id": -53, + "id": 0, "label": "Deterministic mode", "localized": "ডিটারমিনিস্টিক মোড", "reload": "", - "hint": "প্রতিটি রানের আউটপুট একই রাখতে বাধ্য করে। ফলাফল পুনরায় তৈরি করার জন্য দরকারী, তবে কিছু অপ্টিমাইজেশন নিষ্ক্রিয় করতে পারে।" + "hint": "রানগুলোর মধ্যে ডিটারমিনিস্টিক আউটপুট জোরপূর্বক বজায় রাখে। এটি পুনরাবৃত্তিযোগ্যতার জন্য উপযোগী, তবে কিছু অপ্টিমাইজেশন নিষ্ক্রিয় করতে পারে।" }, { - "id": -54, + "id": 0, "label": "DirectML retry ops for NaN", - "localized": "NaN-এর জন্য DirectML পুনরায় চেষ্টার অপশন", + "localized": "NaN-এর জন্য DirectML রিট্রাই অপস", "reload": "", "hint": "" }, { - "id": -55, + "id": 0, "label": "deep-cache", - "localized": "ডিপ-ক্যাশ (deep-cache)", + "localized": "ডিপ-ক্যাশ (DeepCache)", "reload": "", "hint": "" }, { - "id": -56, + "id": 0, "label": "DeepCache cache interval", - "localized": "DeepCache ক্যাশ ইন্টারভাল", + "localized": "ডিপ-ক্যাশ (DeepCache) ক্যাশ ইন্টারভাল", "reload": "", "hint": "" }, { - "id": -57, + "id": 0, "label": "Directory for temporary images; leave empty for default", - "localized": "অস্থায়ী ছবির ডিরেক্টরি; ডিফল্টের জন্য খালি রাখুন", + "localized": "অস্থায়ী ছবির ডিরেক্টরি; ডিফল্টের জন্য খালি রাখুন", "reload": "", "hint": "" }, { - "id": -58, + "id": 0, "label": "Do not display video output in UI", "localized": "UI-তে ভিডিও আউটপুট প্রদর্শন করবেন না", "reload": "", "hint": "" }, { - "id": -59, + "id": 0, "label": "Directory name pattern", - "localized": "ডিরেক্টরি নামের প্যাটার্ন", + "localized": "ডিরেক্টরির নামের প্যাটার্ন", "reload": "", - "hint": "ছবি এবং গ্রিডের সাব-ডিরেক্টরি কীভাবে বেছে নেওয়া হবে তা নির্ধারণ করতে নিম্নলিখিত ট্যাগগুলো ব্যবহার করুন: [steps], [cfg], [prompt_hash], [prompt], ইত্যাদি। ডিফল্টের জন্য খালি রাখুন" + "hint": "ছবি এবং গ্রিডের সাবডিরেক্টরিগুলো কীভাবে বাছাই করা হবে তা নির্ধারণ করতে নিচের ট্যাগগুলো ব্যবহার করুন: [steps], [cfg],[prompt_hash], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [model_name], [prompt_words], [date], [datetime], [datetime], [datetime
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 Date: Fri, 3 Apr 2026 15:46:15 +0200 Subject: [PATCH 50/73] Restoring platform agnosticism, Linux users report OK --- scripts/rocm/rocm_mgr.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/rocm/rocm_mgr.py b/scripts/rocm/rocm_mgr.py index b35b1ced1..bb6b2c9a3 100644 --- a/scripts/rocm/rocm_mgr.py +++ b/scripts/rocm/rocm_mgr.py @@ -468,10 +468,7 @@ def info() -> dict: # Apply saved config to os.environ at import time (only when ROCm is present) if installer.torch_info.get('type', None) == 'rocm': - if sys.platform == 'win32': - try: - apply_env() - except Exception as _e: - log.debug(f"[rocm_mgr] Warning: failed to apply env at import: {_e}") - else: - log.debug('Skipping ROCm Environment Manager: Currently only Windows is supported.') + try: + apply_env() + except Exception as _e: + log.debug(f"[rocm_mgr] Warning: failed to apply env at import: {_e}") From ffeda702c591013f60ae78e04cfd42f20bf757c6 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Fri, 3 Apr 2026 23:50:45 +0300 Subject: [PATCH 51/73] Set default openvino_accuracy to no hint --- modules/ui_definitions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui_definitions.py b/modules/ui_definitions.py index d43b45e3a..16d6f18ed 100644 --- a/modules/ui_definitions.py +++ b/modules/ui_definitions.py @@ -265,7 +265,7 @@ def create_settings(cmd_opts): "openvino_sep": OptionInfo("

OpenVINO

", "", gr.HTML, {"visible": cmd_opts.use_openvino}), "openvino_devices": OptionInfo([], "OpenVINO devices to use", gr.CheckboxGroup, {"choices": get_openvino_device_list() if cmd_opts.use_openvino else [], "visible": cmd_opts.use_openvino}), - "openvino_accuracy": OptionInfo("performance", "OpenVINO accuracy mode", gr.Radio, {"choices": ["performance", "accuracy"], "visible": cmd_opts.use_openvino}), + "openvino_accuracy": OptionInfo("default", "OpenVINO accuracy mode", gr.Radio, {"choices": ["default", "performance", "accuracy"], "visible": cmd_opts.use_openvino}), "openvino_disable_model_caching": OptionInfo(True, "OpenVINO disable model caching", gr.Checkbox, {"visible": cmd_opts.use_openvino}), "openvino_disable_memory_cleanup": OptionInfo(True, "OpenVINO disable memory cleanup after compile", gr.Checkbox, {"visible": cmd_opts.use_openvino}), From 470a0d816ec66f5f72f21b41eab0e7ff74a0d8f0 Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 4 Apr 2026 01:32:34 +0300 Subject: [PATCH 52/73] SDNQ add tensor descriptor kernel to triton mm for Intel Arc --- modules/sdnq/layers/conv/conv_fp16.py | 6 +- .../sdnq/layers/conv/conv_fp8_tensorwise.py | 8 +-- modules/sdnq/layers/conv/conv_int8.py | 6 +- modules/sdnq/layers/linear/linear_fp16.py | 6 +- .../layers/linear/linear_fp8_tensorwise.py | 19 +++--- modules/sdnq/layers/linear/linear_int8.py | 19 +++--- modules/sdnq/triton_mm.py | 65 +++++++++++++++++-- 7 files changed, 92 insertions(+), 37 deletions(-) diff --git a/modules/sdnq/layers/conv/conv_fp16.py b/modules/sdnq/layers/conv/conv_fp16.py index 4f6cdecef..e59b1cc30 100644 --- a/modules/sdnq/layers/conv/conv_fp16.py +++ b/modules/sdnq/layers/conv/conv_fp16.py @@ -40,18 +40,18 @@ def conv_fp16_matmul( scale = scale.t() elif weight.dtype != torch.float16: weight = weight.to(dtype=torch.float16) # fp8 weights - input, scale = quantize_fp_mm_input_tensorwise(input, scale, matmul_dtype="float16") + input, input_scale = quantize_fp_mm_input_tensorwise(input, dtype=scale.dtype, matmul_dtype="float16") input, weight = check_mats(input, weight) if groups == 1: - result = fp_mm_func(input, weight) + result = fp_mm_func(input, weight).to(dtype=input_scale.dtype).mul_(input_scale) else: weight = weight.view(weight.shape[0], groups, weight.shape[1] // groups) input = input.view(input.shape[0], groups, input.shape[1] // groups) result = [] for i in range(groups): result.append(fp_mm_func(input[:, i], weight[:, i])) - result = torch.cat(result, dim=-1) + result = torch.cat(result, dim=-1).to(dtype=input_scale.dtype).mul_(input_scale) if bias is not None: dequantize_symmetric_with_bias(result, scale, bias, dtype=return_dtype, result_shape=mm_output_shape) else: diff --git a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py index 2ad268eb8..52a5a8605 100644 --- a/modules/sdnq/layers/conv/conv_fp8_tensorwise.py +++ b/modules/sdnq/layers/conv/conv_fp8_tensorwise.py @@ -38,19 +38,19 @@ def conv_fp8_matmul_tensorwise( if quantized_weight_shape is not None: weight = unpack_float(weight, weights_dtype, quantized_weight_shape).to(dtype=torch.float8_e4m3fn).t_() scale = scale.t() - input, scale = quantize_fp_mm_input_tensorwise(input, scale) + input, input_scale = quantize_fp_mm_input_tensorwise(input, dtype=scale.dtype) input, weight = check_mats(input, weight) dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) if groups == 1: - result = torch._scaled_mm(input, weight, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=scale.dtype) + result = torch._scaled_mm(input, weight, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=input_scale.dtype).mul_(input_scale) else: weight = weight.view(weight.shape[0], groups, weight.shape[1] // groups) input = input.view(input.shape[0], groups, input.shape[1] // groups) result = [] for i in range(groups): - result.append(torch._scaled_mm(input[:, i], weight[:, i], scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=scale.dtype)) - result = torch.cat(result, dim=-1) + result.append(torch._scaled_mm(input[:, i], weight[:, i], scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=input_scale.dtype)) + result = torch.cat(result, dim=-1).mul_(input_scale) if bias is not None: dequantize_symmetric_with_bias(result, scale, bias, dtype=return_dtype, result_shape=mm_output_shape) else: diff --git a/modules/sdnq/layers/conv/conv_int8.py b/modules/sdnq/layers/conv/conv_int8.py index b5b2dcebf..11ac7a68d 100644 --- a/modules/sdnq/layers/conv/conv_int8.py +++ b/modules/sdnq/layers/conv/conv_int8.py @@ -38,18 +38,18 @@ def conv_int8_matmul( if quantized_weight_shape is not None: weight = unpack_int(weight, weights_dtype, quantized_weight_shape, dtype=torch.int8).t_() scale = scale.t() - input, scale = quantize_int_mm_input(input, scale) + input, input_scale = quantize_int_mm_input(input, dtype=scale.dtype) input, weight = check_mats(input, weight) if groups == 1: - result = int_mm_func(input, weight) + result = int_mm_func(input, weight).to(dtype=input_scale.dtype).mul_(input_scale) else: weight = weight.view(weight.shape[0], groups, weight.shape[1] // groups) input = input.view(input.shape[0], groups, input.shape[1] // groups) result = [] for i in range(groups): result.append(int_mm_func(input[:, i], weight[:, i])) - result = torch.cat(result, dim=-1) + result = torch.cat(result, dim=-1).to(dtype=input_scale.dtype).mul_(input_scale) if bias is not None: result = dequantize_symmetric_with_bias(result, scale, bias, dtype=return_dtype, result_shape=mm_output_shape) else: diff --git a/modules/sdnq/layers/linear/linear_fp16.py b/modules/sdnq/layers/linear/linear_fp16.py index 705aaeb6f..3f3db8020 100644 --- a/modules/sdnq/layers/linear/linear_fp16.py +++ b/modules/sdnq/layers/linear/linear_fp16.py @@ -33,12 +33,12 @@ def fp16_matmul( bias = torch.addmm(bias.to(dtype=svd_down.dtype), torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) else: bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) - input, scale = quantize_fp_mm_input_tensorwise(input, scale, matmul_dtype="float16") + input, input_scale = quantize_fp_mm_input_tensorwise(input, dtype=scale.dtype, matmul_dtype="float16") input, weight = check_mats(input, weight) if bias is not None: - return dequantize_symmetric_with_bias(fp_mm_func(input, weight), scale, bias, dtype=return_dtype, result_shape=output_shape) + return dequantize_symmetric_with_bias(fp_mm_func(input, weight).to(dtype=input_scale.dtype).mul_(input_scale), scale, bias, dtype=return_dtype, result_shape=output_shape) else: - return dequantize_symmetric(fp_mm_func(input, weight), scale, dtype=return_dtype, result_shape=output_shape) + return dequantize_symmetric(fp_mm_func(input, weight).to(dtype=input_scale.dtype).mul_(input_scale), scale, dtype=return_dtype, result_shape=output_shape) def quantized_linear_forward_fp16_matmul(self, input: torch.FloatTensor) -> torch.FloatTensor: diff --git a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py index 235dde48d..59a122a78 100644 --- a/modules/sdnq/layers/linear/linear_fp8_tensorwise.py +++ b/modules/sdnq/layers/linear/linear_fp8_tensorwise.py @@ -9,13 +9,14 @@ from ...dequantizer import quantize_fp_mm, dequantize_symmetric, dequantize_symm from .forward import check_mats -def quantize_fp_mm_input_tensorwise(input: torch.FloatTensor, scale: torch.FloatTensor, matmul_dtype: str = "float8_e4m3fn") -> tuple[torch.Tensor, torch.FloatTensor]: - input = input.flatten(0,-2).to(dtype=scale.dtype) +def quantize_fp_mm_input_tensorwise(input: torch.FloatTensor, dtype: torch.dtype | None = None, matmul_dtype: str = "float8_e4m3fn") -> tuple[torch.Tensor, torch.FloatTensor]: + input = input.flatten(0,-2) + if dtype is not None: + input = input.to(dtype=dtype) input, input_scale = quantize_fp_mm(input, dim=-1, matmul_dtype=matmul_dtype) - scale = torch.mul(input_scale, scale) - if scale.dtype == torch.float16: # fp16 will overflow - scale = scale.to(dtype=torch.float32) - return input, scale + if input_scale.dtype == torch.float16: # fp16 will overflow + input_scale = input_scale.to(dtype=torch.float32) + return input, input_scale def fp8_matmul_tensorwise( @@ -40,12 +41,12 @@ def fp8_matmul_tensorwise( else: bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) dummy_input_scale = torch.ones(1, device=input.device, dtype=torch.float32) - input, scale = quantize_fp_mm_input_tensorwise(input, scale) + input, input_scale = quantize_fp_mm_input_tensorwise(input, dtype=scale.dtype) input, weight = check_mats(input, weight, allow_contiguous_mm=False) if bias is not None: - return dequantize_symmetric_with_bias(torch._scaled_mm(input, weight, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=scale.dtype), scale, bias, dtype=return_dtype, result_shape=output_shape) + return dequantize_symmetric_with_bias(torch._scaled_mm(input, weight, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=input_scale.dtype).to(dtype=input_scale.dtype).mul_(input_scale), scale, bias, dtype=return_dtype, result_shape=output_shape) else: - return dequantize_symmetric(torch._scaled_mm(input, weight, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=scale.dtype), scale, dtype=return_dtype, result_shape=output_shape) + return dequantize_symmetric(torch._scaled_mm(input, weight, scale_a=dummy_input_scale, scale_b=dummy_input_scale, bias=None, out_dtype=input_scale.dtype).to(dtype=input_scale.dtype).mul_(input_scale), scale, dtype=return_dtype, result_shape=output_shape) def quantized_linear_forward_fp8_matmul_tensorwise(self, input: torch.FloatTensor) -> torch.FloatTensor: diff --git a/modules/sdnq/layers/linear/linear_int8.py b/modules/sdnq/layers/linear/linear_int8.py index e34222c5f..2a0b08546 100644 --- a/modules/sdnq/layers/linear/linear_int8.py +++ b/modules/sdnq/layers/linear/linear_int8.py @@ -9,13 +9,14 @@ from ...packed_int import unpack_int # noqa: TID252 from .forward import check_mats -def quantize_int_mm_input(input: torch.FloatTensor, scale: torch.FloatTensor) -> tuple[torch.CharTensor, torch.FloatTensor]: - input = input.flatten(0,-2).to(dtype=scale.dtype) +def quantize_int_mm_input(input: torch.FloatTensor, dtype: torch.dtype | None = None) -> tuple[torch.CharTensor, torch.FloatTensor]: + input = input.flatten(0,-2) + if dtype is not None: + input = input.to(dtype=dtype) input, input_scale = quantize_int_mm(input, dim=-1) - scale = torch.mul(input_scale, scale) - if scale.dtype == torch.float16: # fp16 will overflow - scale = scale.to(dtype=torch.float32) - return input, scale + if input_scale.dtype == torch.float16: # fp16 will overflow + input_scale = input_scale.to(dtype=torch.float32) + return input, input_scale def int8_matmul( @@ -39,12 +40,12 @@ def int8_matmul( bias = torch.addmm(bias.to(dtype=svd_down.dtype), torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) else: bias = torch.mm(torch.mm(input.to(dtype=svd_down.dtype), svd_down), svd_up) - input, scale = quantize_int_mm_input(input, scale) + input, input_scale = quantize_int_mm_input(input, dtype=scale.dtype) input, weight = check_mats(input, weight) if bias is not None: - return dequantize_symmetric_with_bias(int_mm_func(input, weight), scale, bias, dtype=return_dtype, result_shape=output_shape) + return dequantize_symmetric_with_bias(int_mm_func(input, weight).to(dtype=input_scale.dtype).mul_(input_scale), scale, bias, dtype=return_dtype, result_shape=output_shape) else: - return dequantize_symmetric(int_mm_func(input, weight), scale, dtype=return_dtype, result_shape=output_shape) + return dequantize_symmetric(int_mm_func(input, weight).to(dtype=input_scale.dtype).mul_(input_scale), scale, dtype=return_dtype, result_shape=output_shape) def quantized_linear_forward_int8_matmul(self, input: torch.FloatTensor) -> torch.FloatTensor: diff --git a/modules/sdnq/triton_mm.py b/modules/sdnq/triton_mm.py index a633a395b..c8fb1a167 100644 --- a/modules/sdnq/triton_mm.py +++ b/modules/sdnq/triton_mm.py @@ -1,8 +1,10 @@ """ Modified from Triton MatMul example. -PyTorch torch._int_mm is broken on backward pass with Nvidia. -AMD RDNA2 doesn't support torch._int_mm, so we use int_mm via Triton. -PyTorch doesn't support FP32 output type with FP16 MM so we use Triton for it too. +PyTorch torch._int_mm is broken on backward pass with Nvidia, so we use Triton on the backward pass with Nvidia. +AMD RDNA2 doesn't support torch._int_mm as it requires INT8 WMMA, so we use INT8 DP4A via Triton. +PyTorch doesn't support FP32 output type with FP16 MM, so we use Triton for FP16 MM too. +matmul_configs we use takes AMD and Intel into consideration too. +SDNQ Triton configs can outperform RocBLAS and OneDNN. """ import torch @@ -22,7 +24,7 @@ matmul_configs = [ ] -@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk", "ACCUMULATOR_DTYPE"]) +@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk", "ACCUMULATOR_DTYPE"], cache_results=True) @triton.jit def triton_mm_kernel( a_ptr, b_ptr, c_ptr, @@ -76,6 +78,55 @@ def triton_mm_kernel( tl.store(c_ptrs, accumulator, mask=c_mask) +# Intel requires tensor descriptors to perform good +@triton.autotune(configs=matmul_configs, key=["M", "N", "K", "stride_bk", "ACCUMULATOR_DTYPE"], cache_results=True) +@triton.jit +def triton_mm_td_kernel( + a_ptr, b_ptr, c_ptr, + M: int, N: int, K: int, + stride_am: int, stride_ak: int, + stride_bk: int, stride_bn: int, + stride_cm: int, stride_cn: int, + ACCUMULATOR_DTYPE: tl.constexpr, + BLOCK_SIZE_M: tl.constexpr, + BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, + GROUP_SIZE_M: tl.constexpr, +): + pid = tl.program_id(axis=0) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + + tl.assume(pid_m >= 0) + tl.assume(pid_n >= 0) + tl.assume(stride_am > 0) + tl.assume(stride_ak > 0) + tl.assume(stride_bn > 0) + tl.assume(stride_bk > 0) + tl.assume(stride_cm > 0) + tl.assume(stride_cn > 0) + + a_desc = tl.make_tensor_descriptor(base=a_ptr, shape=(M, K), strides=(stride_am, stride_ak), block_shape=(BLOCK_SIZE_M, BLOCK_SIZE_K)) + b_desc = tl.make_tensor_descriptor(base=b_ptr, shape=(K, N), strides=(stride_bk, stride_bn), block_shape=(BLOCK_SIZE_K, BLOCK_SIZE_N)) + + off_k = 0 + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=ACCUMULATOR_DTYPE) + for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): + a = a_desc.load([pid_m * BLOCK_SIZE_M, off_k]) + b = b_desc.load([off_k, pid_n * BLOCK_SIZE_N]) + accumulator = tl.dot(a, b, accumulator, out_dtype=ACCUMULATOR_DTYPE) + off_k += BLOCK_SIZE_K + + c_desc = tl.make_tensor_descriptor(base=c_ptr, shape=(M, N), strides=(stride_cm, stride_cn), block_shape=(BLOCK_SIZE_M, BLOCK_SIZE_N)) + c_desc.store([pid_m * BLOCK_SIZE_M, pid_n * BLOCK_SIZE_N], accumulator) + + def int_mm(a: torch.Tensor, b: torch.Tensor) -> torch.Tensor: assert a.shape[1] == b.shape[0], "Incompatible dimensions" assert a.is_contiguous(), "Matrix A must be contiguous" @@ -84,7 +135,8 @@ def int_mm(a: torch.Tensor, b: torch.Tensor) -> torch.Tensor: c = torch.empty((M, N), device=a.device, dtype=torch.int32) def grid(META): return (triton.cdiv(M, META["BLOCK_SIZE_M"]) * triton.cdiv(N, META["BLOCK_SIZE_N"]), ) - triton_mm_kernel[grid]( + mm_kernel_func = triton_mm_td_kernel if b.is_contiguous() else triton_mm_kernel + mm_kernel_func[grid]( a, b, c, M, N, K, a.stride(0), a.stride(1), @@ -103,7 +155,8 @@ def fp_mm(a: torch.FloatTensor, b: torch.FloatTensor) -> torch.FloatTensor: c = torch.empty((M, N), device=a.device, dtype=torch.float32) def grid(META): return (triton.cdiv(M, META["BLOCK_SIZE_M"]) * triton.cdiv(N, META["BLOCK_SIZE_N"]), ) - triton_mm_kernel[grid]( + mm_kernel_func = triton_mm_td_kernel if b.is_contiguous() else triton_mm_kernel + mm_kernel_func[grid]( a, b, c, M, N, K, a.stride(0), a.stride(1), From b2e071dc52581ca6962e65c5920db4485656ad2b Mon Sep 17 00:00:00 2001 From: Disty0 Date: Sat, 4 Apr 2026 01:39:26 +0300 Subject: [PATCH 53/73] cleanup --- modules/sdnq/triton_mm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/sdnq/triton_mm.py b/modules/sdnq/triton_mm.py index c8fb1a167..cd04f6631 100644 --- a/modules/sdnq/triton_mm.py +++ b/modules/sdnq/triton_mm.py @@ -117,7 +117,7 @@ def triton_mm_td_kernel( off_k = 0 accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=ACCUMULATOR_DTYPE) - for k in range(0, tl.cdiv(K, BLOCK_SIZE_K)): + for _ in range(0, K, BLOCK_SIZE_K): a = a_desc.load([pid_m * BLOCK_SIZE_M, off_k]) b = b_desc.load([off_k, pid_n * BLOCK_SIZE_N]) accumulator = tl.dot(a, b, accumulator, out_dtype=ACCUMULATOR_DTYPE) From 32b69bdd3df31ecc50630d0506ee3bb667dd64b3 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 08:47:59 +0200 Subject: [PATCH 54/73] guard against spaces Signed-off-by: vladmandic --- installer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/installer.py b/installer.py index 906f037fd..f3517cdb6 100644 --- a/installer.py +++ b/installer.py @@ -474,6 +474,8 @@ def check_python(supported_minors=None, experimental_minors=None, reason=None): else: git_version = git('--version', folder=None, ignore=False) log.debug(f'Git: version={git_version.replace("git version", "").strip()}') + if ' ' in sys.executable: + log.warning(f'Python: path="{sys.executable}" contains spaces which may cause issues') ts('python', t_start) @@ -1244,7 +1246,7 @@ def install_requirements(): # set environment variables controling the behavior of various libraries def set_environment(): log.debug('Setting environment tuning') - os.environ.setdefault('PIP_CONSTRAINT', os.path.abspath('constraints.txt')) + os.environ.setdefault('PIP_CONSTRAINT', 'constraints.txt') os.environ.setdefault('ACCELERATE', 'True') os.environ.setdefault('ATTN_PRECISION', 'fp16') os.environ.setdefault('ClDeviceGlobalMemSizeAvailablePercent', '100') @@ -1277,7 +1279,7 @@ def set_environment(): os.environ.setdefault('MIOPEN_FIND_MODE', '2') os.environ.setdefault('UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS', '1') os.environ.setdefault('USE_TORCH', '1') - os.environ.setdefault('UV_CONSTRAINT', os.path.abspath('constraints.txt')) + os.environ.setdefault('UV_CONSTRAINT', 'constraints.txt') os.environ.setdefault('UV_INDEX_STRATEGY', 'unsafe-any-match') os.environ.setdefault('UV_NO_BUILD_ISOLATION', '1') os.environ.setdefault('UVICORN_TIMEOUT_KEEP_ALIVE', '60') From 90b5e7de308a27196663f526665b8ea257c2c629 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 08:56:37 +0200 Subject: [PATCH 55/73] update todo/changelog Signed-off-by: vladmandic --- CHANGELOG.md | 12 ++++++++++-- TODO.md | 2 ++ extensions-builtin/sdnext-modernui | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccacfd211..e7055ad3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,20 @@ # Change Log for SD.Next -## Update for 2026-04-02 +## Update for 2026-04-04 - **Models** - [AiArtLab SDXS-1B](https://huggingface.co/AiArtLab/sdxs-1b) Simple Diffusion XS *(training still in progress)* this model combines Qwen3.5-1.8B text encoder with SDXL-style UNET with only 1.6B parameters and custom 32ch VAE +- **Compute** + - **ROCm** futher work on advanced configuration and tuning, thanks @resonantsky + see *main interface -> scripts -> rocm advanced config* - **Internal** - - additional typing and typechecks, thanks @awsr + - additional typing and typechecks, thanks @awsr + - Prohibit python==3.14 unless `--experimental` +- **Fixes** + - UI CSS fixes, thanks @awsr + - detect/warn if space in system path + - add `ftfy` to requirements ## Update for 2026-04-01 diff --git a/TODO.md b/TODO.md index 99903bb98..4ec8cef9d 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,7 @@ # TODO + + ## Internal - Feature: implement `unload_auxiliary_models` diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index c7af727f3..e3720332f 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit c7af727f31758c9fc96cf0429bcf3608858a15e8 +Subproject commit e3720332f2301fa597c94b40897aa6e983020f1f From d7904b239f8bc6487fe1d3a7fd66cc2ffad51323 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 08:58:27 +0200 Subject: [PATCH 56/73] add ftfy Signed-off-by: vladmandic --- extensions-builtin/sdnext-modernui | 2 +- requirements.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index c7af727f3..d26ce4ae4 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit c7af727f31758c9fc96cf0429bcf3608858a15e8 +Subproject commit d26ce4ae4a2bdee809262cb5d9b4aa29ccb94bca diff --git a/requirements.txt b/requirements.txt index 7afff229f..ac428f720 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,6 +18,7 @@ fasteners limits orjson websockets +ftfy # versioned fastapi==0.124.4 From fbf1a962f20d2d864842444bcdb60d9146cdcd04 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 08:59:55 +0200 Subject: [PATCH 57/73] refresh Signed-off-by: vladmandic --- extensions-builtin/sdnext-modernui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index e3720332f..d26ce4ae4 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit e3720332f2301fa597c94b40897aa6e983020f1f +Subproject commit d26ce4ae4a2bdee809262cb5d9b4aa29ccb94bca From d98d05ca2de4df5468cf3a08f2c8a0daefe256db Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 10:53:07 +0200 Subject: [PATCH 58/73] update wiki Signed-off-by: vladmandic --- extensions-builtin/sdnext-modernui | 2 +- wiki | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index d26ce4ae4..e3720332f 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit d26ce4ae4a2bdee809262cb5d9b4aa29ccb94bca +Subproject commit e3720332f2301fa597c94b40897aa6e983020f1f diff --git a/wiki b/wiki index a9b73a500..cbbbfc73a 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit a9b73a50018a08a1ac35fb15c7f7c86515b79d13 +Subproject commit cbbbfc73af2366650cdf8cc71fabbf3a508b607b From 2fcabc80471f0824d22036c21fd89cdcdf1d22e9 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 11:03:34 +0200 Subject: [PATCH 59/73] fix upscaler init causing server fail Signed-off-by: vladmandic --- modules/modelloader.py | 23 +++++++++++++++-------- modules/ui_sections.py | 2 ++ wiki | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/modelloader.py b/modules/modelloader.py index 974a4b1a5..649ff4aa9 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -430,6 +430,7 @@ def move_files(src_path: str, dest_path: str, ext_filter: str | None = None): def load_upscalers(): # We can only do this 'magic' method to dynamically load upscalers if they are referenced, so we'll try to import any _model.py files before looking in __subclasses__ t0 = time.time() + shared.sd_upscalers = ['None'] modules_dir = os.path.join(paths.script_path, "modules", "postprocess") for file in os.listdir(modules_dir): if "_model.py" in file: @@ -449,14 +450,20 @@ def load_upscalers(): used_classes[classname] = cls upscaler_types = [] for cls in reversed(used_classes.values()): - name = cls.__name__ - cmd_name = f"{name.lower().replace('upscaler', '')}_models_path" - commandline_model_path = commandline_options.get(cmd_name, None) - scaler = cls(commandline_model_path) - scaler.user_path = commandline_model_path - scaler.model_download_path = commandline_model_path or scaler.model_path - upscalers += scaler.scalers - upscaler_types.append(name[8:]) + try: + name = cls.__name__ + cmd_name = f"{name.lower().replace('upscaler', '')}_models_path" + commandline_model_path = commandline_options.get(cmd_name, None) + scaler = cls(commandline_model_path) + scaler.user_path = commandline_model_path + scaler.model_download_path = commandline_model_path or scaler.model_path + upscalers += scaler.scalers + upscaler_types.append(name[8:]) + except Exception as e: + log.error(f'Upscaler: {cls} {e}') + if len(upscalers) == 0: + log.warning('Upscalers: no data') + upscalers = ['None'] shared.sd_upscalers = upscalers t1 = time.time() log.info(f"Available Upscalers: items={len(shared.sd_upscalers)} downloaded={len([x for x in shared.sd_upscalers if x.data_path is not None and os.path.isfile(x.data_path)])} user={len([x for x in shared.sd_upscalers if x.custom])} time={t1-t0:.2f} types={upscaler_types}") diff --git a/modules/ui_sections.py b/modules/ui_sections.py index 09108d716..630c7be76 100644 --- a/modules/ui_sections.py +++ b/modules/ui_sections.py @@ -365,6 +365,8 @@ def create_resize_inputs(tab, images, accordion=True, latent=False, non_zero=Tru with gr.Accordion(open=False, label="Resize", elem_classes=["small-accordion"], elem_id=f"{tab}_resize_group") if accordion else gr.Group(): with gr.Row(): available_upscalers = [x.name for x in shared.sd_upscalers] + if len(available_upscalers) == 0: + available_upscalers = ['None'] if not latent: available_upscalers = [x for x in available_upscalers if not x.lower().startswith('latent')] resize_mode = gr.Dropdown(label=f"Mode{prefix}" if non_zero else "Resize mode", elem_id=f"{tab}_resize_mode", choices=shared.resize_modes, type="index", value='Fixed') diff --git a/wiki b/wiki index a9b73a500..cbbbfc73a 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit a9b73a50018a08a1ac35fb15c7f7c86515b79d13 +Subproject commit cbbbfc73af2366650cdf8cc71fabbf3a508b607b From 155dabc84069eed634f91806c66f1c99df0a0a75 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 11:09:39 +0200 Subject: [PATCH 60/73] cleanup Signed-off-by: vladmandic --- modules/modelloader.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/modelloader.py b/modules/modelloader.py index 649ff4aa9..8146620c5 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -430,7 +430,6 @@ def move_files(src_path: str, dest_path: str, ext_filter: str | None = None): def load_upscalers(): # We can only do this 'magic' method to dynamically load upscalers if they are referenced, so we'll try to import any _model.py files before looking in __subclasses__ t0 = time.time() - shared.sd_upscalers = ['None'] modules_dir = os.path.join(paths.script_path, "modules", "postprocess") for file in os.listdir(modules_dir): if "_model.py" in file: @@ -462,8 +461,7 @@ def load_upscalers(): except Exception as e: log.error(f'Upscaler: {cls} {e}') if len(upscalers) == 0: - log.warning('Upscalers: no data') - upscalers = ['None'] + log.error('Upscalers: no data') shared.sd_upscalers = upscalers t1 = time.time() log.info(f"Available Upscalers: items={len(shared.sd_upscalers)} downloaded={len([x for x in shared.sd_upscalers if x.data_path is not None and os.path.isfile(x.data_path)])} user={len([x for x in shared.sd_upscalers if x.custom])} time={t1-t0:.2f} types={upscaler_types}") From e6b29faf5572e8d50e733ef86e558b868c5c7df9 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sat, 4 Apr 2026 11:12:18 +0200 Subject: [PATCH 61/73] update changelog Signed-off-by: vladmandic --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7055ad3a..782ec44bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,12 @@ see *main interface -> scripts -> rocm advanced config* - **Internal** - additional typing and typechecks, thanks @awsr - - Prohibit python==3.14 unless `--experimental` - **Fixes** + - Prohibit `python==3.14` unless `--experimental` - UI CSS fixes, thanks @awsr - - detect/warn if space in system path + - detect/warn if space present in system path - add `ftfy` to requirements + - fix upscaler init error should not block server ## Update for 2026-04-01 From 0add6a4642f53e4ac83c0ac190616c2a435191de Mon Sep 17 00:00:00 2001 From: resonantsky Date: Sat, 4 Apr 2026 21:17:42 +0200 Subject: [PATCH 62/73] Properly platform agnostic paths. --- scripts/rocm/rocm_vars.py | 20 +++++++++++++++++--- scripts/rocm_ext.py | 4 ++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/scripts/rocm/rocm_vars.py b/scripts/rocm/rocm_vars.py index 0ecdf8298..74714610d 100644 --- a/scripts/rocm/rocm_vars.py +++ b/scripts/rocm/rocm_vars.py @@ -1,15 +1,29 @@ +import os +import sys +import sysconfig from typing import Dict, Any, List, Tuple + +def _sitepackages_subpath(*parts: str) -> str: + """Return a {VIRTUAL_ENV}-prefixed path into site-packages using OS-native separators. + + Works on both Windows (Lib/site-packages) and Linux (lib/pythonX.Y/site-packages). + """ + site_pkgs = sysconfig.get_path('purelib') # absolute path to site-packages inside the active venv + rel = os.path.relpath(site_pkgs, sys.prefix) # platform-correct relative sub-path under venv root + return os.path.join("{VIRTUAL_ENV}", rel, *parts) + + GENERAL_VARS: Dict[str, Dict[str, Any]] = { "MIOPEN_SYSTEM_DB_PATH": { - "default": "{VIRTUAL_ENV}\\Lib\\site-packages\\_rocm_sdk_devel\\bin\\", + "default": _sitepackages_subpath("_rocm_sdk_devel", "bin") + os.sep, "desc": "MIOpen system DB path", "widget": "textbox", "options": None, "restart_required": True, }, "ROCBLAS_TENSILE_LIBPATH": { - "default": "{VIRTUAL_ENV}\\Lib\\site-packages\\_rocm_sdk_devel\\bin\\rocblas\\library", + "default": _sitepackages_subpath("_rocm_sdk_devel", "bin", "rocblas", "library"), "desc": "rocBLAS Tensile library path", "widget": "textbox", "options": None, @@ -86,7 +100,7 @@ GENERAL_VARS: Dict[str, Dict[str, Any]] = { "restart_required": False, }, "PYTORCH_TUNABLEOP_CACHE_DIR": { - "default": "{ROOT}\\models\\tunable", + "default": os.path.join("{ROOT}", "models", "tunable"), "desc": "TunableOp cache directory", "widget": "textbox", "options": None, diff --git a/scripts/rocm_ext.py b/scripts/rocm_ext.py index d3a5f1467..85c36adf5 100644 --- a/scripts/rocm_ext.py +++ b/scripts/rocm_ext.py @@ -7,7 +7,7 @@ from modules import scripts_manager, shared class ROCmScript(scripts_manager.Script): def title(self): - return "Windows ROCm: Advanced Config" + return "ROCm: Advanced Config" def show(self, _is_img2img): if shared.cmd_opts.use_rocm or installer.torch_info.get('type') == 'rocm': @@ -35,7 +35,7 @@ class ROCmScript(scripts_manager.Script): choices = rocm_mgr._dropdown_choices(meta["options"]) display = rocm_mgr._dropdown_display(val, meta["options"]) return gr.Dropdown(label=meta["desc"], choices=choices, value=display, elem_id=f"rocm_var_{name.lower()}") - return gr.Textbox(label=meta["desc"], value=rocm_mgr._expand_venv(val), lines=1) + return gr.Textbox(label=meta["desc"], value=rocm_mgr._expand_venv(val), lines=2) def _info_html(): d = rocm_mgr.info() From 973e137f2940e426edfe31683b971cd7a5f4dfb7 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Sun, 5 Apr 2026 10:33:13 +0200 Subject: [PATCH 63/73] update torch_info Signed-off-by: vladmandic --- CHANGELOG.md | 5 +- TODO.md | 3 +- installer.py | 173 +++++++++++++++++++++++++----------------- javascript/monitor.js | 2 +- 4 files changed, 108 insertions(+), 75 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 782ec44bd..ac2f2d929 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,13 @@ # Change Log for SD.Next -## Update for 2026-04-04 +## Update for 2026-04-05 - **Models** - [AiArtLab SDXS-1B](https://huggingface.co/AiArtLab/sdxs-1b) Simple Diffusion XS *(training still in progress)* this model combines Qwen3.5-1.8B text encoder with SDXL-style UNET with only 1.6B parameters and custom 32ch VAE - **Compute** - **ROCm** futher work on advanced configuration and tuning, thanks @resonantsky + now covers both ROCm on Windows and Linux see *main interface -> scripts -> rocm advanced config* - **Internal** - additional typing and typechecks, thanks @awsr @@ -16,6 +17,8 @@ - detect/warn if space present in system path - add `ftfy` to requirements - fix upscaler init error should not block server + - improve torch nvidia arch detection + - add torch amd arch detection ## Update for 2026-04-01 diff --git a/TODO.md b/TODO.md index 4ec8cef9d..35cfcda8b 100644 --- a/TODO.md +++ b/TODO.md @@ -1,7 +1,5 @@ # TODO - - ## Internal - Feature: implement `unload_auxiliary_models` @@ -48,6 +46,7 @@ TODO: Investigate which models are diffusers-compatible and prioritize! ### Image-Base +- [NucleusMoe]( Date: Sun, 5 Apr 2026 21:29:18 +0200 Subject: [PATCH 64/73] fix prompt weighted lists Signed-off-by: vladmandic --- CHANGELOG.md | 1 + modules/styles.py | 72 +++++++++++++++---------------------- test/test-weighted-lists.py | 69 +++++++++++++++++++---------------- 3 files changed, 68 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac2f2d929..7379c1b3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - fix upscaler init error should not block server - improve torch nvidia arch detection - add torch amd arch detection + - fix prompt weighted lists and internal wildcards ## Update for 2026-04-01 diff --git a/modules/styles.py b/modules/styles.py index 9b024a056..02a154e2b 100644 --- a/modules/styles.py +++ b/modules/styles.py @@ -46,64 +46,48 @@ def apply_styles_to_prompt(prompt, styles): def select_from_weighted_list(inner: str) -> str: - if not inner: + def _split_weight(p: str): + """Split 'name:weight' where the colon separator must not be inside brackets. Returns (name, wstr) or None.""" + depth = 0 + last_colon = -1 + for i, c in enumerate(p): + if c in '<([{': + depth += 1 + elif c in '>)]}': + if depth > 0: + depth -= 1 + elif c == ':' and depth == 0: + last_colon = i + if last_colon < 0: + return None + return p[:last_colon].strip(), p[last_colon + 1:].strip() + + if not inner or len(inner.strip()) == 0: return '' parts = [p.strip() for p in inner.split('|') if p.strip()] weighted: dict[str, float] = {} - unweighted = [] for p in parts: - is_list = (p.startswith('(') and p.endswith(')')) or \ - (p.startswith('[') and p.endswith(']')) or \ - (p.startswith('{') and p.endswith('}')) or \ - (p.startswith('<') and p.endswith('>')) - if (':' in p) and not is_list: - name, wstr = p.split(':', 1) - name = name.strip() + split = _split_weight(p) + if split is not None: + name, wstr = split try: - w = float(wstr.strip()) + w = float(wstr) except Exception: w = 0.0 w = max(0.0, w) weighted[name] = weighted.get(name, 0.0) + w else: - unweighted.append(p) + weighted[p] = 1.0 W = sum(weighted.values()) - U = len(unweighted) - - if U == 0: # only weighted options - keys = list(weighted.keys()) - if not keys: - return '' - if W == 0.0: - return '' - if abs(W - 1.0) > 1e-12: - weighted = {k: v / W for k, v in weighted.items()} - else: # mix of weighted and unweighted - if W > 1.0: # weighted probabilities consume whole mass -> normalize them, unweighted get 0 - for name in unweighted: - weighted[name] = weighted.get(name, 0.0) + 1.0 - total_before = sum(weighted.values()) - if total_before > 0.0: - weighted = {k: v / total_before for k, v in weighted.items()} - else: - remaining = 1.0 - W - per = remaining / U if U > 0 else 0.0 - for name in unweighted: - weighted[name] = weighted.get(name, 0.0) + per - - items = list(weighted.items()) - if not items: - return '' - - total = sum(v for _, v in items) - if total <= 0.0: - return items[0][0] - - names, weights = zip(*items, strict=False) - return random.choices(names, weights=weights, k=1)[0] + if len(weighted) == 0 or W <= 0.0: + return inner + weighted = {k: v / W for k, v in weighted.items()} # normalize to sum=1 + names, weights = zip(*weighted.items(), strict=False) + choice = random.choices(names, weights=weights, k=1)[0] + return choice def apply_curly_braces_to_prompt(prompt, seed=-1): diff --git a/test/test-weighted-lists.py b/test/test-weighted-lists.py index 38ceb0e41..5497836da 100644 --- a/test/test-weighted-lists.py +++ b/test/test-weighted-lists.py @@ -4,10 +4,11 @@ import sys import os from collections import Counter + script_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.chdir(script_dir) -# --- test defition ------------------------------- + # library fn = r'./modules/styles.py' # tested function @@ -15,9 +16,9 @@ funcname = 'select_from_weighted_list' # random needed ns = {'Dict': dict, 'random': __import__('random')} # number of samples to test -tries = 2000 +tries = 10000 # allowed deviation in percentage points -tolerance_pct = 5 +tolerance_pct = 2.0 # tests tests = [ # - empty @@ -25,24 +26,33 @@ tests = [ # - no weights [ "red|blonde|black", { 'black': 33, 'red': 33, 'blonde': 33 } ], # - full weights <= 1 - [ "red:0.1|blonde:0.9", { 'blonde': 90, 'red': 10 } ], + [ "red:0.1|blonde:0.9", { 'red': 10, 'blonde': 90 } ], # - weights > 1 to test normalization - [ "red:1|blonde:2|black:5", { 'blonde': 25, 'red': 12.5, 'black': 62.5 } ], + [ "red:1|blonde:2|black:5", { 'red': 12.5, 'blonde': 25, 'black': 62.5 } ], # - disabling 0 weights to force one result [ "red:0|blonde|black:0", { 'blonde': 100 } ], # - weights <= 1 with distribution of the leftover - [ "red:0.5|blonde|black:0.3|brown", { 'red': 50, 'black': 30, 'brown': 10, 'blonde': 10 } ], + [ "red:0.5|blonde|black:0.3|brown", { 'red': 0.5, 'blonde': 1.0, 'black': 0.3, 'brown': 1.0 } ], # - weights > 1, unweightes should get default of 1 [ "red:2|blonde|black", { 'red': 50, 'blonde': 25, 'black': 25 } ], # - ignore content of () - [ "red:0.5|(blonde:1.3)", { 'red': 50, '(blonde:1.3)': 50 } ], + [ "red:0.5|(blonde:1.3)", { 'red': 50, '(blonde:1.3)': 100 } ], + # - ignore content of () + [ "red:0.5|(blonde:1.3):0.5", { 'red': 50, '(blonde:1.3)': 50 } ], # - ignore content of [] - [ "red:0.5|[stuff:1.3]", { '[stuff:1.3]': 50, 'red': 50 } ], + [ "red:0.5|[stuff:1.3]", { 'red': 50, '[stuff:1.3]': 100 } ], # - ignore content of <> - [ "red:0.5|", { '': 50, 'red': 50 } ] + [ "red:0.5|", { 'red': 50, '': 100 } ], + # - simple list, 1 entry with lora with weights + [ "red||black", { 'black': 33, 'red': 33, '': 33 } ], + # - simple list, 1 entry with loraand comma + [ "red|blonde |black", { 'black': 33, 'red': 33, 'blonde ': 33 } ], + # - simple list, 1 entry with lora and comma + [ "red|blonde, |black", { 'black': 33, 'red': 33, 'blonde, ': 33 } ], + # - simple list, 1 entry with lora and comma + [ "red|blonde, |black:2", { 'black': 50, 'red': 25, 'blonde, ': 25 } ], ] -# ------------------------------------------------- with open(fn, 'r', encoding='utf-8') as f: src = f.read() @@ -57,7 +67,7 @@ with open(fn, 'r', encoding='utf-8') as f: end = min(end_candidates) if end_candidates else len(src) func_src = src[start:end] - exec(func_src, ns) + exec(func_src, ns) # pylint: disable=exec-used func = ns.get(funcname) if func is None: print('Failed to extract function') @@ -65,16 +75,12 @@ with open(fn, 'r', encoding='utf-8') as f: print('Running' , tries, 'isolated quick tests for ' + funcname + ':\n') - """Print test summary.""" - print("\n" + "=" * 70) - print("TEST SUMMARY") - print("=" * 70) - for t in tests: - print('INPUT:', t) + print('Input:', t[0]) samples = [func(t[0]) for _ in range(tries)] c = Counter(samples) - print("SAMPLES: ", dict(c)) + print(" Expected:", dict(t[1])) + print(" Samples:", dict(c)) # validation expected_pct = t[1] @@ -85,29 +91,32 @@ with open(fn, 'r', encoding='utf-8') as f: if missing or unexpected: if missing: - print("MISSING: ", sorted(missing)) + print(" Missing: ", sorted(missing)) if unexpected: - print("UNEXPECTED: ", sorted(unexpected)) - print("RESULT: FAILED (keys)") - print('') + print(" Unexpected: ", sorted(unexpected)) + print(" Result: FAIL keys") continue failures = [] + W = sum(expected_pct.values()) + deviations = {} for k, pct in expected_pct.items(): - expected_count = tries * (pct / 100.0) + pct = pct / W # normalize + expected_count = tries * pct actual_count = c.get(k, 0) - actual_pct = (actual_count / tries) * 100.0 - if abs(actual_pct - pct) > tolerance_pct: + actual_pct = actual_count / tries + deviation_pct = abs(actual_pct - pct) + deviations[k] = deviation_pct + if deviation_pct > tolerance_pct / 100.0: failures.append( f"{k}: expected {pct:.1f}%, got {actual_pct:.1f}% " f"({actual_count}/{tries})" ) + print(" Deviations:", {k: f"{v*100:.2f}%" for k, v in deviations.items()}) if failures: - print("OUT OF RANGE: ") for line in failures: - print(" - " + line) - print("RESULT: FAILED (distribution)") + print(" " + line) + print(" Result: FAIL distribution") else: - print("RESULT: PASSED") - print('') + print(" Result: PASS") From 4c5454d54a295e7de9f3e8fb569694d18ff2e471 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 6 Apr 2026 07:57:04 +0200 Subject: [PATCH 65/73] improve select_from_weighted_list Signed-off-by: vladmandic --- modules/styles.py | 21 ++++++++------------- test/test-weighted-lists.py | 5 ++++- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/modules/styles.py b/modules/styles.py index 02a154e2b..28c8246bb 100644 --- a/modules/styles.py +++ b/modules/styles.py @@ -59,27 +59,22 @@ def select_from_weighted_list(inner: str) -> str: elif c == ':' and depth == 0: last_colon = i if last_colon < 0: - return None + return p, 1.0 return p[:last_colon].strip(), p[last_colon + 1:].strip() if not inner or len(inner.strip()) == 0: return '' - parts = [p.strip() for p in inner.split('|') if p.strip()] + parts = [p.strip() for p in inner.split('|')] weighted: dict[str, float] = {} for p in parts: - split = _split_weight(p) - if split is not None: - name, wstr = split - try: - w = float(wstr) - except Exception: - w = 0.0 - w = max(0.0, w) - weighted[name] = weighted.get(name, 0.0) + w - else: - weighted[p] = 1.0 + name, weight = _split_weight(p) + try: + w = float(weight) + except Exception: + w = 1.0 + weighted[name] = weighted.get(name, 0.0) + max(0.0, w) W = sum(weighted.values()) if len(weighted) == 0 or W <= 0.0: diff --git a/test/test-weighted-lists.py b/test/test-weighted-lists.py index 5497836da..6fb8e36d1 100644 --- a/test/test-weighted-lists.py +++ b/test/test-weighted-lists.py @@ -25,6 +25,10 @@ tests = [ ["", { '': 100 } ], # - no weights [ "red|blonde|black", { 'black': 33, 'red': 33, 'blonde': 33 } ], + # - list with empty entry + [ "red||black", { 'black': 33, 'red': 33, '': 33 } ], + # - list with repeated entry + [ "red|blonde|blonde", { 'red': 33, 'blonde': 66 } ], # - full weights <= 1 [ "red:0.1|blonde:0.9", { 'red': 10, 'blonde': 90 } ], # - weights > 1 to test normalization @@ -53,7 +57,6 @@ tests = [ [ "red|blonde, |black:2", { 'black': 50, 'red': 25, 'blonde, ': 25 } ], ] - with open(fn, 'r', encoding='utf-8') as f: src = f.read() start = src.find('def ' + funcname) From 861f8eff3472e485f0bc9ea635388df41ab5b695 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 6 Apr 2026 08:38:14 +0200 Subject: [PATCH 66/73] update todo Signed-off-by: vladmandic --- TODO.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index 35cfcda8b..b522a9011 100644 --- a/TODO.md +++ b/TODO.md @@ -58,11 +58,13 @@ TODO: Investigate which models are diffusers-compatible and prioritize! ### Image-Edit +- [JoyAI Image Edit](https://huggingface.co/jdopensource/JoyAI-Image-Edit) - [Bria FIBO-Edit](https://huggingface.co/briaai/Fibo-Edit-RMBG): Fully JSON-based instruction-following image editing framework - [Meituan LongCat-Image-Edit-Turbo](https://huggingface.co/meituan-longcat/LongCat-Image-Edit-Turbo):6B instruction-following image editing with high visual consistency - [VIBE Image-Edit](https://huggingface.co/iitolstykh/VIBE-Image-Edit): (Sana+Qwen-VL)Fast visual instruction-based image editing framework - [LucyEdit](https://github.com/huggingface/diffusers/pull/12340):Instruction-guided video editing while preserving motion and identity - [Step1X-Edit](https://github.com/stepfun-ai/Step1X-Edit):Multimodal image editing decoding MLLM tokens via DiT +- [Step1X-Edit-v1p2](https://huggingface.co/stepfun-ai/Step1X-Edit-v1p2) - [OneReward](https://github.com/bytedance/OneReward):Reinforcement learning grounded generative reward model for image editing - [ByteDance DreamO](https://huggingface.co/ByteDance/DreamO): image customization framework for IP adaptation and virtual try-on - [nVidia Cosmos-Transfer-2.5](https://github.com/huggingface/diffusers/pull/13066) @@ -82,7 +84,7 @@ TODO: Investigate which models are diffusers-compatible and prioritize! - [HunyuanVideo-Avatar / HunyuanCustom](https://huggingface.co/tencent/HunyuanVideo-Avatar): (HunyuanVideo)MM-DiT based dynamic emotion-controllable dialogue generation - [Sana Image→Video (Sana-I2V)](https://github.com/huggingface/diffusers/pull/12634#issuecomment-3540534268): (Sana)Compact Linear DiT framework for efficient high-resolution video - [Wan-2.2 S2V (diffusers PR)](https://github.com/huggingface/diffusers/pull/12258): (Wan2.2)Audio-driven cinematic speech-to-video generation -- [LongCat-Video](https://huggingface.co/meituan-longcat/LongCat-Video): Unified framework for minutes-long coherent video generation via Block Sparse Attention +- [Meituan LongCat-Video](https://huggingface.co/meituan-longcat/LongCat-Video): Unified framework for minutes-long coherent video generation via Block Sparse Attention - [LTXVideo / LTXVideo LongMulti (diffusers PR)](https://github.com/huggingface/diffusers/pull/12614): Real-time DiT-based generation with production-ready camera controls - [DiffSynth-Studio (ModelScope)](https://github.com/modelscope/DiffSynth-Studio): (Wan2.2)Comprehensive training and quantization tools for Wan video models - [Phantom (Phantom HuMo)](https://github.com/Phantom-video/Phantom): Human-centric video generation framework focus on subject ID consistency From a07e9cc7e1c5f81453644a73a1fda096f3a12ba2 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Mon, 6 Apr 2026 09:19:43 +0200 Subject: [PATCH 67/73] hijack hf download Signed-off-by: vladmandic --- CHANGELOG.md | 3 ++- modules/sd_hijack_hfhub.py | 49 ++++++++++++++++++++++++++++++++++++++ modules/sd_models.py | 4 +++- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 modules/sd_hijack_hfhub.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 7379c1b3a..a790d8a92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2026-04-05 +## Update for 2026-04-06 - **Models** - [AiArtLab SDXS-1B](https://huggingface.co/AiArtLab/sdxs-1b) Simple Diffusion XS *(training still in progress)* @@ -11,6 +11,7 @@ see *main interface -> scripts -> rocm advanced config* - **Internal** - additional typing and typechecks, thanks @awsr + - wrap hf download methods - **Fixes** - Prohibit `python==3.14` unless `--experimental` - UI CSS fixes, thanks @awsr diff --git a/modules/sd_hijack_hfhub.py b/modules/sd_hijack_hfhub.py new file mode 100644 index 000000000..2c06c7c58 --- /dev/null +++ b/modules/sd_hijack_hfhub.py @@ -0,0 +1,49 @@ +import os +from modules.logger import log + + +debug = log.trace if os.environ.get('SD_DOWNLOAD_DEBUG', None) is not None else lambda *args, **kwargs: None +orig_http_get = None +orig_xet_get = None + + +def http_get_hijack(*args, **kwargs): + from modules.shared import state + if len(args) > 0 and isinstance(args[0], str) and args[0].endswith(".json"): + return orig_http_get(*args, **kwargs) + jobid = state.begin('Download') + fn = kwargs.get("displayed_filename", None) + size = kwargs.get("expected_size", None) + if fn: + log.debug(f'Download start: type=http fn="{fn}" size={size}') + debug(f'Download start: type=http args={args} kwargs={kwargs}') + res = orig_http_get(*args, **kwargs) + debug(f'Download end: type=http res={res}') + state.end(jobid) + return res + + +def xet_get_hijack(*args, **kwargs): + from modules.shared import state + if len(args) > 0 and isinstance(args[0], str) and args[0].endswith(".json"): + return orig_xet_get(*args, **kwargs) + jobid = state.begin('Download') + fn = kwargs.get("displayed_filename", None) + size = kwargs.get("expected_size", None) + if fn: + log.debug(f'Download start: type=xet fn="{fn}" size={size}') + debug(f'Download start: type=xet args={args} kwargs={kwargs}') + res = orig_xet_get(*args, **kwargs) + debug(f'Download end: type=xet res={res}') + state.end(jobid) + return res + + +def init_hijack(): + from huggingface_hub import file_download + global orig_http_get, orig_xet_get # pylint: disable=global-statement + if orig_http_get is None or orig_xet_get is None: + orig_http_get = file_download.http_get + orig_xet_get = file_download.xet_get + file_download.http_get = http_get_hijack + file_download.xet_get = xet_get_hijack diff --git a/modules/sd_models.py b/modules/sd_models.py index d33396b9b..b3ac8f8d8 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -11,7 +11,7 @@ import diffusers.loaders.single_file_utils import torch import huggingface_hub as hf from modules.logger import log -from modules import timer, paths, shared, shared_items, modelloader, devices, script_callbacks, sd_vae, sd_unet, errors, sd_models_compile, sd_detect, model_quant, sd_hijack_te, sd_hijack_accelerate, sd_hijack_safetensors, attention +from modules import timer, paths, shared, shared_items, modelloader, devices, script_callbacks, sd_vae, sd_unet, errors, sd_models_compile, sd_detect, model_quant, sd_hijack_te, sd_hijack_accelerate, sd_hijack_safetensors, sd_hijack_hfhub, attention from modules.memstats import memory_stats from modules.shared_helpers import walk_files from modules.modeldata import model_data @@ -71,6 +71,7 @@ def set_huggingface_options(quiet=False): sd_hijack_safetensors.hijack_safetensors(shared.opts.runai_streamer_diffusers, shared.opts.runai_streamer_transformers) else: sd_hijack_safetensors.restore_safetensors() + sd_hijack_hfhub.init_hijack() def set_caption_load_options(): @@ -85,6 +86,7 @@ def set_caption_load_options(): if shared.opts.caption_to_gpu: log.debug(f'Caption loader: to_gpu={shared.opts.caption_to_gpu}') sd_hijack_safetensors.restore_safetensors() + sd_hijack_hfhub.init_hijack() def set_vae_options(sd_model, vae=None, op:str='model', quiet:bool=False): From c003b0eb48904a96cca271406d4b137e9bee9bfe Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Mon, 6 Apr 2026 01:06:19 -0700 Subject: [PATCH 68/73] PIL Image.Image type fix --- cli/gen-styles.py | 2 +- cli/image-exif.py | 2 +- cli/process.py | 6 +++--- modules/control/proc/marigold/__init__.py | 2 +- modules/control/proc/marigold/marigold_pipeline.py | 2 +- modules/control/processors.py | 2 +- modules/gr_tempdir.py | 2 +- modules/masking.py | 2 +- modules/processing_helpers.py | 2 +- modules/seedvr/src/utils/color_fix.py | 4 ++-- modules/upscaler_algo.py | 8 ++++---- modules/upscaler_simple.py | 4 ++-- modules/upscaler_spandrel.py | 2 +- modules/upscaler_vae.py | 4 ++-- scripts/daam/trace.py | 2 +- 15 files changed, 23 insertions(+), 23 deletions(-) diff --git a/cli/gen-styles.py b/cli/gen-styles.py index 1171265a5..8512f4436 100755 --- a/cli/gen-styles.py +++ b/cli/gen-styles.py @@ -24,7 +24,7 @@ options = { styles = [] -def pil_to_b64(img: Image, size: int, quality: int): +def pil_to_b64(img: Image.Image, size: int, quality: int): img = img.convert('RGB') img = img.resize((size, size)) buffer = io.BytesIO() diff --git a/cli/image-exif.py b/cli/image-exif.py index fc2573220..e63fd9e71 100755 --- a/cli/image-exif.py +++ b/cli/image-exif.py @@ -33,7 +33,7 @@ class Exif: # pylint: disable=single-string-used-for-slots return self.__dict__[attr] return self.exif.get(attr, None) - def load(self, img: Image): + def load(self, img: Image.Image): img.load() # exif may not be ready exif_dict = {} try: diff --git a/cli/process.py b/cli/process.py index dcb4278d9..ef205c141 100644 --- a/cli/process.py +++ b/cli/process.py @@ -35,7 +35,7 @@ class Result(): self.steps = requested -def detect_blur(image: Image): +def detect_blur(image: Image.Image): # based on bw = ImageOps.grayscale(image) cx, cy = image.size[0] // 2, image.size[1] // 2 @@ -49,7 +49,7 @@ def detect_blur(image: Image): return mean -def detect_dynamicrange(image: Image): +def detect_dynamicrange(image: Image.Image): # based on data = np.asarray(image) image = np.float32(data) @@ -68,7 +68,7 @@ def detect_dynamicrange(image: Image): return round(res, 2) -def detect_simmilar(image: Image): +def detect_simmilar(image: Image.Image): img = image.resize((options.process.similarity_size, options.process.similarity_size)) img = ImageOps.grayscale(img) data = np.array(img) diff --git a/modules/control/proc/marigold/__init__.py b/modules/control/proc/marigold/__init__.py index af29be777..3fb7f6f52 100644 --- a/modules/control/proc/marigold/__init__.py +++ b/modules/control/proc/marigold/__init__.py @@ -21,7 +21,7 @@ class MarigoldDetector: def __call__( self, - input_image: Image, + input_image: Image.Image, denoising_steps: int = 10, ensemble_size: int = 10, processing_res: int = 768, diff --git a/modules/control/proc/marigold/marigold_pipeline.py b/modules/control/proc/marigold/marigold_pipeline.py index ac60f833e..768c67684 100644 --- a/modules/control/proc/marigold/marigold_pipeline.py +++ b/modules/control/proc/marigold/marigold_pipeline.py @@ -105,7 +105,7 @@ class MarigoldPipeline(DiffusionPipeline): @torch.no_grad() def __call__( self, - input_image: Image, + input_image: Image.Image, denoising_steps: int = 10, ensemble_size: int = 10, processing_res: int = 768, diff --git a/modules/control/processors.py b/modules/control/processors.py index 7a0f5a1fd..bdf5e53c7 100644 --- a/modules/control/processors.py +++ b/modules/control/processors.py @@ -304,7 +304,7 @@ class Processor: display(e, 'Control Processor load') return f'Processor load filed: {processor_id}' - def __call__(self, image_input: Image, mode: str = 'RGB', width: int = 0, height: int = 0, resize_mode: int = 0, resize_name: str = 'None', scale_tab: int = 1, scale_by: float = 1.0, local_config: dict | None = None): + def __call__(self, image_input: Image.Image, mode: str = 'RGB', width: int = 0, height: int = 0, resize_mode: int = 0, resize_name: str = 'None', scale_tab: int = 1, scale_by: float = 1.0, local_config: dict | None = None): """Run the preprocessor on an input image and return the processed control map. Args: diff --git a/modules/gr_tempdir.py b/modules/gr_tempdir.py index 691933e87..4cbba49c0 100644 --- a/modules/gr_tempdir.py +++ b/modules/gr_tempdir.py @@ -49,7 +49,7 @@ def check_tmp_file(gradio, filename): return ok -def pil_to_temp_file(self, img: Image, dir: str, format="png") -> str: # pylint: disable=redefined-builtin,unused-argument +def pil_to_temp_file(self, img: Image.Image, dir: str, format="png") -> str: # pylint: disable=redefined-builtin,unused-argument """ # original gradio implementation bytes_data = gr.processing_utils.encode_pil_to_bytes(img, format) diff --git a/modules/masking.py b/modules/masking.py index 600ec87f2..9cd70c5a5 100644 --- a/modules/masking.py +++ b/modules/masking.py @@ -257,7 +257,7 @@ def run_segment(input_image: gr.Image, input_mask: np.ndarray): return combined_mask -def run_rembg(input_image: Image, input_mask: np.ndarray): +def run_rembg(input_image: Image.Image, input_mask: np.ndarray): try: import rembg except Exception as e: diff --git a/modules/processing_helpers.py b/modules/processing_helpers.py index f93bcea89..7e4b1a4c6 100644 --- a/modules/processing_helpers.py +++ b/modules/processing_helpers.py @@ -106,7 +106,7 @@ def apply_color_correction(correction, original_image, method='histogram'): return fn(correction, original_image) -def apply_overlay(image: Image, paste_loc, index, overlays): +def apply_overlay(image: Image.Image, paste_loc, index, overlays): if overlays is None or index >= len(overlays): return image debug(f'Apply overlay: image={image} loc={paste_loc} index={index} overlays={overlays}') diff --git a/modules/seedvr/src/utils/color_fix.py b/modules/seedvr/src/utils/color_fix.py index a8b0da509..efe80b67d 100644 --- a/modules/seedvr/src/utils/color_fix.py +++ b/modules/seedvr/src/utils/color_fix.py @@ -5,7 +5,7 @@ from torch.nn import functional as F from ..common.half_precision_fixes import safe_pad_operation, safe_interpolate_operation from torchvision.transforms import ToTensor, ToPILImage -def adain_color_fix(target: Image, source: Image): +def adain_color_fix(target: Image.Image, source: Image.Image): # Convert images to tensors to_tensor = ToTensor() target_tensor = to_tensor(target).unsqueeze(0) @@ -20,7 +20,7 @@ def adain_color_fix(target: Image, source: Image): return result_image -def wavelet_color_fix(target: Image, source: Image): +def wavelet_color_fix(target: Image.Image, source: Image.Image): # Convert images to tensors to_tensor = ToTensor() target_tensor = to_tensor(target).unsqueeze(0) diff --git a/modules/upscaler_algo.py b/modules/upscaler_algo.py index e5df5611e..8b3d54ef9 100644 --- a/modules/upscaler_algo.py +++ b/modules/upscaler_algo.py @@ -13,7 +13,7 @@ class UpscalerDCC(Upscaler): UpscalerData("DCC Interpolation", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): import math import numpy as np from modules.postprocess.dcc import DCC @@ -41,7 +41,7 @@ class UpscalerVIPS(Upscaler): UpscalerData("VIPS MagicKernelSharp 2021", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): if selected_model is None: return img from installer import install @@ -85,7 +85,7 @@ class UpscalerHQX(Upscaler): UpscalerData("HQX Interpolation", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): import numpy as np from modules.postprocess.hqx import hqx t0 = time.time() @@ -106,7 +106,7 @@ class UpscalerICBI(Upscaler): UpscalerData("ICB Interpolation", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): import numpy as np from modules.postprocess.icbi import icbi t0 = time.time() diff --git a/modules/upscaler_simple.py b/modules/upscaler_simple.py index fbef4be6c..1ee384fdf 100644 --- a/modules/upscaler_simple.py +++ b/modules/upscaler_simple.py @@ -31,7 +31,7 @@ class UpscalerResize(Upscaler): UpscalerData("Resize Sharpfin Lanczos3", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): if selected_model is None: return img elif selected_model == "Resize Nearest": @@ -74,7 +74,7 @@ class UpscalerLatent(Upscaler): UpscalerData("Latent Bicubic antialias", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): import torch import torch.nn.functional as F if isinstance(img, torch.Tensor) and (len(img.shape) == 4): diff --git a/modules/upscaler_spandrel.py b/modules/upscaler_spandrel.py index e8f95ec1c..f1974edce 100644 --- a/modules/upscaler_spandrel.py +++ b/modules/upscaler_spandrel.py @@ -37,7 +37,7 @@ class UpscalerSpandrel(Upscaler): log.debug(f'Upscale: name="{self.selected}" input={img.size} output={upscaled.size} time={t1 - t0:.2f}') return upscaled - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): from installer import install if selected_model is None: return img diff --git a/modules/upscaler_vae.py b/modules/upscaler_vae.py index 6869535cf..a0318302f 100644 --- a/modules/upscaler_vae.py +++ b/modules/upscaler_vae.py @@ -15,7 +15,7 @@ class UpscalerAsymmetricVAE(Upscaler): UpscalerData("Asymmetric VAE v2", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): if selected_model is None: return img import diffusers @@ -55,7 +55,7 @@ class UpscalerWanUpscale(Upscaler): UpscalerData("WAN Asymmetric Upscale", None, self), ] - def do_upscale(self, img: Image, selected_model=None): + def do_upscale(self, img: Image.Image, selected_model=None): if selected_model is None: return img import torch.nn.functional as FN diff --git a/scripts/daam/trace.py b/scripts/daam/trace.py index 625e3d402..c748826df 100644 --- a/scripts/daam/trace.py +++ b/scripts/daam/trace.py @@ -34,7 +34,7 @@ class DiffusionHeatMapHooker(AggregateHooker): locate_middle = load_heads or save_heads self.locator = UNetCrossAttentionLocator(restrict={0} if low_memory else None, locate_middle_block=locate_middle) self.last_prompt: str = '' - self.last_image: Image = None + self.last_image: Image.Image = None self.time_idx = 0 self._gen_idx = 0 From c583b24f25bb9eb68e820680c92f42e2f4c61d31 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Tue, 7 Apr 2026 14:59:34 +0200 Subject: [PATCH 69/73] remove system-info submodule --- .gitmodules | 4 ---- extensions-builtin/sd-extension-system-info | 1 - 2 files changed, 5 deletions(-) delete mode 160000 extensions-builtin/sd-extension-system-info diff --git a/.gitmodules b/.gitmodules index a7efe3019..679da7cbe 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,10 +2,6 @@ path = wiki url = https://github.com/vladmandic/sdnext.wiki ignore = dirty -[submodule "extensions-builtin/sd-extension-system-info"] - path = extensions-builtin/sd-extension-system-info - url = https://github.com/vladmandic/sd-extension-system-info - ignore = dirty [submodule "extensions-builtin/sd-extension-chainner"] path = extensions-builtin/sd-extension-chainner url = https://github.com/vladmandic/sd-extension-chainner diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info deleted file mode 160000 index 006f08f49..000000000 --- a/extensions-builtin/sd-extension-system-info +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 006f08f499bbe69c484f0f1cc332bbf0e75526c2 From bfc018fed4af10cf2bf5187ed33895334321e08c Mon Sep 17 00:00:00 2001 From: vladmandic Date: Tue, 7 Apr 2026 15:24:42 +0200 Subject: [PATCH 70/73] update changelog Signed-off-by: vladmandic --- CHANGELOG.md | 4 +++- modules/sd_models_utils.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a790d8a92..87f9e3d30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2026-04-06 +## Update for 2026-04-07 - **Models** - [AiArtLab SDXS-1B](https://huggingface.co/AiArtLab/sdxs-1b) Simple Diffusion XS *(training still in progress)* @@ -9,6 +9,8 @@ - **ROCm** futher work on advanced configuration and tuning, thanks @resonantsky now covers both ROCm on Windows and Linux see *main interface -> scripts -> rocm advanced config* +- **Obsoleted** + - remove *system-info* from *extensions-builtin* - **Internal** - additional typing and typechecks, thanks @awsr - wrap hf download methods diff --git a/modules/sd_models_utils.py b/modules/sd_models_utils.py index 1f3585718..ffacb0102 100644 --- a/modules/sd_models_utils.py +++ b/modules/sd_models_utils.py @@ -41,6 +41,8 @@ def path_to_repo(checkpoint_info): repo_id = repo_id.replace('\\', '/') if repo_id.startswith('Diffusers/'): repo_id = repo_id.split('Diffusers/')[-1] + if repo_id.startswith('huggingface/'): + repo_id = repo_id.split('huggingface/')[-1] if repo_id.startswith('models--'): repo_id = repo_id.split('models--')[-1] repo_id = repo_id.replace('--', '/') From a8e535efe24c2c1ef0ac90d265559f35e08a5f68 Mon Sep 17 00:00:00 2001 From: vladmandic Date: Wed, 8 Apr 2026 08:32:32 +0200 Subject: [PATCH 71/73] enhanced filename pattern processing Signed-off-by: vladmandic --- CHANGELOG.md | 6 +++++- html/locale_ar.json | 2 +- html/locale_bn.json | 2 +- html/locale_de.json | 2 +- html/locale_es.json | 2 +- html/locale_fr.json | 2 +- html/locale_he.json | 2 +- html/locale_hi.json | 2 +- html/locale_hr.json | 2 +- html/locale_id.json | 2 +- html/locale_it.json | 2 +- html/locale_ja.json | 2 +- html/locale_ko.json | 2 +- html/locale_nb.json | 2 +- html/locale_po.json | 2 +- html/locale_pt.json | 2 +- html/locale_qq.json | 2 +- html/locale_ru.json | 2 +- html/locale_sr.json | 2 +- html/locale_tb.json | 2 +- html/locale_tlh.json | 2 +- html/locale_tr.json | 2 +- html/locale_ur.json | 2 +- html/locale_vi.json | 2 +- html/locale_xx.json | 2 +- html/locale_zh.json | 2 +- modules/image/namegen.py | 32 ++++++++++++++++++++++++++++++++ scripts/rocm/rocm_vars.py | 1 - 28 files changed, 62 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87f9e3d30..6d5f547e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2026-04-07 +## Update for 2026-04-08 - **Models** - [AiArtLab SDXS-1B](https://huggingface.co/AiArtLab/sdxs-1b) Simple Diffusion XS *(training still in progress)* @@ -9,6 +9,10 @@ - **ROCm** futher work on advanced configuration and tuning, thanks @resonantsky now covers both ROCm on Windows and Linux see *main interface -> scripts -> rocm advanced config* +- **Features** + - enhanced filename pattern processing + allows for any *processing* property name (as defined in `modules/processing_class.py` and saved to `ui-config.json`) + allows for any *settings* property name (as defined in `modules/ui_definitions.py` and saved to `config.json`) - **Obsoleted** - remove *system-info* from *extensions-builtin* - **Internal** diff --git a/html/locale_ar.json b/html/locale_ar.json index ab13d6d46..596040792 100644 --- a/html/locale_ar.json +++ b/html/locale_ar.json @@ -11295,4 +11295,4 @@ "hint": "نموذج تقدير العمق Zoe Depth" } ] -} \ No newline at end of file +} diff --git a/html/locale_bn.json b/html/locale_bn.json index f6581acde..f7fe99ac3 100644 --- a/html/locale_bn.json +++ b/html/locale_bn.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth" } ] -} \ No newline at end of file +} diff --git a/html/locale_de.json b/html/locale_de.json index 37a9c5189..1bdd46a1a 100644 --- a/html/locale_de.json +++ b/html/locale_de.json @@ -11295,4 +11295,4 @@ "hint": "Zoe-Tiefe" } ] -} \ No newline at end of file +} diff --git a/html/locale_es.json b/html/locale_es.json index e65178818..42f8f72bb 100644 --- a/html/locale_es.json +++ b/html/locale_es.json @@ -11295,4 +11295,4 @@ "hint": "Profundidad Zoe" } ] -} \ No newline at end of file +} diff --git a/html/locale_fr.json b/html/locale_fr.json index ee1f67ed0..470792ab9 100644 --- a/html/locale_fr.json +++ b/html/locale_fr.json @@ -11295,4 +11295,4 @@ "hint": "Modèle d'estimation de profondeur Zoe" } ] -} \ No newline at end of file +} diff --git a/html/locale_he.json b/html/locale_he.json index 893c726fc..8d1e7704f 100644 --- a/html/locale_he.json +++ b/html/locale_he.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth (מודל להערכת עומק)" } ] -} \ No newline at end of file +} diff --git a/html/locale_hi.json b/html/locale_hi.json index e08f9e6ed..54d213b59 100644 --- a/html/locale_hi.json +++ b/html/locale_hi.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth मॉडल" } ] -} \ No newline at end of file +} diff --git a/html/locale_hr.json b/html/locale_hr.json index 83e60e2f1..d092a3e55 100644 --- a/html/locale_hr.json +++ b/html/locale_hr.json @@ -11302,4 +11302,4 @@ "hint": "Zoe Depth (model za procjenu dubine)" } ] -} \ No newline at end of file +} diff --git a/html/locale_id.json b/html/locale_id.json index d4af6239e..c13c3fe19 100644 --- a/html/locale_id.json +++ b/html/locale_id.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth (Model estimasi kedalaman)" } ] -} \ No newline at end of file +} diff --git a/html/locale_it.json b/html/locale_it.json index 09f742b92..c557311c1 100644 --- a/html/locale_it.json +++ b/html/locale_it.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth" } ] -} \ No newline at end of file +} diff --git a/html/locale_ja.json b/html/locale_ja.json index a97aa9198..d16520c68 100644 --- a/html/locale_ja.json +++ b/html/locale_ja.json @@ -11288,4 +11288,4 @@ "hint": "Z軸の値をカンマ区切りで入力してください" } ] -} \ No newline at end of file +} diff --git a/html/locale_ko.json b/html/locale_ko.json index 2b9a25898..00e3a4032 100644 --- a/html/locale_ko.json +++ b/html/locale_ko.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth" } ] -} \ No newline at end of file +} diff --git a/html/locale_nb.json b/html/locale_nb.json index b8d372086..1542f19f6 100644 --- a/html/locale_nb.json +++ b/html/locale_nb.json @@ -11295,4 +11295,4 @@ "hint": "Uses Zoe to calculate the depth of the image." } ] -} \ No newline at end of file +} diff --git a/html/locale_po.json b/html/locale_po.json index fa117d2ac..8d8055819 100644 --- a/html/locale_po.json +++ b/html/locale_po.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth (model estymacji głębi)" } ] -} \ No newline at end of file +} diff --git a/html/locale_pt.json b/html/locale_pt.json index e5870cc0b..db261911e 100644 --- a/html/locale_pt.json +++ b/html/locale_pt.json @@ -11295,4 +11295,4 @@ "hint": "Profundidade Zoe" } ] -} \ No newline at end of file +} diff --git a/html/locale_qq.json b/html/locale_qq.json index 919acbe42..b033d7be9 100644 --- a/html/locale_qq.json +++ b/html/locale_qq.json @@ -11295,4 +11295,4 @@ "hint": "Aestimatio profunditatis per Zoe" } ] -} \ No newline at end of file +} diff --git a/html/locale_ru.json b/html/locale_ru.json index 911db93f8..db706a1a2 100644 --- a/html/locale_ru.json +++ b/html/locale_ru.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth (модель оценки глубины изображения)" } ] -} \ No newline at end of file +} diff --git a/html/locale_sr.json b/html/locale_sr.json index 775d4fe3f..d0df82d7b 100644 --- a/html/locale_sr.json +++ b/html/locale_sr.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth (model za procenu dubine scene)" } ] -} \ No newline at end of file +} diff --git a/html/locale_tb.json b/html/locale_tb.json index ee549a317..53f4ad85a 100644 --- a/html/locale_tb.json +++ b/html/locale_tb.json @@ -11295,4 +11295,4 @@ "hint": "Activates the monocular depth-sensing manifold via Zoe-Net neural pathways." } ] -} \ No newline at end of file +} diff --git a/html/locale_tlh.json b/html/locale_tlh.json index 32a640989..80e758920 100644 --- a/html/locale_tlh.json +++ b/html/locale_tlh.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Depth, (nI'qu'moHwI')" } ] -} \ No newline at end of file +} diff --git a/html/locale_tr.json b/html/locale_tr.json index 05a3e7d67..275409c4c 100644 --- a/html/locale_tr.json +++ b/html/locale_tr.json @@ -11295,4 +11295,4 @@ "hint": "Zoe Derinliği" } ] -} \ No newline at end of file +} diff --git a/html/locale_ur.json b/html/locale_ur.json index 7bc7380e5..5063f6e7e 100644 --- a/html/locale_ur.json +++ b/html/locale_ur.json @@ -11295,4 +11295,4 @@ "hint": "زوئی ڈیپتھ (گہرائی کا ماڈل)" } ] -} \ No newline at end of file +} diff --git a/html/locale_vi.json b/html/locale_vi.json index 1f75df5e4..4e631bb43 100644 --- a/html/locale_vi.json +++ b/html/locale_vi.json @@ -11295,4 +11295,4 @@ "hint": "Mô hình ước tính độ sâu Zoe Depth" } ] -} \ No newline at end of file +} diff --git a/html/locale_xx.json b/html/locale_xx.json index 2d6215570..5674c5994 100644 --- a/html/locale_xx.json +++ b/html/locale_xx.json @@ -11295,4 +11295,4 @@ "hint": "Zoe-profundo (Zoe Depth)" } ] -} \ No newline at end of file +} diff --git a/html/locale_zh.json b/html/locale_zh.json index 5f2464655..7aa02402e 100644 --- a/html/locale_zh.json +++ b/html/locale_zh.json @@ -11295,4 +11295,4 @@ "hint": "Zoe 深度图" } ] -} \ No newline at end of file +} diff --git a/modules/image/namegen.py b/modules/image/namegen.py index 905427eed..be850e6b9 100644 --- a/modules/image/namegen.py +++ b/modules/image/namegen.py @@ -97,6 +97,30 @@ class FilenameGenerator: self.batch_number = NOTHING self.iter_number = NOTHING + def apply_p(self, param): + try: + if self.p is None: + return NOTHING + val = getattr(self.p, param, None) + if val is not None: + val = str(val) + debug_log(f'Filename apply: param="{param}" value="{val}"') + return val + except Exception as e: + log.error(f'Filename apply param: {param} {e}') + return NOTHING + + def apply_opt(self, opt): + try: + val = shared.opts.data.get(opt, None) + if val is not None: + val = str(val) + debug_log(f'Filename apply: opt="{opt}" value="{val}"') + return val + except Exception as e: + log.error(f'Filename apply opt: {opt} {e}') + return NOTHING + def hasprompt(self, *args): lower = self.prompt.lower() if getattr(self, 'p', None) is None or getattr(self, 'prompt', None) is None: @@ -279,6 +303,14 @@ class FilenameGenerator: res += text + str(replacement).replace('/', '-').replace('\\', '-') continue else: + replacement = self.apply_p(pattern) + if replacement != NOTHING: + res += text + str(replacement).replace('/', '-').replace('\\', '-') + continue + replacement = self.apply_opt(pattern) + if replacement != NOTHING: + res += text + str(replacement).replace('/', '-').replace('\\', '-') + continue res += text + f'[{pattern}]' # reinsert unknown pattern return res diff --git a/scripts/rocm/rocm_vars.py b/scripts/rocm/rocm_vars.py index 74714610d..1537d038b 100644 --- a/scripts/rocm/rocm_vars.py +++ b/scripts/rocm/rocm_vars.py @@ -349,4 +349,3 @@ HIPBLASLT_VARS: set = { "PYTORCH_TUNABLEOP_HIPBLASLT_ENABLED", "HIPBLASLT_LOG_LEVEL", } - From 8bce746fa22b7ba80474755c1f7da736e3ba9baa Mon Sep 17 00:00:00 2001 From: vladmandic Date: Wed, 8 Apr 2026 08:39:42 +0200 Subject: [PATCH 72/73] lint Signed-off-by: vladmandic --- scripts/nudenet/imageguard.py | 6 ++++-- scripts/nudenet_ext.py | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/nudenet/imageguard.py b/scripts/nudenet/imageguard.py index c92dd43ee..aa3a881be 100644 --- a/scripts/nudenet/imageguard.py +++ b/scripts/nudenet/imageguard.py @@ -1,11 +1,11 @@ from __future__ import annotations - -from modules.logger import log from typing import TYPE_CHECKING +from modules.logger import log if TYPE_CHECKING: from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration + repo_id = 'AIML-TUDA/LlavaGuard-v1.2-0.5B-OV-hf' policy_template = """Provide a safety assessment for the content provided by the user. Determine compliance or violation against our safety policy by reviewing the following policy categories: Hate: @@ -96,6 +96,8 @@ To provide your assessment use the following json template for each category: "rationale": str, }. """ + + model: LlavaOnevisionForConditionalGeneration | None = None processor: AutoProcessor | None = None diff --git a/scripts/nudenet_ext.py b/scripts/nudenet_ext.py index 45208832c..41a60b162 100644 --- a/scripts/nudenet_ext.py +++ b/scripts/nudenet_ext.py @@ -56,7 +56,7 @@ def process( policy=False, banned=False, metadata=True, - copy=False, # Compatability + copy=False, # pylint: disable=unused-argument # compatability score=0.2, blocks=3, censor=[], @@ -131,11 +131,11 @@ class ScriptNudeNet(scripts.Script): def title(self): return 'NudeNet' - def show(self, *args, **kwargs): + def show(self, *args, **kwargs): # pylint: disable=unused-argument return scripts.AlwaysVisible # return signature is array of gradio components - def ui(self, *args, **kwargs): + def ui(self, *args, **kwargs): # pylint: disable=unused-argument return create_ui(accordion=True) # triggered by callback From 44cb2f6f9c6b2e0e4263467cff3124d14cf9d53f Mon Sep 17 00:00:00 2001 From: vladmandic Date: Wed, 8 Apr 2026 09:47:06 +0200 Subject: [PATCH 73/73] improve path_to_repo Signed-off-by: vladmandic --- CHANGELOG.md | 1 + modules/sd_models_utils.py | 35 ++++++++++++++++++++++++++--------- pipelines/model_google.py | 4 +++- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d5f547e8..26a5b261f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ - improve torch nvidia arch detection - add torch amd arch detection - fix prompt weighted lists and internal wildcards + - improve `path_to_repo` handling for custom paths ## Update for 2026-04-01 diff --git a/modules/sd_models_utils.py b/modules/sd_models_utils.py index ffacb0102..b126ae0fd 100644 --- a/modules/sd_models_utils.py +++ b/modules/sd_models_utils.py @@ -1,8 +1,8 @@ import io +import os import copy import json import inspect -import os.path from rich import progress # pylint: disable=redefined-builtin import torch import safetensors.torch @@ -12,6 +12,9 @@ from modules.logger import log, console from modules.sd_checkpoint import CheckpointInfo # pylint: disable=unused-import +debug = log.trace if os.environ.get('SD_LOAD_DEBUG', None) is not None else lambda *args, **kwargs: None + + class NoWatermark: def apply_watermark(self, img): return img @@ -38,18 +41,32 @@ def path_to_repo(checkpoint_info): repo_id = checkpoint_info.name else: repo_id = checkpoint_info # fallback if fn is used with str param + repo_orig = repo_id repo_id = repo_id.replace('\\', '/') - if repo_id.startswith('Diffusers/'): - repo_id = repo_id.split('Diffusers/')[-1] - if repo_id.startswith('huggingface/'): - repo_id = repo_id.split('huggingface/')[-1] - if repo_id.startswith('models--'): - repo_id = repo_id.split('models--')[-1] + + remove_prefix = ['Diffusers', 'huggingface', 'models--'] + for opt in [shared.opts.ckpt_dir, shared.opts.diffusers_dir, shared.opts.hfcache_dir]: + remove_prefix.append(opt.replace('\\', '/')) + relative = os.path.relpath(opt, start=shared.opts.models_dir).replace('\\', '/') + if not relative.startswith('.'): + remove_prefix.append(relative) + basename = os.path.basename(opt).replace('\\', '/') + if basename: + remove_prefix.append(basename) + + debug(f'Path sanitize: prefixes={remove_prefix}') + for prefix in remove_prefix: + if repo_id.startswith(prefix): + repo_id = repo_id.lstrip(prefix) + break + + repo_id = repo_id.lstrip('/') repo_id = repo_id.replace('--', '/') - if repo_id.count('/') != 1: - log.warning(f'Model: repo="{repo_id}" repository not recognized') if '+' in repo_id: repo_id = repo_id.split('+')[0] + if repo_id.count('/') > 1: + log.warning(f'Model: repo="{repo_id}" repository not recognized') + debug(f'Path: from="{repo_orig}" to="{repo_id}"') return repo_id diff --git a/pipelines/model_google.py b/pipelines/model_google.py index 04d2951cb..91045fc53 100644 --- a/pipelines/model_google.py +++ b/pipelines/model_google.py @@ -163,7 +163,9 @@ class GoogleNanoBananaPipeline(): def load_nanobanana(checkpoint_info, diffusers_load_config): # pylint: disable=unused-argument - pipe = GoogleNanoBananaPipeline(model_name = checkpoint_info.filename) + from modules import sd_models + repo_id = sd_models.path_to_repo(checkpoint_info) + pipe = GoogleNanoBananaPipeline(model_name = repo_id) return pipe