'sp-label', 'report_field'=>'sp-input', // 'report_barcode'=>'sp-qrcode', 'report_box'=>'sp-rectangle', 'report_picture'=>'sp-image', 'report_grid'=>'sp-table', 'report_line'=>array( 'level'=>'sp-level', 'vertical'=>'sp-vertical' ), 'report_barcode'=>array( 'mobile_barcode'=>'sp-barcode', 'mobile_qrcode'=>'sp-qrcode' ) ); //面单详情 /** * tmplData * @param mixed $template_id ID * @param mixed $type type * @return mixed 返回值 */ public function tmplData($template_id = null, $type = 'electron'){ // $template_id = $_GET['template_id']?$_GET['template_id']:0; $templateObj = app::get('logisticsmanager')->model('express_template'); // $type = $_GET['type'] ? $_GET['type'] : 'normal'; if($template_id){ $template = $templateObj->dump($template_id); $template['title'] = '编辑模板'; }else{ switch ($type) { case 'stock': $templateWidth = 240; $templateHeight = 160; $templateType = 'stock'; $title = '新增备货面单模板'; break; case 'delivery': $templateWidth = 240; $templateHeight = 160; $templateType = 'delivery'; $title = '新增发货面单模板'; break; case 'electron': $templateWidth = 100; $templateHeight = 150; $templateType = 'electron'; $title = '新增电子面单模板'; break; // case 'normal': // $templateWidth = 240; // $templateHeight = 160; // $templateType = 'normal'; // $title = '新增普通面单模板'; // break; } $template = array( 'template_width' => $templateWidth, 'template_height' => $templateHeight, 'template_type' => $templateType, 'title' => $title ); } // 打印项 if (in_array($type,array('delivery','stock'))) { $elements = $templateObj->getElementsItem($type); //获取用户自定义的打印项 $_arr_self_elments = app::get('logisticsmanager')->getConf('ome.delivery.print.'.$type.'.selfElments'); $arr_self_elments = $_arr_self_elments['element_'.$template_id]; //获取每个快递单对应的自定义打印项 if (!empty($arr_self_elments)) { $_value = array_values($arr_self_elments['element']); $_key = array_keys($arr_self_elments['element']); $new_key = str_replace('+', '_', $_key[0]); //把原来键中的+号替换掉 $new_self_elments[$new_key] = $_value[0]; $elements = array_merge($elements, $new_self_elments); //合并系统打印项和用户自定义打印项 } }else{ $elements = $templateObj->getElements(); } // 条码/二维码/表头/logo $barcode = $table_header = $qrcode = $logo = array(); switch ($type) { case 'stock': $barcode = array( array('label' => '发货单号', 'value' => 'delivery_bn'), array('label' => '物流单号', 'value' => 'logi_no'), array('label' => '订单号', 'value' => 'order_bn'), array('label' => '批次号', 'value' => 'batch_number'), array('label' => '自定义', 'value' => 'custom'), ); $table = array( 'name' => 'stock_items', 'header' => array( array('label' => '货号', 'value' => 'bn'), array('label' => '批次号', 'value' => 'purchase_code'), array('label' => '货位', 'value' => 'store_position'), array('label' => '商品名称', 'value' => 'name'), array('label' => '商品规格', 'value' => 'spec_info'), array('label' => '商品数量', 'value' => 'num'), array('label' => '商品类型', 'value' => 'goods_type'), array('label' => '合计金额', 'value' => 'box_price'), array('label' => '盒子号', 'value' => 'box'), array('label' => '货品重量', 'value' => 'product_weight'), array('label' => '条形码号', 'value' => 'barcode'), array('label' => '序号', 'value' => 'No'), ), 'footer' => array( array('label' => '数量总计', 'value' => 'sku_num'), array('label' => '备货金额', 'value' => 'total_amount'), array('label' => '优惠金额', 'value' => 'total_pmt_price'), ), ); $qrcode = array( array('label' => '自定义', 'value' => 'empty'), ); break; case 'delivery': $barcode = array( array('label' => '发货单号', 'value' => 'delivery_bn'), array('label' => '物流单号', 'value' => 'logi_no'), array('label' => '订单号', 'value' => 'order_bn'), array('label' => '批次号', 'value' => 'batch_number'), array('label' => '自定义', 'value' => 'custom'), ); $table = array( 'name' => 'delivery_items', 'header' => array( array('label' => '商品名称', 'value' => 'name'), array('label' => '货号', 'value' => 'bn'), array('label' => '批次号', 'value' => 'purchase_code'), array('label' => '数量', 'value' => 'number'), array('label' => '单价', 'value' => 'price'), array('label' => '实收金额', 'value' => 'sale_price'), array('label' => '规格', 'value' => 'spec_info'), array('label' => '优惠价', 'value' => 'pmt_price'), array('label' => '商品货号', 'value' => 'goods_bn'), array('label' => '货品重量', 'value' => 'product_weight'), array('label' => '单位', 'value' => 'unit'), array('label' => '品牌', 'value' => 'brand_name'), array('label' => '商品类型', 'value' => 'type_name'), array('label' => '货位', 'value' => 'store_position'), array('label' => '商品条形码', 'value' => 'barcode'), array('label' => '商品图片', 'value' => 'picurl'), array('label' => '序号', 'value' => 'No'), ), 'footer' => array( array('label' => '商品数量', 'value' => 'item_num'), array('label' => '货品数量', 'value' => 'sku_num'), array('label' => '累计品种', 'value' => 'sku_count'), array('label' => '总重量', 'value' => 'total_weight'), array('label' => '订单总额', 'value' => 'total_amount'), ), ); $qrcode = array( array('label' => '自定义', 'value' => 'empty'), ); break; case 'electron': $barcode = array( array('label' => '发货单号', 'value' => 'delivery_bn'), array('label' => '物流单号', 'value' => 'logi_no'), array('label' => '物流单条形码', 'value' => 'mailno_barcode'), array('label' => '多包裹物流单号', 'value' => 'batch_logi_no'), array('label' => '集包地编码', 'value' => 'package_wd'), array('label' => '自定义', 'value' => 'custom'), ); $qrcode = array( array('label' => '运单二维码(韵达)', 'value' => 'mailno_qrcode'), array('label' => '手机呼叫二维码', 'value' => 'phonecall_qrcode'), array('label' => '顺丰-中转分拣二维码', 'value' => 'sf_twoDimensionCode_qrcode'), array('label' => '物流单号(得物)', 'value' => 'dewu_qrcode'), array('label' => '自定义', 'value' => 'empty'), ); $logo = array( array('label' => '顺丰', 'value' => 'sf.jpg'), array('label' => '圆通', 'value' => 'yt.jpg'), array('label' => '宅急送', 'value' => 'zjs.jpg'), array('label' => '申通', 'value' => 'stkd.jpg'), array('label' => '天天', 'value' => 'ttkd.jpg'), array('label' => '全峰', 'value' => 'quanfeng.jpg'), array('label' => '百世汇通', 'value' => 'bsht.jpg'), array('label' => '中通', 'value' => 'zto.jpg'), array('label' => '中国邮政', 'value' => 'chinapost.jpg'), array('label' => '跨越速运', 'value' => 'kyexpress.jpg'), array('label' => '韵达', 'value' => 'yunda.jpg'), ); break; } $page = array( 'width' => $template['template_width'], 'height' => $template['template_height'], 'type' => $template['page_type']?$template['page_type']:0,//默认为0 'file_id' => $template['file_id']?$template['file_id']:0, 'background' => '' ); //如果存在背景图 if ($template['file_id']) { $bgUrl = $this->getImgUrl($template['file_id']); $page['background'] = $bgUrl; } //如果是lodop则采用的新的插件面板格式 if($template['control_type']=='lodop'){ $plugins=unserialize($template['template_data']); }else{ // 格式转换template_data $plugins = $this->transformTemplateData($template['template_data'],$template['template_type']); } $data = array( 'title' => $template['title'], 'page' => $page, 'template_id' => $template_id, 'template_name' => $template['template_name'], 'template_type' => $template['template_type'], 'is_log' => $template['is_logo']?$template['is_logo']:false, 'is_default' => $template['is_default']?$template['is_default']:false, 'source' => $template['source']?$template['source']:'local', 'status' => $template['status']?true:false, 'cp_code' => $template['cp_code']?$template['cp_code']:'', 'template_select' => $template['template_select']?$template['template_select']:'', 'base_dir' => kernel::base_url(), 'dpi' => $this->dpi, 'plugins' => $plugins, 'elements' => $elements, 'options' => array( 'barcode' => $barcode, 'table' => $table, 'qrcode' => $qrcode, 'logo' => $logo, ), ); return $data; } //格式转化template_data /** * transformTemplateData * @param mixed $templateData 数据 * @param mixed $templateType templateType * @return mixed 返回值 */ public function transformTemplateData($templateData,$templateType = 'normal'){ $reportArr = explode(";\n",$templateData);//分割成数组 $reportArr = array_splice($reportArr,1);//去除页面信息如 paper:210,297,NONE,100,172; array_pop($reportArr);//去除版权信息如 POWERED BY SHOPEXERP $plugins = array();//最终返回的控件数组值 foreach ($reportArr as $report){ $arr = explode(':',$report);//分割每个控件 取得控件名 //标签 if($arr[0]=='report_label'){ $params = explode(',',$arr[1]); $plugin = array(); $plugin['plugin'] = $this->plugins_map['report_label']; $plugin['name'] = '标签'; $plugin['edit'] = $params[4]; $plugin['x'] = $this->transLen($params[0]); $plugin['y'] = $this->transLen($params[1]); $plugin['z'] = 9999; $plugin['width'] = $this->transLen($params[2]-$params[0]); $plugin['fontFamily'] = $params[7]; $plugin['fontSize'] = ceil($params[8]/10); $plugin['Arrangement'] = array ('ll' => 1, 'lm' => '', 'lr' => '', 'vt' => 1, 'vm' => '', 'vb' => '', ); if($params[9]){ $plugin['bold'] = 600; } $plugins[] = $plugin; } //打印项 if($arr[0]=='report_field'){ $params = explode(',',$arr[1]); $plugin = array(); $plugin['plugin'] = $this->plugins_map['report_field']; $plugin['name'] = '单据打印项'; $plugin['edit'] = $params[4]; $plugin['x'] = $this->transLen($params[0]); $plugin['y'] = $this->transLen($params[1]); $plugin['width'] = $this->transLen($params[2]-$params[0]); $plugin['z'] = 9999; $plugin['color'] = '#000'; $plugin['fontFamily'] = $params[7]; $plugin['fontSize'] = ceil($params[8]/10); $plugin['Arrangement'] = array ('ll' => 1, 'lm' => '', 'lr' => '', 'vt' => 1, 'vm' => '', 'vb' => '', ); if($params[9]){ $plugin['bold'] = 600; } $plugin['type'] = array( 'label'=>$params[4], 'value'=>$params[5] ); $plugins[] = $plugin; } //图片 if($arr[0]=='report_picture'){ $params = explode(',',$arr[1]); $plugin = array(); $plugin['plugin'] = $this->plugins_map['report_picture']; $plugin['name'] = '图片'; $plugin['x'] = $this->transLen($params[0]); $plugin['y'] = $this->transLen($params[1]); $plugin['z'] = 9999; $plugin['src'] = $this->transImgUrl($params[11]); $plugin['width'] = $this->transLen($params[2]-$params[0]); $plugin['height'] = $this->transLen($params[3]-$params[1]); $plugin['logoType'] = substr($params[4],0,strrpos($params[4],'.')); $plugins[] = $plugin; } //矩形 if($arr[0]=='report_box'){ $params = explode(',',$arr[1]); $plugin = array(); $plugin['plugin'] = $this->plugins_map['report_box']; $plugin['name'] = '矩形'; $plugin['x'] = $this->transLen($params[0]); $plugin['y'] = $this->transLen($params[1]); $plugin['z'] = 9999; $plugin['color'] = '#000'; $plugin['width'] = $this->transLen($params[2]-$params[0]); $plugin['height'] = $this->transLen($params[3]-$params[1]); $plugin['thickness'] = 1; $plugin['lineStyle'] = 'solid'; $plugins[] = $plugin; } //条形码、二维码 if($arr[0]=='report_barcode'){ $params = explode(',',$arr[1]); $plugin = array(); if(!is_numeric($params[4])){ $plugin['plugin'] = $this->plugins_map['report_barcode']['mobile_qrcode']; $plugin['name'] = '二维码'; $plugin['code'] = $this->transImgUrl($params[4]); }else{ $plugin['plugin'] = $this->plugins_map['report_barcode']['mobile_barcode']; $plugin['name'] = '条形码'; $plugin['code'] = $params[4]; $plugin['type'] = array( 'label'=>'条形码', 'value'=>$params[5] ); } $plugin['x'] = $this->transLen($params[0]); $plugin['y'] = $this->transLen($params[1]); $plugin['width'] = $this->transLen($params[2]-$params[0]); $plugin['height'] = $this->transLen($params[3]-$params[1]); $plugin['z'] = 9999; $plugins[] = $plugin; } //水平、垂直线 if($arr[0]=='report_line'){ $params = explode(',',$arr[1]); $plugin = array(); //如果是水平线 if(!round($params[3]-$params[1])){ $plugin['plugin'] = $this->plugins_map['report_line']['level']; $plugin['name'] = '水平线'; $plugin['width'] = $this->transLen($params[2]-$params[0]); } //如果是竖直线 if(!round($params[2]-$params[0])){ $plugin['plugin'] = $this->plugins_map['report_line']['vertical']; $plugin['name'] = '垂直线'; $plugin['height'] = $this->transLen($params[3]-$params[1]); } //考虑到从左到右和从下到上 if($params[2]-$params[0] || $params[3]-$params[1]){ $plugin['x'] = $this->transLen($params[0]); $plugin['y'] = $this->transLen($params[1]); }else{ $plugin['x'] = $this->transLen($params[2]); $plugin['y'] = $this->transLen($params[3]); } $plugin['thickness'] = 1; $plugin['color'] = '#000'; $plugin['lineStyle'] = $this->lineStyle($params[8]); $plugins[] = $plugin; } //表格 if($arr[0]=='report_grid'){ $params = explode(',',$arr[1]); $plugin = array(); $plugin['plugin'] = $this->plugins_map['report_grid']; $plugin['name'] = '表格'; $plugin['x'] = $this->transLen($params[0]); $plugin['y'] = $this->transLen($params[1]); $plugin['z'] = 9999; $plugin['width'] = $this->transLen($params[2]-$params[0]); $plugin['height'] = $this->transLen($params[3]-$params[1]); $row = array(); $row['border_width'] = $this->transLen($params[12]); $row['lineStyle'] = $this->lineStyle($params[13]); $plugin['row'] = $row; $col = array(); $col['border_width'] = $this->transLen($params[16]); $col['lineStyle'] = $this->lineStyle($params[17]); $plugin['column'] = $col; $border = array(); $border['border_width'] = $this->transLen($params[8]); $border['lineStyle'] = $this->lineStyle($params[9]); $plugin['border'] = $border; $tableType = array('label'=>'','value'=>$params[5]); if($templateType=='delivery'){ $tableType['label'] = '发货单table'; }else if($templateType=='stock'){ $tableType['label'] = '备货单table'; } $plugin['type'] = $tableType; $headers = explode('|',$params[20]); $tableHeader = array(); foreach ($headers as $key=>$header){ $info = explode('#',$header); $tableHeader[$key]['name'] = $info[10]; $tableHeader[$key]['fontSize'] = ceil($info[2]/10); $tableHeader[$key]['width'] = sprintf("%.2f",$info[0]*100/($params[2]-$params[0])); $tableHeader[$key]['type']['label'] = $info[10]."[".$info[9]."]"; $tableHeader[$key]['type']['value'] = $info[9]; } $plugin['tableHeader'] = $tableHeader; $plugin['col'] = 6; $plugin['colHeight'] = 20; $plugins[] = $plugin; } } return $plugins; } //保存面单 /** * 保存Tmpl * @return mixed 返回操作结果 */ public function saveTmpl(){ $request_body = file_get_contents('php://input'); $params = json_decode($request_body,true); $this->save($params); } /** * 保存 * @param mixed $params 参数 * @return mixed 返回操作结果 */ public function save($params){ $data = array( 'template_type' => $params['template_type'], 'template_name' => $params['template_name'], 'status' => $params['status'] ? $params['status'] : 'true', 'template_width' => $params['template_width'], 'template_height' => $params['template_height'], 'file_id' => $params['file_id'] ? $params['file_id'] : 0, 'is_logo' => $params['is_logo'] ? $params['is_logo'] : 'true', 'template_select' => $params['template_select'] ? serialize($params['template_select']) : null, 'template_data' => $params['template_data'], 'control_type' => 'lodop',//更新类型为lodop // 'is_default' => isset($params['is_default']) ? $params['is_default'] : 'false', 'page_type' => isset($params['page_type']) ? $params['page_type'] : '1', 'aloneBtn' => isset($params['aloneBtn']) ? $params['aloneBtn'] : 'false', 'btnName' => isset($params['btnName'])?$params['btnName']:'', 'source' => $params['source'] ? $params['source'] : 'local', ); if ($data['template_name'] == ''){ switch ($data['template_type']) { case 'delivery': $msg = '请输入发货单名称'; break; case 'stock': $msg = '请输入备货单名称'; break; default : $msg = '请输入快递单名称'; break; } echo json_encode(array('status'=>0, 'msg'=>$msg)); return; } if (!in_array($data['template_type'],array('normal', 'electron', 'delivery', 'stock'))) { echo json_encode(array('status'=>0, 'msg'=>'面单类型不符合规则')); return; } if((!$data['template_width'] || !$data['template_height']) && $data['file_id']>0){ $bgUrl = $this->getImgUrl($data['file_id']); list($width, $height) = getimagesize($bgUrl); if($width && $height){ $data['template_width'] = intval($width*25.4/96); $data['template_height'] = intval($height*25.4/96); } } $templateObj = app::get('logisticsmanager')->model('express_template'); if ($params['template_id']){ $filter = array('template_id' => $params['template_id']); $re = $templateObj->update($data,$filter ); $data['template_id'] = $params['template_id']; }else { $re = $templateObj->insert($data); } if($re){ echo json_encode(array('status'=>1,'msg'=>'success','data'=>$re)); return; } echo json_encode(array('status'=>0,'msg'=>'error','data'=>null)); } //处理上传的图片 function uploadBg(){ $ss = kernel::single('base_storager'); $extname = strtolower($this->extName($_FILES['file']['name'])); $res = array( 'msg'=>'success', 'status'=>1 ); if($extname=='.jpg' || $extname=='.jpeg' || $extname=='.png'){ $id = $ss->save_upload($_FILES['file'],"file","",$msg);//返回file_id; }else{ $res['msg'] = '请上传jpg格式的图片'; $res['status'] = 0; echo json_encode($res); return; } $data = $this->doneUploadBg(basename($id)); $res['data'] = $data; echo json_encode($res); } //图片扩展名 function extName($file){ return substr($file,strrpos($file,'.')); } //长度换算 /** * transLen * @param mixed $len len * @return mixed 返回值 */ public function transLen($len){ $len = abs(round(((float)$len*$this->dpi),3)); return $len > 0 ? $len :10; } //图片链接转换 /** * transImgUrl * @param mixed $url url * @return mixed 返回值 */ public function transImgUrl($url){ if(!$url) return ''; $re = substr($url,strrpos($url,'//')); return "http:".$re; } //线条样式 /** * lineStyle * @param mixed $style style * @return mixed 返回值 */ public function lineStyle($style){ if($style==0){ return 'solid';//实线 }else if($style==1){ return 'dashed';//虚线 }else{ return 'dotted';//点线 } } //上传图片url function getImgUrl($file){ $ss = kernel::single('base_storager'); $url = $ss->getUrl($file,"file"); return $url; } //更新背景图显示 function doneUploadBg($file){ if($file){ $bgUrl = $this->getImgUrl($file); list($width, $height) = getimagesize($bgUrl); $pager_width = intval($width*25.4/96); $pager_height = intval($height*25.4/96); return array( 'file_id'=>$file, 'template_width'=>$pager_width, 'template_height'=>$pager_height, 'url'=>$bgUrl ); }else{ return ""; } } /** * order_by_y * @param mixed $a a * @param mixed $b b * @return mixed 返回值 */ public function order_by_y($a, $b) { if($a['y'] == $b['y']) { return 0; } return $a['y'] < $b['y'] ? -1 : 1; } /** * 获取ToCNTpl * @return mixed 返回结果 */ public function getToCNTpl() { $tplId = $_GET['tpl_id']; $tpl = app::get('logisticsmanager')->model('express_template')->db_dump(array('template_id'=>$tplId)); $tplData = unserialize($tpl['template_data']); header('content-Type:text/plain'); $xml = ''; $headerY = 0; $headerHeight = 0; uasort($tplData, [$this, 'order_by_y']); foreach ($tplData as $key => $value) { $pixelToMM = 1 / 96 * 25.4; $value['x'] = $value['x'] * $pixelToMM; $value['y'] = $value['y'] * $pixelToMM; $value['height'] = $value['height'] * $pixelToMM; $value['width'] = $value['width'] * $pixelToMM; $xmlName = 'xml'; if($xmlTableBottom && $value['y'] > $xmlTableBottom) { $xmlName = 'xmlTable'; $value['y'] -= $xmlTableBottom; } if($xmlName == 'xml' && $value['plugin'] != 'sp-table') { $headerY = $value['y']; $headerHeight = $value['height']; } switch ($value['plugin']) { case 'sp-input'://打印项 $align = $value['Arrangement']['ll'] ? 'left' : ($value['Arrangement']['lm'] ? 'center' : ($value['Arrangement']['lr'] ? 'right' : 'left')); $valign = $value['Arrangement']['vt'] ? 'top' : ($value['Arrangement']['vm'] ? 'middle' : ($value['Arrangement']['vb'] ? 'bottom' : 'top')); ${$xmlName} .= ' ]]> '; break; case 'sp-label'://标签 $align = $value['Arrangement']['ll'] ? 'left' : ($value['Arrangement']['lm'] ? 'center' : ($value['Arrangement']['lr'] ? 'right' : 'left')); $valign = $value['Arrangement']['vt'] ? 'top' : ($value['Arrangement']['vm'] ? 'middle' : ($value['Arrangement']['vb'] ? 'bottom' : 'top')); ${$xmlName} .= ' '; break; case 'sp-level'://水平线 ${$xmlName} .= ''; break; case 'sp-vertical'://垂直线 ${$xmlName} .= ''; break; case 'sp-rectangle'://矩形 ${$xmlName} .= ' '; break; case 'sp-image'://图片 $src = strpos($value['src'], 'http') === false ? kernel::base_url(1) . $value['src'] : $value['src']; ${$xmlName} .= ' '; break; case 'sp-barcode'://条形码 $barcode = $value['type']['value'] && $value['type']['value'] != "custom" ? '<%=_data.'.$value['type']['value'].'%>' : $value['code']; ${$xmlName} .= ' '; break; case 'sp-qrcode'://二维码 $barcode = $value['type']['value'] ? '<%=_data.'.$value['type']['value'].'%>' : ($value['code'] ? : ''); ${$xmlName} .= ' '; break; case 'sp-table'://表格 '.($value['column']['border_width']?:1).' .$value['border']['border_width'].' $xmlTableY = $value['y']; $xmlTable = ''; $xmlTableBottom = $xmlTableY + $value['height']; $xmlTable .= ''; $xmlTable .= ''; foreach ($value['tableHeader'] as $k => $v) { $name = ($v['name'] && strpos($v['name'], 'row') === false ? $v['name'] : $v['type']['label']); $xmlTable .= ''; } $xmlTable .= ''; $xmlTable .= '<% for(i=0;i<_data.'.$value['type']['value'].'.length;i++) {%> '; foreach ($value['tableHeader'] as $k => $v) { $xmlTable .= ''; } $xmlTable .= ''; $xmlTable .= '<%if(_data.'.$value['type']['value'].'[i].items) {%>'; $xmlTable .= '<% for(j=0;j<_data.'.$value['type']['value'].'[i].items.length;j++) {%> '; foreach ($value['tableHeader'] as $k => $v) { $xmlTable .= ''; } $xmlTable .= ''; $xmlTable .= '<%}%>'; $xmlTable .= '<%}%>'; $xmlTable .= '<%}%>'; if($value['footer']) { $xmlTable .= ''; } $xmlTable .= '
]]>
]]>
$v) { $xmlTable .= $v['label'] . ':<%=_data.countDeliveryMsg.'.$v['value'].'%> '; } $xmlTable .= ']]>
'; break; default: # code... break; } } if($xmlTable) { $xml = '
'.$xml.'
' . str_replace("{xmlTableY}", ($xmlTableY - ($headerY + $headerHeight)),$xmlTable) . '
'; } else { $xml = '
' . $xml; } $xml .= ''; $xml .= ' '; $xml .= '
'; echo $xml; } }