From 48f8a88adb414c958823cdbd9949a9e05b3dc3ad Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Fri, 22 Jul 2011 17:08:57 -0400 Subject: [PATCH] BUG 0000 PM TABLES tweaks - tweaks on Edit report - icons size adjustment - labels --- .../engine/js/processmap/core/processmap.js | 2 +- workflow/engine/templates/pmTables/edit.js | 6 +-- .../engine/templates/pmTables/editReport.js | 46 +++++++----------- workflow/engine/templates/pmTables/export.js | 42 ++++++++-------- workflow/engine/templates/pmTables/list.js | 32 ++++-------- workflow/public_html/images/add-row-after.png | Bin 404 -> 374 bytes workflow/public_html/images/add-table.png | Bin 606 -> 568 bytes workflow/public_html/images/delete-row.png | Bin 371 -> 343 bytes workflow/public_html/images/delete-table.png | Bin 612 -> 512 bytes workflow/public_html/images/edit-row.png | Bin 726 -> 703 bytes workflow/public_html/images/edit-table.png | Bin 700 -> 667 bytes 11 files changed, 52 insertions(+), 76 deletions(-) diff --git a/workflow/engine/js/processmap/core/processmap.js b/workflow/engine/js/processmap/core/processmap.js index 2b6960ce5..96d94f9eb 100644 --- a/workflow/engine/js/processmap/core/processmap.js +++ b/workflow/engine/js/processmap/core/processmap.js @@ -158,7 +158,7 @@ var processmap=function(){ }.extend(this), reportTables:function(){ var panel = this.panels.buildingBlocks; - panel.addContentTitle(G_STRINGS.ID_PROCESSMAP_REPORT_TABLES); + panel.addContentTitle(''); panel.clearContent(); var iframe=document.createElement('iframe'); iframe.setAttribute('id','reportTablesIframe'); diff --git a/workflow/engine/templates/pmTables/edit.js b/workflow/engine/templates/pmTables/edit.js index 12c305288..cbcf6ffef 100644 --- a/workflow/engine/templates/pmTables/edit.js +++ b/workflow/engine/templates/pmTables/edit.js @@ -208,7 +208,7 @@ Ext.onReady(function(){ }) }, { xtype: 'booleancolumn', - header: 'Null', + header: _('ID_NULL'), dataIndex: 'field_null', align: 'center', width: 50, @@ -219,10 +219,10 @@ Ext.onReady(function(){ } }, { xtype: 'booleancolumn', - header: 'Primary Key', + header: _('ID_PRIMARY_KEY'), dataIndex: 'field_key', align: 'center', - width: 50, + width: 80, trueText: 'Yes', falseText: 'No', editor: { diff --git a/workflow/engine/templates/pmTables/editReport.js b/workflow/engine/templates/pmTables/editReport.js index 30fbe4da6..7d641b904 100644 --- a/workflow/engine/templates/pmTables/editReport.js +++ b/workflow/engine/templates/pmTables/editReport.js @@ -144,7 +144,7 @@ Ext.onReady(function(){ autoWidth : true, stripeRows : true, height : 100, - width : '25%', + width : 290, stateful : true, stateId : 'grid', enableHdMenu : false, @@ -158,13 +158,12 @@ Ext.onReady(function(){ rowdblclick: AssignFieldsAction }, tbar: [ - '->', { xtype: 'textfield', id: 'searchTxt', ctCls:'pm_search_text_field', allowBlank: true, - width: 150, + width: 220, emptyText: _('ID_ENTER_SEARCH_TERM'), listeners: { specialkey: function(f,e){ @@ -454,10 +453,6 @@ Ext.onReady(function(){ } }); - assignedGrid.getSelectionModel().on('selectionchange', function(sm){ - //alert('s'); - }); - // (vertical) selection buttons buttonsPanel = new Ext.Panel({ width : 40, @@ -755,19 +750,6 @@ Ext.onReady(function(){ } }); - var tbar = new Array(); - //if (_plugin_permissions !== false) { - if (TABLE !== false && TABLE.ADD_TAB_TAG == 'plugin@simplereport') { - tbar = [ - { - text: _plugin_permissions.label, - handler: function(){ - setTimeout(_plugin_permissions.fn, 0); - } - } - ] - } - var items = new Array(); if (PRO_UID === false) items.push(processComboBox); @@ -812,7 +794,7 @@ Ext.onReady(function(){ items.push(comboDbConnections); - var frmDetails = new Ext.FormPanel({ + var frmDetailsConfig = { id:'frmDetails', region: 'north', labelWidth: 120, @@ -827,10 +809,19 @@ Ext.onReady(function(){ msgTarget: 'side', align:'center' }, - items: items, - tbar: tbar - }); - + items: items + } + + if (TABLE !== false && TABLE.ADD_TAB_TAG == 'plugin@simplereport') { + frmDetailsConfig.tbar = [{ + text: _plugin_permissions.label, + handler: function(){ + setTimeout(_plugin_permissions.fn, 0); + } + }] + } + + var frmDetails = new Ext.FormPanel(frmDetailsConfig); southPanel = new Ext.FormPanel({ region: 'south', @@ -869,10 +860,7 @@ Ext.onReady(function(){ if (TABLE === false) { if(TABLE.ADD_TAB_TYPE != 'GRID') loadFieldNormal(); - } //else if(typeof avFieldsList != 'undefined') - //loadAvFieldsFromArray(avFieldsList); - - } else { + } } diff --git a/workflow/engine/templates/pmTables/export.js b/workflow/engine/templates/pmTables/export.js index c24052f56..64ad10598 100644 --- a/workflow/engine/templates/pmTables/export.js +++ b/workflow/engine/templates/pmTables/export.js @@ -1,5 +1,8 @@ - -var checkColumn; +/** + * Export PM Tables + * developed on date 2011-07-20 + * @author Erik Amaru Ortiz + */ var Export = function() { return { @@ -10,6 +13,7 @@ var Export = function() { // defining components targetGrid : {}, window : {}, + // init init : function() { Ext.form.Field.prototype.msgTarget = 'side'; @@ -24,7 +28,9 @@ var Export = function() { } }(); - +/** + * CONFIGURE ROUTINES + */ Export.configure = function() { /** @@ -32,7 +38,7 @@ Export.configure = function() */ this.targetGridConfig = { id : 'targetGrid', - title : 'To Export tables', + title : _('ID_TABLES_TO_EXPORT'), region: 'east', width : 450, split : true, @@ -50,16 +56,15 @@ Export.configure = function() ] }); - schemaColumn = new Ext.grid.CheckColumn({ - header: 'Schema', + header: _('ID_SCHEMA'), dataIndex: '_SCHEMA', width: 55, checked: true }); dataColumn = new Ext.grid.CheckColumn({ - header: 'Data', + header: _('ID_DATA'), dataIndex: '_DATA', width: 55 }); @@ -72,8 +77,8 @@ Export.configure = function() columns: [ new Ext.grid.RowNumberer(), {id:'ADD_TAB_UID', dataIndex: 'ADD_TAB_UID', hidden:true, hideable:false}, - {header: _('ID_TABLE'), dataIndex: 'ADD_TAB_NAME', width: 300}, - {header: _('ID_TYPE'), dataIndex: '_TYPE', width:70}, + {header: _('ID_PMTABLE'), dataIndex: 'ADD_TAB_NAME', width: 300}, + {header: _('ID_TYPE'), dataIndex: '_TYPE', width:100}, schemaColumn, dataColumn ] @@ -87,19 +92,14 @@ Export.configure = function() this.windowConfig = { title: '', layout: 'fit', - width: 550, + width: 570, height: 400, modal: true, autoScroll: true, maximizable: true, closeAction: 'hide', maximizable : false, - items: [], - listeners:{ - show:function() { - this.loadMask = new Ext.LoadMask(this.body, { msg:'Loading. Please wait...' }); - } - } + items: [] } this.windowConfig.buttons = [{ @@ -114,24 +114,26 @@ Export.configure = function() } //end configure +/** + * EXPORT ROUTINE + */ Export.submit = function() { - var rows = Export.targetGrid.getStore(); var rowsData = new Array(); for (i=0; i < rows.getCount(); i++) { row = rows.getAt(i); if ( row.data._SCHEMA == false && row.data._DATA == false) { - PMExt.info('INFO', 'From each table you should select Schema/Data to export at least one.'); + PMExt.info(_('ID_INFO'), _('ID_PMTABLES_NOTICE_EXPORT')); return false; } rowsData.push(row.data); } Ext.Msg.show({ - title : '', //TRANSLATIONS.ID_TITLE_START_CASE, //'Start Case', - msg : 'Processing...', + title : '', + msg : _('ID_PROCESSING'), wait: true, waitConfig: {interval:500} }); diff --git a/workflow/engine/templates/pmTables/list.js b/workflow/engine/templates/pmTables/list.js index b46926992..b67e414a2 100644 --- a/workflow/engine/templates/pmTables/list.js +++ b/workflow/engine/templates/pmTables/list.js @@ -41,19 +41,19 @@ Ext.onReady(function(){ var newMenuOptions = new Array(); if (PRO_UID == false) { newMenuOptions.push({ - text: 'New Table', + text: _('ID_NEW_PMATBLE'), handler: newPMTable }); } newMenuOptions.push({ - text: 'New Report Table', + text: _('ID_NEW_REPORT_TABLE'), handler: NewReportTable }); if (PRO_UID !== false) { newMenuOptions.push({ - text: 'New Report Table (Old Version)', + text: _('ID_NEW_REPORT_TABLE_OLD'), handler: NewReportTableOld }); } @@ -61,7 +61,6 @@ Ext.onReady(function(){ newButton = new Ext.Action({ text: _('ID_NEW'), icon: '/images/add-table.png', - menu: newMenuOptions }); @@ -79,13 +78,6 @@ Ext.onReady(function(){ disabled: true }); - // importButton = new Ext.Action({ - // text: _('ID_IMPORT'), - // iconCls: 'silk-add', - // icon: '/images/import.gif', - // handler: importOption - // }); - importButton = new Ext.Action({ text: _('ID_IMPORT'), iconCls: 'silk-add', @@ -114,10 +106,6 @@ Ext.onReady(function(){ handler: DoSearch }); - // contextMenu = new Ext.menu.Menu({ - // items: [editButton, deleteButton,'-',dataButton,'-',exportButton] - // }); - var contextMenuItems = new Array(); contextMenuItems.push(editButton); contextMenuItems.push(deleteButton); @@ -142,7 +130,6 @@ Ext.onReady(function(){ items: contextMenuItems }); - searchText = new Ext.form.TextField ({ id: 'searchTxt', ctCls:'pm_search_text_field', @@ -156,9 +143,9 @@ Ext.onReady(function(){ } }, focus: function(f,e) { - var row = infoGrid.getSelectionModel().getSelected(); - infoGrid.getSelectionModel().deselectRow(infoGrid.getStore().indexOf(row)); - } + var row = infoGrid.getSelectionModel().getSelected(); + infoGrid.getSelectionModel().deselectRow(infoGrid.getStore().indexOf(row)); + } } }); @@ -194,8 +181,6 @@ Ext.onReady(function(){ comboPageSize.setValue(pageSize); - - store = new Ext.data.GroupingStore( { proxy : new Ext.data.HttpProxy({ url: 'pmTablesProxy/getList' + (PRO_UID? '?pro_uid='+PRO_UID: '') @@ -264,7 +249,7 @@ Ext.onReady(function(){ cmodelColumns.push({header: 'Table Type', dataIndex: 'PRO_UID', width: 120, align:'left', renderer: function(v,p,r){ color = r.get('PRO_UID') ? 'blue' : 'green'; - value = r.get('PRO_UID') ? 'Report' : 'Table'; + value = r.get('PRO_UID') ? _('ID_REPORT_TABLE') : _('ID_PMTABLE'); return ''+value+' '; }}); @@ -547,7 +532,7 @@ ExportPMTable = function(){ toExportRows.push([ rows[i].get('ADD_TAB_UID'), rows[i].get('ADD_TAB_NAME'), - (rows[i].get('PRO_UID') == ''? 'Table': 'Report'), + (rows[i].get('PRO_UID') ? _('ID_REPORT_TABLE'): _('ID_PMTABLE')), true, false ]); @@ -557,6 +542,7 @@ ExportPMTable = function(){ Export.window.show(); return; + iGrid = Ext.getCmp('infoGrid'); rowsSelected = iGrid.getSelectionModel().getSelections(); //location.href = 'additionalTablesToExport?sUID='+RetrieveRowsID(rowsSelected)+'&rand='+Math.random(); diff --git a/workflow/public_html/images/add-row-after.png b/workflow/public_html/images/add-row-after.png index 4dde29acaa7dec264fb333d3710fc59d5038946d..edb00818bddcee4b960af525d225a3e1cb7dbaaf 100644 GIT binary patch delta 322 zcmV-I0lof|1NH(TiBL{Q4GJ0x0000DNk~Le0000I0000H2nGNE0MJ_e`H>+%e-;!M z6X|VS`v3p{_DMuRR5;7+ld(zzK@f(&F=q^FBy4kFb>;!I_8sKx?Q8`#j}WkwK=3&% zuN5rP`V6u0s$c?JNU-=VS)f|@uQ8?;yX;!II4pbzIeR@W-;GxJ+!1c>oq0f4Fws)UM2yn!e4 z1`g(0Xm=7eZOaAh*Z^pr_Dg|pe}`cT;mp6k+y$VQTvs*<2Yq_m!%j`$Mh2qOk)9x5eC@+0000l1h@ntiBL{Q4GJ0x0000DNk~Le0000G0000F2nGNE0PS;6FOeZXe-;!1 z1u6^=z5oCLxJg7oR4C7llg(=rQ5400Z}KJ5NgFeSK+_Kr(k=x}i(?Qf?gX!yjj}-v^9|e0cfAZ~pVyd5n z>gUqIE0ju=XF^Je7@y4$jBV3v9Q@QUo=?l;Uo%K4VJw{igthdgtDX6|Q3APs=6=K& zOJ^8Lu1hJKdhltgW5UL2t@9y#ERgEc+P9k$qPK1nzPxDx$0tLMsza9xPkF$~eVR&f zeO~UYO`Kk%-E}5!Vl1oyTafD0$lgn$ue_o7zRBS0%Y=2kT}?W4xh!xiTHy1^IF)VD zT|)VLzyjMT+kI+*>xDU|guT~K9DsTotLnF|WJRyP@vJxjB?p=^a3kaT00000NkvXX Hu0mjfxn%A> delta 556 zcmV+{0@MAt1l|N8iBL{Q4GJ0x0000DNk~Le0000M0000M2nGNE0K~LxJCPwje+v&O zCQKVZb^rhY-bqA3R5;7kmCtJvK^TUg$uEmEsj+J)G*xM6dn}j`9D|^E>mgpH)c6lVT1X*u%>( z&wexWzTXHSP6vh$Kq>Y7e?o;2e{l~T8v76IYj;8TvIrdQLuw(0NVygFl(R#?^wS#4&4=pM^h!N;b;cAX*eeo1gL8?HsQjPB~iYe-h)S;noW` zxOMUlIXhUsc;V-qy~DlcuGrq}ZRG;zuMrD|NCZQiSbc`aD)6W-BtU#Od1B;ZhTd4V zWs9tS(=Z=jP+Q-}Ym-L>j8Y1QCo+|vl|QMUs@Gk|3Fmsa^fkutM23OX;_iBf12vI8 zparY+($k%KBfrj*?$+81e~6V8NL@O>kz@ptW3H`xIijD(a1~Pc&|>o3E+9FEd3_du zbhn0aHHEx8$J&c>#qXyRd+QayyR;$iq?CD)Fm5V!Vc8Eb$6B4ebHVM uTA7)w(#4wj24~vT$NS<15uJKW{{m$Rq}K+(ry~FW002ovPDHLk0$_r+LjbV= diff --git a/workflow/public_html/images/delete-row.png b/workflow/public_html/images/delete-row.png index df91c3752aebd9b61b31280a0f395ab68313c457..c4a8ceffa8e7debef5f046867549d24f61067a4f 100644 GIT binary patch delta 290 zcmV+-0p0%d0@nf|iBL{Q4GJ0x0000DNk~Le0000H0000G2nGNE0Pr!CUy&g{e-;!N zE;gMEB>(^b*GWV{R5;7cl08ntKoo?(XRjd*P=Kg%2@|=>8GHtiq9`>bMU=IaTOdj< zK<e(L&iP?zqDTR+Z7CGIc4ua1<~@_dx#IvjHXVfkWjy}UPOpt3FYJRL4}&Hr zQQf28OnR;3)ROP>K2RISBw@~mcx_9p>c;{2y?+CEPW&(X*IUx#k1;2!G&4yulf?SM zvJeq~gbcv$@`TUXW3ZDG;(=5dN3x$z9Kg+0`rfLLa#<;8k|?YQuG+_b&~$A7?M`kV o7D2>icdpgPQ=`ba6Y&T04OjkCZql<1Hvj+t07*qoM6N<$f`wvw8UO$Q delta 319 zcmV-F0l@y(0`mePiBL{Q4GJ0x0000DNk~Le0000M0000M2nGNE0K~LxJCPwje+v#1 zDfrLnsQ>@~^GQTOR5;7!l`&4kFcd)FCyv^MB2@@=U`DKw)v0HwI7C!2Gcr{5z$ri- zIY2JK*3LaZSJ+!feJUmYRCuyw|L5a0$vh}aVvYR3mQ*+E+# zZhZ?^!FZz|`g9QZp41!YAg*17e_K!NpH!3rFNOo4vI+t0XB~@?QPsdQ-y&jj8N1X? z0q#Qg?dY9%qFrEs7C@@1;#E-uW?=w?^Z_^@h9dG<1~+Ay?LhlfWFS9ge0CZ=R}#Eh zdNf8VT002ovPDHLkV1jisgFpZP diff --git a/workflow/public_html/images/delete-table.png b/workflow/public_html/images/delete-table.png index d2a949294a7b42d57952ceb91a8ca72f90b5b2e5..fa92699c2401dfff0814c1b6128942ee08332da0 100644 GIT binary patch delta 500 zcmV0004iNklA4pLi7I5ijr+2#-p4GG~`hN*)R zVQ(`b<1LB#s}z;q`x^9JeZ5M_3m5Lk{mwbxPmYK%%;5)hlu}8m8;w*GpGkR3sU&fK zL;xq)Fb%)B%m`qsHb6^BItEF!gTdO0e84LgbbF+y0RuqIV8E!?%Yle+b(KE zefx0Rt=RQ=ao|6O+ipeRG|;X=@bZp-=4NLGZe8KEg!AAL&VnZ#tAT4_ia8_%QDaYz z$*@gKqtGBcWpl_BrS2TOH`EIHW>urAfWIFd08p!pgdj3tzAhsi6}m&zB80LzX7>vI zm_j%zU}bT>oo|B>izl$W+6WSYh*GI5%)p`R qxQbL!?FFj{ws-dawT;}c>-+_7Tht}Ob1GK=0000<`Te;jm0SaefwW^{L9a%BKPWN%_+AVz6&Wp{6KYjYq&Q!|*>Mgsr< z02OpaSad^jWnpw_Z*Cw|X>DZyI4?0XFEBZLiBi`900F&8L_t(IjpdasOd~-UhM$FA z%5NHIf*_zkkQ{=fir=943l>oY0t7*vKs1NLT&fU|Ai&@-e>H>z2M7WcOfjr0Bs3`` zG^O3bwJC*VPH^3Hpt~T7;#KqI+j;WL?98qvgphneTmU|wucFXMBtlh1i6!|4U{jou ztEnLyzp}=rIDPk=tF%}R-7C$EslA)9I6Vk}*4f1)5Us6cd}5TFM9Llv;PNzBV{aMb zt=$|8Bh_Txe{KMJ41={`(AgN^IrG=n7GS>NkeUBbfUMh1T_E5L?r4cIG1zU@VLeW7 zcbigQ4^3k{J>mCy0NB3EFsx}vsopc?<=v$+Wi3mS3;x0H^{})UU}be3zt_XY=7zIz z(aNcoeUpUtCjm&_rWqcaVs3WsWANLhzpYyvUubG>ectopdUpsmIZ^b9=Cvr+zWe0y45!elAX(#t%xlc)UDV%(i!Oa2|zM0IX(%~-`7jh zcs-Kh?A#XYc%{vPw4lWlq0vM=vS57PIIPD>rwt3bb8w>ciN<+mh=z?!xcUZAIh?c5roh` zf)Hc*kWfz|5kbTXnhz@UP((esXb&TZdJu#KiLQE;)aJ;)YjkH<-179W+`3*N5`SEgqK3Y4wn5{oB)Yf{rFn+Im<3ys35q*uE z`xE)d!c2DF_yNG|UHskA$DLh#`aH$KsR``G^2WJ%3l{>c5SZl`v@+5r1#wuhWtK)#WIQO zUh1iBHwhuw8viKvdh=3Zo05#Vad3HHj`(}4@gFIw4flXs$GEgu$5RLQUodE|V6=Z2 zk0u>Hj=Q6hg(U}21B8qpf6{rwmZzu|G_wtp+>C7V_7AUkwDy@R6joMaLT2@v6-UFS zQBhHq6m>18;{bRqRYdyMaX*NYj4A+pd7a+=EIYs2V_HE$4w5yAWE3Dx z$+0x4X+y(HLI|X~(>|(?Orm}(&p{ORui`UCQPmt!LTXwAAoJZKzK*NL)aKtl(y7Ym nycF8Z9PsmxZw3^DqP?)+x5dtd8cYec00000NkvXXu0mjf;aD;W delta 676 zcmV;V0$csR1=a;2iBL{Q4GJ0x0000DNk~Le0000M0000M2nGNE0K~LxJCPwje+v#B zI^yz$`2YX{R!KxbR5;7kl}|`haU8%uZ+o*%UCyan7ePg^q(e9udxZz_P?k)LAcX!A zgc!C%LY>Bl2qIRH9#rU1M4dF+A%v)d5Ex{->MBmrkxm_>Z9Un{*J0Zm%jqQZ&=(%> zeZTPi{J!t|?M70wEHv?|->1CUGdKfn zvJwFxb$|-i{4MloBdxb|JwAY`WlWoK9NVTsXr6QB5X`!=9KFPHmk~R|eYAFVF;{|CB**FQW#L@C_&R)V6Cf{wfD{+sEsUQ238XH}s7IE1r3RAB~0k zSQj-Rd88cM<>fk_S$Xi1e*ue`5%&-+vT*DqQbz?#AuCV=_zDk5^-WV&iIyVkO=v_1 zqRHtVT5XZr16L`kID`g~wd+Q#4V#4{K2T`{RER^e2S`$UB1vp!+kLauD0w8J-^*2Km8XO3Ka4Xwmda~v zKu+5XK(sJ;@!jJbeIvID$bos_XIj?-y1dIiJ$e7n4I=EltD;SaU91#&uuzWaT{w!Am}2)=n$)hPw^lgqO6HsVz8!{ z5Mhl%C@(TP1Q82L59zIlJk7v^bg4sNESR{3mkwnk8#S$Mw8ml${~gAA+nbZHAN+am z55Mo{eZRl|pC<_+*l+oVrJ?pUe=Y%RI(RPa7oq?hZDat}l9=lD3pjC{!JCGOB?YjP zqel`#Aoa)nnr@4sRkLrh{UGFw%umMLBW~jBQMw1m>JxX(1$XKk^Ln+h{a~uBsxOwF zg`WV#?`#CeV^bq;Uav>#j;>;B)E6!%`nfXmOe~ino7Ap}AQ z{xR6!JzJ?N2SuY}b~}(J@wQj#D#bBmO~?URqaRJ$dD6zc1!ip)Lep~$=nlvEaL_;y%(=d05++o2yk zywC4_cs|ef{qlQ%j{xlCAS3`)e^uZ8OQ;aSo=1*C+Rx^m7SU{-;3B}Rjc2}~I=XLg z8fvRx8GzIQ8aVH7p{Gybx|!b<1ejQ$bbXE5ZLJXXGd((jDZfOQ7g@d$aEuN0;%aSU z=IDumM%R^s$lbEU`B)=EJ9}&`k7bgAWa^pt4#3QvX>Vt^ueFU=A0|0De>slDC?zgM z>bdNDn(;R~cy`gWMQxD<0**0nXSmOEH3RJ*q#<72e%%**GMddYyQ-?FstQ$IZa`>5 zR_apo!b)#9BhmNtynMufx0?~8MC_WIW~wf9r}t|d*livEsEx)pDNPpI{ENyGk+*e! zuH*cbQe;Kez3W)0=5Yo0e}?f}Oa%G|X^4w6=a5?tGaohYBqw7~@NGu8K8-L4&3v4L#^Q#_E*VeRq=;nU%RR4Z88uH>zCqi@mkYFE1YI^5mxVZ9Lu5 k?0=Wr|8s+gTwSKW0Lr`BZ)^AOF8}}l07*qoM6N<$f)WZZDgXcg