00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00075 require_once (PATH_t3lib.'class.t3lib_loaddbgroup.php');
00076 require_once (PATH_t3lib.'class.t3lib_loadmodules.php');
00077 require_once (PATH_t3lib.'class.t3lib_parsehtml_proc.php');
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00098 class t3lib_transferData {
00099
00100 var $lockRecords=0;
00101 var $disableRTE=0;
00102 var $prevPageID = '';
00103 var $defVals=array();
00104 var $addRawData = FALSE;
00105
00106
00107 var $regTableItems = Array();
00108 var $regTableItems_data = Array();
00109 var $loadModules='';
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00137 function fetchRecord($table,$idList,$operation) {
00138 global $TCA;
00139
00140 if ((string)$idList == 'prev') {$idList = $this->prevPageID;}
00141
00142 if ($TCA[$table]) {
00143 t3lib_div::loadTCA($table);
00144
00145
00146 $ids = t3lib_div::trimExplode(',',$idList,1);
00147 foreach($ids as $id) {
00148 if (strcmp($id,'')) {
00149
00150
00151 if ($operation=='new') {
00152
00153
00154 $newRow = Array();
00155
00156
00157 $TCAdefaultOverride = $GLOBALS['BE_USER']->getTSConfigProp('TCAdefaults');
00158 if (is_array($TCAdefaultOverride[$table.'.'])) {
00159 foreach($TCAdefaultOverride[$table.'.'] as $theF => $theV) {
00160 if (isset($TCA[$table]['columns'][$theF])) {
00161 $newRow[$theF]=$theV;
00162 }
00163 }
00164 }
00165
00166
00167 if (is_array($this->defVals[$table])) {
00168 foreach($this->defVals[$table] as $theF => $theV) {
00169 if (isset($TCA[$table]['columns'][$theF])) {
00170 $newRow[$theF]=$theV;
00171 }
00172 }
00173 }
00174
00175
00176 if ($id<0 && $TCA[$table]['ctrl']['useColumnsForDefaultValues']) {
00177
00178 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $table, 'uid='.abs($id).t3lib_BEfunc::deleteClause($table));
00179 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00180
00181 $fArr=t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['useColumnsForDefaultValues'],1);
00182 while(list(,$theF)=each($fArr)) {
00183 if (isset($TCA[$table]['columns'][$theF])) {
00184 $newRow[$theF]=$row[$theF];
00185 }
00186 }
00187 }
00188 $GLOBALS['TYPO3_DB']->sql_free_result($res);
00189 }
00190
00191
00192 $this->renderRecord($table, uniqid('NEW'), $id, $newRow);
00193 } else {
00194 $id=intval($id);
00195
00196
00197 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $table, 'uid='.intval($id).t3lib_BEfunc::deleteClause($table));
00198 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00199 $this->renderRecord($table, $id, $row['pid'], $row);
00200 $contentTable = $GLOBALS['TYPO3_CONF_VARS']['SYS']['contentTable'];
00201 $this->lockRecord($table, $id, $contentTable==$table?$row['pid']:0);
00202 }
00203 $GLOBALS['TYPO3_DB']->sql_free_result($res);
00204 }
00205 }
00206 }
00207 }
00208 }
00209
00223 function renderRecord($table, $id, $pid, $row) {
00224 global $TCA;
00225
00226
00227 $uniqueItemRef = $table.'_'.$id;
00228 t3lib_div::loadTCA($table);
00229
00230
00231 list($tscPID)=t3lib_BEfunc::getTSCpid($table,$id,$pid);
00232 $TSconfig = t3lib_BEfunc::getTCEFORM_TSconfig($table,array_merge($row,array('uid'=>$id,'pid'=>$pid)));
00233
00234
00235 if (!$this->regTableItems[$uniqueItemRef]) {
00236 $this->regTableItems[$uniqueItemRef] = 1;
00237
00238
00239 if ($table == 'pages') {$this->prevPageID = $id;}
00240
00241 $this->regTableItems_data[$uniqueItemRef] = $this->renderRecordRaw($table, $id, $pid, $row, $TSconfig, $tscPID);
00242
00243
00244 if ($this->addRawData && is_array($row) && is_array($this->regTableItems_data[$uniqueItemRef])) {
00245 $this->regTableItems_data[$uniqueItemRef] = array_merge($row, $this->regTableItems_data[$uniqueItemRef]);
00246 }
00247 }
00248 }
00249
00250
00251
00267 function renderRecordRaw($table, $id, $pid, $row, $TSconfig='', $tscPID=0) {
00268 global $TCA;
00269
00270 if(!is_array($TSconfig)) {
00271 $TSconfig = array();
00272 }
00273
00274
00275 $totalRecordContent=array();
00276
00277
00278
00279 t3lib_div::loadTCA($table);
00280 $copyOfColumns = $TCA[$table]['columns'];
00281 foreach($copyOfColumns as $field => $fieldConfig) {
00282
00283 if (isset($row[$field])) {
00284 $data = $row[$field];
00285 } else {
00286 $data = $fieldConfig['config']['default'];
00287 }
00288
00289 $data = $this->renderRecord_SW($data,$fieldConfig,$TSconfig,$table,$row,$field);
00290
00291
00292 $totalRecordContent[$field] = isset($data) ? $data : '';
00293 }
00294
00295
00296
00297 $types_fieldConfig = t3lib_BEfunc::getTCAtypes($table,$totalRecordContent);
00298 if (is_array($types_fieldConfig)) {
00299 $totalRecordContent = $this->renderRecord_typesProc($totalRecordContent,$types_fieldConfig,$tscPID,$table,$pid);
00300 }
00301
00302
00303 foreach($totalRecordContent as $field => $data) {
00304 $this->regItem($table,$id,$field,$data);
00305 }
00306
00307
00308 reset($totalRecordContent);
00309
00310 return $totalRecordContent;
00311
00312 }
00313
00325 function renderRecord_SW($data,$fieldConfig,$TSconfig,$table,$row,$field) {
00326
00327 switch((string)$fieldConfig['config']['type']) {
00328 case 'group':
00329 $data = $this->renderRecord_groupProc($data,$fieldConfig,$TSconfig,$table,$row,$field);
00330 break;
00331 case 'select':
00332 $data = $this->renderRecord_selectProc($data,$fieldConfig,$TSconfig,$table,$row,$field);
00333 break;
00334 case 'flex':
00335 $data = $this->renderRecord_flexProc($data,$fieldConfig,$TSconfig,$table,$row,$field);
00336 break;
00337 }
00338
00339 return $data;
00340 }
00341
00355 function renderRecord_groupProc($data,$fieldConfig,$TSconfig,$table,$row,$field) {
00356 switch ($fieldConfig['config']['internal_type']) {
00357 case 'file':
00358
00359 $dataAcc=array();
00360
00361
00362 if ($fieldConfig['config']['MM']) {
00363 $loadDB = t3lib_div::makeInstance('t3lib_loadDBGroup');
00364 $loadDB->start('', 'files', $fieldConfig['config']['MM'], $row['uid']);
00365
00366 foreach($loadDB->itemArray as $value) {
00367 if ($value['id']) {
00368 $dataAcc[]=rawurlencode($value['id']).'|'.rawurlencode($value['id']);
00369 }
00370 }
00371 } else {
00372 $fileList = t3lib_div::trimExplode(',',$data,1);
00373 foreach($fileList as $value) {
00374 if ($value) {
00375 $dataAcc[]=rawurlencode($value).'|'.rawurlencode($value);
00376 }
00377 }
00378 }
00379
00380 $data = implode(',',$dataAcc);
00381 break;
00382 case 'db':
00383 $loadDB = t3lib_div::makeInstance('t3lib_loadDBGroup');
00384 $loadDB->start($data, $fieldConfig['config']['allowed'], $fieldConfig['config']['MM'], $row['uid']);
00385 $loadDB->getFromDB();
00386 $data = $loadDB->readyForInterface();
00387 break;
00388 }
00389
00390 return $data;
00391 }
00392
00406 function renderRecord_selectProc($data,$fieldConfig,$TSconfig,$table,$row,$field) {
00407 global $TCA;
00408
00409
00410 $elements = t3lib_div::trimExplode(',',$data,1);
00411 $dataAcc=array();
00412
00413
00414 if (intval($fieldConfig['config']['maxitems'])>1) {
00415
00416
00417 if (is_array($fieldConfig['config']['items'])) {
00418 $fieldConfig['config']['items'] = $this->procesItemArray($fieldConfig['config']['items'], $fieldConfig['config'], $TSconfig[$field], $table, $row, $field);
00419 foreach($fieldConfig['config']['items'] as $pvpv) {
00420 foreach($elements as $eKey => $value) {
00421 if (!strcmp($value,$pvpv[1])) {
00422 $dataAcc[$eKey]=rawurlencode($pvpv[1]).'|'.rawurlencode($pvpv[0]);
00423 }
00424 }
00425 }
00426 }
00427
00428
00429 if ($fieldConfig['config']['special']) {
00430 $dataAcc = $this->selectAddSpecial($dataAcc, $elements, $fieldConfig['config']['special']);
00431 }
00432
00433
00434 if ($TCA[$fieldConfig['config']['foreign_table']]) {
00435 $dataAcc = $this->selectAddForeign($dataAcc, $elements, $fieldConfig, $field, $TSconfig, $row);
00436 }
00437
00438
00439 ksort($dataAcc);
00440 } else {
00441 if ($TCA[$fieldConfig['config']['foreign_table']]) {
00442
00443 $dataIds = $this->getDataIdList($elements, $fieldConfig, $row);
00444
00445 if (!count($dataIds)) $dataIds = array(0);
00446 $dataAcc[]=$dataIds[0];
00447 } else {
00448 $dataAcc[]=$elements[0];
00449 }
00450 }
00451
00452 return implode(',',$dataAcc);
00453 }
00454
00469 function renderRecord_flexProc($data,$fieldConfig,$TSconfig,$table,$row,$field) {
00470 global $TCA;
00471
00472
00473 $currentValueArray = t3lib_div::xml2array($data);
00474 if (is_array($currentValueArray)) {
00475
00476
00477 $dataStructArray = t3lib_BEfunc::getFlexFormDS($fieldConfig['config'],$row,$table);
00478 if (is_array($dataStructArray)) {
00479 $currentValueArray['data'] = $this->renderRecord_flexProc_procInData($currentValueArray['data'],$dataStructArray,array($data,$fieldConfig,$TSconfig,$table,$row,$field));
00480 $data = t3lib_div::array2xml($currentValueArray);
00481 }
00482 }
00483
00484 return $data;
00485 }
00486
00498 function renderRecord_typesProc($totalRecordContent,$types_fieldConfig,$tscPID,$table,$pid) {
00499 foreach($types_fieldConfig as $vconf) {
00500
00501
00502 $eFile = t3lib_parsehtml_proc::evalWriteFile($vconf['spec']['static_write'],$totalRecordContent);
00503
00504
00505 if (is_array($eFile)) {
00506 if ($eFile['loadFromFileField'] && $totalRecordContent[$eFile['loadFromFileField']]) {
00507
00508 $SW_fileContent = t3lib_div::getUrl($eFile['editFile']);
00509 $parseHTML = t3lib_div::makeInstance('t3lib_parsehtml_proc');
00510 $parseHTML->init('','');
00511
00512 $totalRecordContent[$vconf['field']] = $parseHTML->getSubpart(
00513 $SW_fileContent,
00514 $eFile['markerField']&&trim($totalRecordContent[$eFile['markerField']])
00515 ? trim($totalRecordContent[$eFile['markerField']])
00516 : '###TYPO3_STATICFILE_EDIT###'
00517 );
00518 }
00519 }
00520 }
00521
00522 return $totalRecordContent;
00523 }
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00554 function renderRecord_flexProc_procInData($dataPart,$dataStructArray,$pParams) {
00555 if (is_array($dataPart)) {
00556 foreach($dataPart as $sKey => $sheetDef) {
00557 list ($dataStruct,$actualSheet) = t3lib_div::resolveSheetDefInDS($dataStructArray,$sKey);
00558
00559 if (is_array($dataStruct) && $actualSheet==$sKey && is_array($sheetDef)) {
00560 foreach($sheetDef as $lKey => $lData) {
00561 $this->renderRecord_flexProc_procInData_travDS(
00562 $dataPart[$sKey][$lKey],
00563 $dataStruct['ROOT']['el'],
00564 $pParams
00565 );
00566 }
00567 }
00568 }
00569 }
00570
00571 return $dataPart;
00572 }
00573
00583 function renderRecord_flexProc_procInData_travDS(&$dataValues,$DSelements,$pParams) {
00584 if (is_array($DSelements)) {
00585
00586
00587 foreach($DSelements as $key => $dsConf) {
00588
00589
00590 if ($DSelements[$key]['type']=='array') {
00591 if (is_array($dataValues[$key]['el'])) {
00592 if ($DSelements[$key]['section']) {
00593 foreach($dataValues[$key]['el'] as $ik => $el) {
00594 $theKey = key($el);
00595 if (is_array($dataValues[$key]['el'][$ik][$theKey]['el'])) {
00596 $this->renderRecord_flexProc_procInData_travDS(
00597 $dataValues[$key]['el'][$ik][$theKey]['el'],
00598 $DSelements[$key]['el'][$theKey]['el'],
00599 $pParams
00600 );
00601 }
00602 }
00603 } else {
00604 if (!isset($dataValues[$key]['el'])) $dataValues[$key]['el']=array();
00605 $this->renderRecord_flexProc_procInData_travDS(
00606 $dataValues[$key]['el'],
00607 $DSelements[$key]['el'],
00608 $pParams
00609 );
00610 }
00611 }
00612 } else {
00613 if (is_array($dsConf['TCEforms']['config']) && is_array($dataValues[$key])) {
00614 foreach($dataValues[$key] as $vKey => $data) {
00615
00616
00617 list(,,$CVTSconfig,$CVtable,$CVrow,$CVfield) = $pParams;
00618 ;
00619
00620 if (!isset($dataValues[$key][$vKey])) {
00621 $dataValues[$key][$vKey] = $dsConf['TCEforms']['config']['default'];
00622 }
00623
00624
00625 $dataValues[$key][$vKey] = $this->renderRecord_SW($dataValues[$key][$vKey],$dsConf['TCEforms'],$CVTSconfig,$CVtable,$CVrow,'');
00626 }
00627 }
00628 }
00629 }
00630 }
00631 }
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00660 function selectAddSpecial($dataAcc, $elements, $specialKey) {
00661 global $TCA;
00662
00663
00664 switch ((string)$specialKey) {
00665 case 'tables':
00666 $tNames = array_keys($TCA);
00667 foreach($tNames as $tableName) {
00668 foreach($elements as $eKey => $value) {
00669 if (!strcmp($tableName,$value)) {
00670 $dataAcc[$eKey]=rawurlencode($value).'|'.rawurlencode($this->sL($TCA[$value]['ctrl']['title']));
00671 }
00672 }
00673 }
00674 break;
00675 case 'pagetypes':
00676 $theTypes = $TCA['pages']['columns']['doktype']['config']['items'];
00677 if (is_array($theTypes)) {
00678 foreach($theTypes as $theTypesArrays) {
00679 foreach($elements as $eKey => $value) {
00680 if (!strcmp($theTypesArrays[1],$value)) {
00681 $dataAcc[$eKey]=rawurlencode($value).'|'.rawurlencode($this->sL($theTypesArrays[0]));
00682 }
00683 }
00684 }
00685 }
00686 break;
00687 case 'exclude':
00688 $theExcludeFields = t3lib_BEfunc::getExcludeFields();
00689
00690 if (is_array($theExcludeFields)) {
00691 foreach($theExcludeFields as $theExcludeFieldsArrays) {
00692 foreach($elements as $eKey => $value) {
00693 if (!strcmp($theExcludeFieldsArrays[1],$value)) {
00694 $dataAcc[$eKey]=rawurlencode($value).'|'.rawurlencode(ereg_replace(':$','',$theExcludeFieldsArrays[0]));
00695 }
00696 }
00697 }
00698 }
00699 break;
00700 case 'explicitValues':
00701 $theTypes = t3lib_BEfunc::getExplicitAuthFieldValues();
00702
00703 foreach($theTypes as $tableFieldKey => $theTypeArrays) {
00704 if (is_array($theTypeArrays['items'])) {
00705 foreach($theTypeArrays['items'] as $itemValue => $itemContent) {
00706 foreach($elements as $eKey => $value) {
00707 if (!strcmp($tableFieldKey.':'.$itemValue.':'.$itemContent[0], $value)) {
00708 $dataAcc[$eKey] = rawurlencode($value).'|'.rawurlencode('['.$itemContent[2].'] '.$itemContent[1]);
00709 }
00710 }
00711 }
00712 }
00713 }
00714 break;
00715 case 'languages':
00716 $theLangs = t3lib_BEfunc::getSystemLanguages();
00717 foreach($theLangs as $lCfg) {
00718 foreach($elements as $eKey => $value) {
00719 if (!strcmp($lCfg[1], $value)) {
00720 $dataAcc[$eKey] = rawurlencode($value).'|'.rawurlencode($lCfg[0]);
00721 }
00722 }
00723 }
00724 break;
00725 case 'custom':
00726 $customOptions = $GLOBALS['TYPO3_CONF_VARS']['BE']['customPermOptions'];
00727
00728 if (is_array($customOptions)) {
00729 foreach($customOptions as $coKey => $coValue) {
00730 if (is_array($coValue['items'])) {
00731
00732 foreach($coValue['items'] as $itemKey => $itemCfg) {
00733 foreach($elements as $eKey => $value) {
00734 if (!strcmp($coKey.':'.$itemKey, $value)) {
00735 $dataAcc[$eKey] = rawurlencode($value).'|'.rawurlencode($GLOBALS['LANG']->sl($itemCfg[0]));
00736 }
00737 }
00738 }
00739 }
00740 }
00741 }
00742 break;
00743 case 'modListGroup':
00744 case 'modListUser':
00745 if (!$this->loadModules) {
00746 $this->loadModules = t3lib_div::makeInstance('t3lib_loadModules');
00747 $this->loadModules->load($GLOBALS['TBE_MODULES']);
00748 }
00749 $modList = ($specialKey=='modListUser') ? $this->loadModules->modListUser : $this->loadModules->modListGroup;
00750
00751 foreach($modList as $theModName) {
00752 foreach($elements as $eKey => $value) {
00753 $label = '';
00754
00755 $pp = explode('_',$value);
00756 if (count($pp)>1) $label.=$GLOBALS['LANG']->moduleLabels['tabs'][$pp[0].'_tab'].'>';
00757
00758 $label.= $GLOBALS['LANG']->moduleLabels['tabs'][$value.'_tab'];
00759
00760 if (!strcmp($theModName,$value)) {
00761 $dataAcc[$eKey]=rawurlencode($value).'|'.rawurlencode($label);
00762 }
00763 }
00764 }
00765 break;
00766 }
00767
00768 return $dataAcc;
00769 }
00770
00784 function selectAddForeign($dataAcc, $elements, $fieldConfig, $field, $TSconfig, $row) {
00785 global $TCA;
00786
00787
00788 $recordList = Array();
00789
00790
00791 $subres = t3lib_BEfunc::exec_foreign_table_where_query($fieldConfig,$field,$TSconfig);
00792 while ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($subres)) {
00793 $recordList[$subrow['uid']] = t3lib_BEfunc::getRecordTitle($fieldConfig['config']['foreign_table'],$subrow);
00794 }
00795
00796
00797 if (is_array($TCA[$fieldConfig['config']['neg_foreign_table']])) {
00798 $subres = t3lib_BEfunc::exec_foreign_table_where_query($fieldConfig,$field,$TSconfig,'neg_');
00799 while ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($subres)) {
00800 $recordList[-$subrow['uid']] = t3lib_BEfunc::getRecordTitle($fieldConfig['config']['neg_foreign_table'],$subrow);
00801 }
00802 }
00803
00804
00805
00806 $dataIds = $this->getDataIdList($elements, $fieldConfig, $row);
00807 if ($fieldConfig['config']['MM']) $dataAcc=array();
00808
00809
00810 foreach($dataIds as $theId) {
00811 if (isset($recordList[$theId])) {
00812 $lPrefix = $this->sL($fieldConfig['config'][($theId>0?'':'neg_').'foreign_table_prefix']);
00813 if ($fieldConfig['config']['MM']) {
00814 $dataAcc[]=rawurlencode($theId).'|'.rawurlencode(t3lib_div::fixed_lgd_cs($lPrefix.strip_tags($recordList[$theId]),$GLOBALS['BE_USER']->uc['titleLen']));
00815 } else {
00816 foreach($elements as $eKey => $value) {
00817 if (!strcmp($theId,$value)) {
00818 $dataAcc[$eKey]=rawurlencode($theId).'|'.rawurlencode(t3lib_div::fixed_lgd_cs($lPrefix.strip_tags($recordList[$theId]),$GLOBALS['BE_USER']->uc['titleLen']));
00819 }
00820 }
00821 }
00822 }
00823 }
00824
00825 return $dataAcc;
00826 }
00827
00837 function getDataIdList($elements, $fieldConfig, $row) {
00838 $loadDB = t3lib_div::makeInstance('t3lib_loadDBGroup');
00839 $loadDB->registerNonTableValues=$fieldConfig['config']['allowNonIdValues'] ? 1 : 0;
00840 $loadDB->start(implode(',',$elements), $fieldConfig['config']['foreign_table'].','.$fieldConfig['config']['neg_foreign_table'], $fieldConfig['config']['MM'], $row['uid']);
00841
00842 $idList = $loadDB->convertPosNeg($loadDB->getValueArray(),$fieldConfig['config']['foreign_table'],$fieldConfig['config']['neg_foreign_table']);
00843
00844 return $idList;
00845 }
00846
00860 function procesItemArray($selItems,$config,$fieldTSConfig,$table,$row,$field) {
00861 $selItems = $this->addItems($selItems,$fieldTSConfig['addItems.']);
00862 if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$fieldTSConfig['itemsProcFunc.'],$config,$table,$row,$field);
00863 return $selItems;
00864 }
00865
00875 function addItems($items,$iArray) {
00876 if (is_array($iArray)) {
00877 foreach($iArray as $value => $label) {
00878 $items[]=array($label,$value);
00879 }
00880 }
00881 return $items;
00882 }
00883
00897 function procItems($items,$itemsProcFuncTSconfig,$config,$table,$row,$field) {
00898 $params=array();
00899 $params['items'] = &$items;
00900 $params['config'] = $config;
00901 $params['TSconfig'] = $itemsProcFuncTSconfig;
00902 $params['table'] = $table;
00903 $params['row'] = $row;
00904 $params['field'] = $field;
00905
00906 t3lib_div::callUserFunction($config['itemsProcFunc'],$params,$this);
00907 return $items;
00908 }
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00932 function lockRecord($table, $id, $pid=0) {
00933 if ($this->lockRecords) {
00934 t3lib_BEfunc::lockRecords($table,$id,$pid);
00935 }
00936 }
00937
00949 function regItem($table, $id, $field, $content) {
00950 }
00951
00959 function sL($in) {
00960 return $GLOBALS['LANG']->sL($in);
00961 }
00962 }
00963
00964
00965 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_transferdata.php']) {
00966 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_transferdata.php']);
00967 }
00968 ?>