From 0c7cd52dba6746b96f0836fd361a27db06761973 Mon Sep 17 00:00:00 2001 From: Jure Grabnar Date: Tue, 4 Oct 2016 12:34:43 +0200 Subject: [PATCH] Add WOPI icons/buttons to files --- app/helpers/file_icons_helper.rb | 60 ++++++++++++++++++ app/views/result_assets/_edit.html.erb | 5 +- app/views/results/_result_asset.html.erb | 28 ++++++-- app/views/steps/_form_assets.html.erb | 10 ++- app/views/steps/_step.html.erb | 28 ++++++-- config/locales/en.yml | 2 + public/images/office/Excel-color_16x16x32.png | Bin 0 -> 1490 bytes public/images/office/Excel-xlsx_20x20x32.png | Bin 0 -> 1543 bytes .../office/PowerPoint-Color_16x16x32.png | Bin 0 -> 1488 bytes .../office/PowerPoint-pptx_20x20x32.png | Bin 0 -> 1499 bytes public/images/office/Word-color_16x16x32.png | Bin 0 -> 1448 bytes public/images/office/Word-docx_20x20x32.png | Bin 0 -> 1531 bytes 12 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 app/helpers/file_icons_helper.rb create mode 100644 public/images/office/Excel-color_16x16x32.png create mode 100644 public/images/office/Excel-xlsx_20x20x32.png create mode 100644 public/images/office/PowerPoint-Color_16x16x32.png create mode 100644 public/images/office/PowerPoint-pptx_20x20x32.png create mode 100644 public/images/office/Word-color_16x16x32.png create mode 100644 public/images/office/Word-docx_20x20x32.png diff --git a/app/helpers/file_icons_helper.rb b/app/helpers/file_icons_helper.rb new file mode 100644 index 000000000..01721e38b --- /dev/null +++ b/app/helpers/file_icons_helper.rb @@ -0,0 +1,60 @@ +module FileIconsHelper + def wopi_file?(asset) + file_ext = asset.file_file_name.split('.').last + %w(doc docx xls xlsx ppt pptx).include?(file_ext) + end + + # For showing next to file + def file_extension_icon(asset) + file_ext = asset.file_file_name.split('.').last + if %w(doc docx).include?(file_ext) + image_link = 'office/Word-docx_20x20x32.png' + elsif %w(xls xlsx).include?(file_ext) + image_link = 'office/Excel-xlsx_20x20x32.png' + elsif %w(ppt pptx).include?(file_ext) + image_link = 'office/PowerPoint-pptx_20x20x32.png' + end + + if image_link + image_tag image_link + else + '' + end + end + + # For showing in view/edit buttons (WOPI) + def file_application_icon(asset) + file_ext = asset.file_file_name.split('.').last + if %w(doc docx).include?(file_ext) + image_link = 'office/Word-color_16x16x32.png' + elsif %w(xls xlsx).include?(file_ext) + image_link = 'office/Excel-color_16x16x32.png' + elsif %w(ppt pptx).include?(file_ext) + image_link = 'office/PowerPoint-Color_16x16x32.png' + end + + if image_link + image_tag image_link + else + '' + end + end + + # Shows correct WOPI application text (Word Online/Excel ..) + def wopi_button_text(asset, action) + file_ext = asset.file_file_name.split('.').last + if %w(doc docx).include?(file_ext) + app = 'Word Online' + elsif %w(xls xlsx).include?(file_ext) + app = 'Excel Online' + elsif %w(ppt pptx).include?(file_ext) + app = 'PowerPoint Online' + end + + if action == 'view' + t('result_assets.wopi_open_file', app: app) + elsif action == 'edit' + t('result_assets.wopi_edit_file', app: app) + end + end +end diff --git a/app/views/result_assets/_edit.html.erb b/app/views/result_assets/_edit.html.erb index b1bf833fd..68158d989 100644 --- a/app/views/result_assets/_edit.html.erb +++ b/app/views/result_assets/_edit.html.erb @@ -3,7 +3,10 @@ <%= f.text_field :name, style: "margin-top: 10px;" %>
<%= f.fields_for :asset do |ff| %> <%=t "result_assets.edit.uploaded_asset" %> -

<%= ff.object.file_file_name %>

+

+ <%= file_extension_icon(ff.object) %> + <%= ff.object.file_file_name %> +

<%= ff.file_field :file %> <% end %>
diff --git a/app/views/results/_result_asset.html.erb b/app/views/results/_result_asset.html.erb index 3391b61ab..81506ebf5 100644 --- a/app/views/results/_result_asset.html.erb +++ b/app/views/results/_result_asset.html.erb @@ -1,16 +1,36 @@ <% if can_view_or_download_result_assets(result.my_module) %> <%= link_to download_asset_path(result.asset), data: {no_turbolink: true} do %> <%= image_tag(preview_asset_path result.asset) if result.asset.is_image? %> -

<%= truncate(result.asset.file_file_name, length: 50) %>

+ <% if wopi_file?(result.asset) %> +

+ <%= file_extension_icon(result.asset) %> + <%= truncate(result.asset.file_file_name, length: 50) %> +

+ <% else %> +

<%= truncate(result.asset.file_file_name, length: 50) %>

+ <% end %> <% end %> <% if result.asset.can_perform_action("view") %> - <%= link_to "View", view_asset_url(id: result.asset) %> + <%= link_to view_asset_url(id: result.asset), + class: 'btn btn-default btn-sm', + style: 'display: inline-block' do %> + <%= file_application_icon(result.asset) %> + <%= wopi_button_text(result.asset, 'view') %> + <% end %> <% end %> <% if can_edit_result_asset_in_module(result.my_module) && result.asset.can_perform_action("edit") %> - <%= link_to "Edit", edit_asset_url(id: result.asset) %> + <%= link_to edit_asset_url(id: result.asset), + class: 'btn btn-default btn-sm', + style: 'display: inline-block' do %> + <%= file_application_icon(result.asset) %> + <%= wopi_button_text(result.asset, 'edit') %> + <% end %> <% end %> <% else %> <%= image_tag(preview_asset_path result.asset) if result.asset.is_image? %> -

<%= result.asset.file_file_name %>

+

+ <%= file_extension_icon(result.asset) %> + <%= truncate(result.asset.file_file_name, length: 50) %> +

<% end %> diff --git a/app/views/steps/_form_assets.html.erb b/app/views/steps/_form_assets.html.erb index 9792e1da5..8dc1cd0d8 100644 --- a/app/views/steps/_form_assets.html.erb +++ b/app/views/steps/_form_assets.html.erb @@ -15,11 +15,17 @@ <% if can_view_or_download_step_assets(@protocol) %> <%= link_to download_asset_path(ff.object), data: {no_turbolink: true} do %> <%= image_tag(preview_asset_path ff.object) if ff.object.is_image? %> -

<%= ff.object.file_file_name %>

+

+ <%= file_extension_icon(ff.object) %> + <%= ff.object.file_file_name %> +

<% end %> <% else %> <%= image_tag(preview_asset_path ff.object) if ff.object.is_image? %> -

<%= ff.object.file_file_name %>

+

+ <%= file_extension_icon(ff.object) %> + <%= ff.object.file_file_name %> +

<% end %> <% else %> <%= ff.file_field :file %> diff --git a/app/views/steps/_step.html.erb b/app/views/steps/_step.html.erb index 07d5ce2e1..483ab23da 100644 --- a/app/views/steps/_step.html.erb +++ b/app/views/steps/_step.html.erb @@ -71,21 +71,41 @@ <% if asset.file_present %> <%= link_to download_asset_path(asset), data: {no_turbolink: true, id: true, status: "asset-present"} do %> <%= image_tag preview_asset_path(asset) if asset.is_image? %> -

<%= truncate(asset.file_file_name, length: 50) %>

+ <% if wopi_file?(asset) %> +

+ <%= file_extension_icon(asset) %> + <%= truncate(asset.file_file_name, length: 50) %> +

+ <% else %> +

<%= truncate(asset.file_file_name, length: 50) %>

+ <% end %> <% end %> <% if asset.can_perform_action("view") %> - <%= link_to "View", view_asset_url(id: asset) %> + <%= link_to view_asset_url(id: asset), + class: 'btn btn-default btn-sm', + style: 'display: inline-block' do %> + <%= file_application_icon(asset) %> + <%= wopi_button_text(asset, 'view') %> + <% end %> <% end %> <% if can_edit_step_in_protocol(@protocol) && asset.can_perform_action("edit") %> - <%= link_to "Edit", edit_asset_url(id: asset) %> + <%= link_to edit_asset_url(id: asset), + class: 'btn btn-default btn-sm', + style: 'display: inline-block' do %> + <%= file_application_icon(asset) %> + <%= wopi_button_text(asset, 'edit') %> + <% end %> <% end %> <% else %> <%= asset_loading_span(asset) %> <% end %> <% else %> <%= image_tag preview_asset_path(asset) if asset.is_image? %> -

<%= truncate(asset.file_file_name, length: 50) %>

+

+ <%= file_extension_icon(asset) %> + <%= truncate(asset.file_file_name, length: 50) %> +

<% end %> <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index e67728e30..f1484e517 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -847,6 +847,8 @@ en: error_flash: "Couldn't archive file result. Someone is editing that file." destroy: success_flash: "File result successfully deleted." + wopi_open_file: "Open in %{app}" + wopi_edit_file: "Edit in %{app}" result_tables: new: diff --git a/public/images/office/Excel-color_16x16x32.png b/public/images/office/Excel-color_16x16x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4f705c4029814368d624189d9c0a97c254e492 GIT binary patch literal 1490 zcmaJ>ZEO=|9KQxLfo)+944eC~^9Ukw?Y*?!dY2W}URxNU+uW9{(a3ted)i)h?VWem zt;~e2H0TzG3_>E1&_pwX`=FUAi83W@7LDKw24gS=c~Rp`)XcZANH*$oT|4%HaLIG` z+;hL*@Betf0%ly>X0V zXaS=4Ik9D@0{#w^l~sV+ErgjT8VR(Kw2)R?Q&Up|N)aT16BJHTX0nN~QVc<$#S4Sh zR3XfCdVED&@Xd)ubzNa_d|+U}GGMjHY6K@~nl>~j$_x=^ZGT+nlIFO!rKI2i8n23q zF3NG#P~<{#LU&@&)8!Ciir>E?9M_78f+@q3oPv`U0*}RvxC&@Z?*#YVcpzHq-md_> z6KHZm@L_!o8yN4niG-ac$ZlA|Zk~C>^IqWpyv66Pe!8#0MhQMkfJh2Fn>$Z}PMwiXX z(moqWdP%pViFA8mwS2VOkSuXqy zvVyW*cC<%~3-W+wRI%tMP{n>A_*6ND7Rtbg53ugFu@0Y|rM(1PB#heUV`+zvg~8ix zByGcrTwztZN>Njk&F*%)NGr+O4X%r#S%=F8L$^C@Fmo6Voe_9O7j+2~`_m=q#hoM? zJ;F#_JOYzp7C@LwNIJHoM^=Sif^5c(=95H-F6@?x_$s-=@v3euA>jxZ+m+daFDugv z;&5bDIGZ2bRYwrSlxp?3x|83Bq-ZpVq`WuV6>2f^_1*mZ1u~b^m<8OSt?U1XtEq(jPT;0WUE#AGaaZBgUS6s{d z00IX>b-CZJ%-8JssCw=6@U!QxmY+D5n%p#&`n7&+ss3^p$TUD9 I>kc0L9~hPn1poj5 literal 0 HcmV?d00001 diff --git a/public/images/office/Excel-xlsx_20x20x32.png b/public/images/office/Excel-xlsx_20x20x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f6833725fb08328b0091223398c0dfd52d296b GIT binary patch literal 1543 zcmaJ>eQXnD7{5}$xfCNGF&oNu90t+R-pBfNXS?m%>!4;GrIf4)=&pBfyUW_UdUv(m zBALUuWTN80WI?8b1S2ugp!gZbVDe!J3jT{*rXv{q7~w0DAQ*hFTgU!DFS&c4_s#SB z{hsG}pXYkR&1)8vFD*w9WI=E(7lG>%<1L#Hzi;#|TL70zJrL73C<#5ss{mm|B@WPF znooiV;Khy?P6H2un17R^F+CP)Vgw~^;|(8MKAnMR1o718GrZ6abTkfXC(l5FG|+i8pH9gdllNjpUIyC6F^-`{ z7rot!O$8MTg;Bqv0@Pt6tODUAP$y|4Ywa$VYc)y{B!LqYPEuCV#ne&^L7>wQ2GvwC z!9=*mX)U<(Vr{yfVQ@T`%h__ZHbqV1Bu&!>2Sr(-hgIv4bv|#EwG|}>4rqcZWpqiA zQG=0>D_Px(!APf4NM}N!8Dd$RE)*;op64?-X(RA-+Q_Tut?3bPFO2(oYtfDjz#~9Y zvZ?^@Be9|c7KIs|Ojb=5!xse{q(BB_yVk>gbm7?&dUNYL=CKT4@>+nmhr2A*A+FYD5+AbgxeHd(b|*@ z>fhi%TO?Uja+-0AQ;Bjwm0kp5qpGCQ;x#bRebikAg)nVJLtJTa$f^3S8D=w9T+ zw}rp=R21gMFI@QJ625hEF14+Dcu`O9VYDW)`r41l$l}P}L+uY9-<`uN-y7;Wow@w` z)}C|q!_?T7^WFR^yn3*r5cYewg~Q!P&K(R-4p*=G06FP46^?B>oEW+Fl4r=WaD89v z&5t&JSur#=wwUG1)&1tL$IqVqe*57Y*KgFU3=I?zb)qY77j94t()skVs-C__p0lKv zcUW#-?zQY3uS>dP^dLX_{&CB@n=g$xKC6zEC0m#i!c`WjI&)@S%KYft6BXsofx#X9 z{HfuMk3V33W_3>9`yJu<;+>JDZA1Z7AMIk-TeNw$x}NS)TU8=|@vi~4Iksprt~c!J z=O@apKUDygZ}Q?v&)BPX20WHu$AiCQ%#~&FSGM#{rgseuOe{Hd_1b8%r}Fmlg{IdY zdu#v3_LY4X!B^e;);2U_`!4$X`g=_$I&UGLoZopcHb3#?8ZZA=?w96#0sH&*6YmLR%~^QLGb^zLcz=-o*NeWB2VG6E>X5$W~rfnK=wy6aWC z#SAtg?nRxtshBN_8Cjw(!X^o3xG5Qf>7vf)mn|_kjM)@3e8c&nSf48`TB}z9?ZiqEZQ=o;?a;dg4Ps774MN-( z7CK=g6r^1{zkn4OX1XCax9Y9_I$l)67Qw(+65%LfV^~FHA}WYoP{)I?Q;s-@`SH&P zT$UU}3*)E!Q8x_9wYxRgw7b4p+}$N|5>dGguSoDnK^W=+o(Ljcby? z(-6JOK`c4d>Tkf^ss?e!LY0YBIfa)43$W34yS)^*Qh*{UD+#P+z|PyOJVoJ|hd|ae zse^Cycr&)p$w7p4J<5}0cXzj?+h$RarTa4UIxjjq45qdAbxrIO_K=D~`l6i9#tO6GD^(7K#jqjkwb2nBEBQxN%o>ta(=y zl8rE?#x)Vuqho89jBJys$^TGA*AYR zETl$pcN2rR$Pr2Hju}?9sht89q|tnejL>OmiAb(cm%d)ntyv@*0YhA#J#<)} zUKl|mtD)K4KDTZUhUN75JkI9CwV)CT1+cxZ9=Xh=Y*Yv&Q))6**=Jd8x_Y(>JdA%e zGEvh1TF%jod40NX zhq+GKgbVd0bW_ng{tv`|wOfz(^`0y2>peoY-SWP)`9i9vr|A5%+b;e-G`6Z>|E1hy zYVp|hAO3m6JTpHN{1Ke#2)y-r&CYV0o$PO+T>US!@84S-dUAF0lfwlvKX7W@hdF~)XWO@!%!g(IYSrw9 zRiov{O%LtcG%_Gy=ArqqVPdY&6gVop{Pdaca=iHYwky+7$M;8XK9Wp*qpn{#6e{cu zV)@B^kN&)X7jF2nZm#si$c-uHWPx+!H#2hyI~ad&p!nShEGHLR_sp?^uV1WLWBg-% M)%Bi_T!DT61HnKC!~g&Q literal 0 HcmV?d00001 diff --git a/public/images/office/PowerPoint-pptx_20x20x32.png b/public/images/office/PowerPoint-pptx_20x20x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2fdb3cb5fdf88330e627eafdfbd92db59fbbb82f GIT binary patch literal 1499 zcmaJ>eM}Q)7(XoOn1Z0P4Hlf2BN-!<-bZ`1ccDPrE7*-cv%W=X)04ak5VxpA z0P2tO?H~krapy}Dpc+9;*QIc?-W+IT1tn_b4U9DvjYBqqRM)2BywC-7Gy>YCmcJ14JP11s&4H9u;iqX$lKHT>>LwwKZsUiiHNEK2C0^aWQgtV7r1ERH9WNo&$(Rn&HzWEjS3pg(rj=$aa6l7O zDXvRO3^gqB5hbC!FsO7PglIevSTY>b783VF?#csB$_^QNV!=q9CSgP!yR~1eLR!R0$p+FLR2J zFuwXZ7nVp!B1>}=;bbT~WAoH=9+G58yW2@K1ZN{@!s&Gy&I|*~iEzg%LayCM+o&oZ z$8emJBz>gQ#}RI~*F!s;1m|X$4A&pibUr2k!>PfQ?sL5l<+5HC@VcUg6-CaJO0YxG z6|F;wquwnvx=o6SN>VdUaZx8wrEVbBt4b729|J2rz`KvK*W0~bilZ6MN5ZIW9&f$f zMiO3!kM!7~@&&HAEM1wXIm$y)l-tYr7>~hqdkA{%5y=Lw9KUj_=;fcj{O0tTC(6y#_rXmY3d60l z$B?{>`QZq3;ep)FH>aqaAA5*h&XcCnlA$b1BabMb-?=kGZdY#2&8_J^6#BQCxZ8O_?wdXS z*$n;d^z{2q{MC_x!83Jz<>lpTstPvL<>T@zH;*)gEha5*``AHC!!yN0SHZ5|@-Ln? zjkeWBTE=rKT6?E|c_d^$Q8OQS{oKSR(Q*i?T^1# eHS{R5A{Y7di=1cwDCn9pez$&K6Zfg7b?^VjGYGH% literal 0 HcmV?d00001 diff --git a/public/images/office/Word-color_16x16x32.png b/public/images/office/Word-color_16x16x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b7889c868d53c0fe571e7b2f0f01c3ff23111c GIT binary patch literal 1448 zcmaJ>ZDtTQf z;$jr^0#P1%>pEyb5ZgVaKWGNKIyp&?J46fP$ix$njUX+1GYL@|1ST2=QAP7$e_olv zP(}7&156jumEb{4=@>RZ-*9)oG(0G=GPbuBZOL#@K^&MOnu)7glFN9ooL&yf)-{fy zIfyyv!PcD$cJ-jVZUB^V5O#@ZCeUWmK{{!d%k?r!5hQ^V6i!lh(#1I`jv&zdgF$PC z9N~Hef8G{6d9aviCO8~Vr_+wK)1eztoMc(n(m_#nh_EMzG*isjwPaI4g8-6}p(IR2 z*HBBN7}is!2ZNrjhY(M6b!{ltlKDizl;IgMfs+mbkH@XJa_FSl3m&`iM0B!$C;{+Z zkknI#1nUuLDv)9Bo^GfBl%)+^B4wz#IAsY3Du@HkOhTu~oJY`e?tr1d0*b1jODXGX zK=5Fxlp=GCKoM@1qFJZUFZf83C26mlVF|%WGK8CVTgEH}n~CtoAzNJ9D>S=kfoJ^; zNw$-2N)WsZ?ep_4H^Dah3*3N~G(}AUmQjnVJm&IG<#N0ML{m5VbzLpAN>5BT^<+#> zpnM;L4k((er;}C{^L_$Dc^k-nLyx1mGH}WhthY0~+t2W9I{_C7qxSoG*6rtE@C;3| zG?wSeo6=Q?nxbgN=ktqLB$y4>}qZY?0;2w39A?7_pv^a2fz ztN~}UsIB%sf)ot|1aE)l=dc=!g^ur;( z$0v%mgkC%J`nx-9wjRc8pl57XxlwzZro=_sbQ6-{31XkW~(J^bK1BBJf7 zv3)#ps^rqC6YmA9xo1ARJYA|*)zmc2Ubt{9G&(oeSAX~Bvki3Z(T2&%{rheg&%QWX zj;%c!JG!;5?4{GqcP7H2sI=!sNdjMPT^af2R?kO^H&^aeH9q*Z>g>!~ICdso8%4wQ ziC-6ADc!nd_xM*AcT!g~G3Tc@D#&Fvbv9FXx47}-_BXFi#eN6lR}TE*{Biqra_R5o z7ZytH{4p~+y=0&L;gCMEFk!pKcyy5s+PADsVWeku|jL2O9>>W6Q1 T-hS?c_3sR{cMFrg(2@TEuifxU literal 0 HcmV?d00001 diff --git a/public/images/office/Word-docx_20x20x32.png b/public/images/office/Word-docx_20x20x32.png new file mode 100644 index 0000000000000000000000000000000000000000..69e8ab3d179832311f8601dde0d912721be544b1 GIT binary patch literal 1531 zcmaJ>eQXnD7{86N0Bd2!i5m(WhsYn$-bZ`4-euir?^@Sn-O4uIAPBqOz1z;Uz4Lmd zEioAxUrzZL1_govF)Ds#86jfK5}9tua6w31TvYs+5rxDE_(5i1!S}j$><_{vcklDQ z_xnBH&)XfUeabp-(L4k}tbuBw9#EY&Y%~XJI7yA#MH6FBMK#Dqkcz65CQ2Q^K*OL-iMg@s{bw*# zk=5y0%tExmRQXEte1%`;GqLEmfOS!R(UJlCUF^-`b zh|%H3rkrXHhEQJB0ZQ8mn?x`K%8+)_;VdsNUyV`(N#F#9la!4t=NuGA5NP(npfz1? z&Xy1Q3^WMKcsN zhMF41u$nO381!^1gs2t_PAiVZvx$N!!&9P$lXe1+M$Nb~=(tf2?zwSabi6UG0lXf> z)r2m=dbBRjkzwv0Y$ykmrD>d&&?A{RWeEon5Ct(K4xJ)19zoB!I$ePU6eEHvCCtA8 z!Hp#nipGZg0mJl2yO}KcMY0OkGlL$}jGUPhFg3C)e8P@Az zNzzAp7!Sn~w4W9jlID4DjvI)@4KXGG)2PW+?s4e{ayecHqM_=Isv60)N~m2m)Ofq9 zp?m|4HYqV#O~%bCX8i=ZvKh#JU5%odGH}X$tb4q?&p|VMxxjjTBuTnFq)*@(pNDpl zK9=!dS*|=IUAd@v%I7F2d?f3i;(BQ(<71o*LkNDBr)Ug^&d3sHC`JTi`_mIKvQk7b zdxVRKu{M|tn+#gTM8v=JZgyWpf$)qp#l&am%N);W*BlbgfGJK7AKXlj zFNndJ)!}fiJ@*p4De~S62%g5&ci}sC?^eyCLTf`c5<34*{x27jOD=c5jLoBp%T|r7 zdTVlJzVn;0pJu-wM8cvxS!0p&^YZfE{`;VPbN=B^*KC?QIJB=-!)UwLX+h?_Onj8FZ-Kn3SyLi++($f?|3#rji-O`fAmg}bw>$eLI zG;IwRK9gR#^IFHnaN_Cpi?CGZ3%3j3N&hzyvVhU+loj!Sz9Ne{F z>7TaseSL?Ym^C-=jiRqV6Nk@Tn7?r1pMO`@GIP-W;-=76Yt1c3%cc4fP#yjL^Gipr ze>re&@QdP&AMHI}d3Nvk`48$WlOuKE_MzDWg-g!-wSC#px`+S3Y%3n>+rGPW>9!rc zPX6Xlhjv!zzcF;>goQZRwV@#Y_?n`gE7kh4n&rcn6J$cu~Lz2bec<@Jp zP!ktNii)Uhd&(XUmXy{wR|N2}VOz_|yq=8