| | |
| | | |
| | | // 二、单位组织结构情况 |
| | | ui->comboBox_hasUpLegal->setCurrentText(QString::fromLocal8Bit(curCominfo.hasUpLegal)); |
| | | ui->lineEdit_upCreditCode->setText(curCominfo.upCreditCode); |
| | | ui->lineEdit_upCreditCode->setText(QString::fromLocal8Bit(curCominfo.upCreditCode)); |
| | | ui->lineEdit_oldCreditCode->setText(curCominfo.oldCreditCode); |
| | | ui->lineEdit_upName->setText(QString::fromLocal8Bit(curCominfo.upName)); |
| | | |
| | |
| | | ui->lineEdit_itNum->setText(QString::number(curCominfo.itNum)); |
| | | ui->lineEdit_engineeringNum->setText(QString::number(curCominfo.engineeringNum)); |
| | | ui->lineEdit_otherNum->setText(QString::number(curCominfo.otherNum)); |
| | | |
| | | // 其他的4个信息 |
| | | ui->lineEdit_statisticalConOfficer->setText(QString::fromLocal8Bit(curCominfo.statisticalConOfficer)); |
| | | ui->lineEdit_personFilling->setText(QString::fromLocal8Bit(curCominfo.personFilling)); |
| | | ui->lineEdit_officerTel->setText(QString::fromLocal8Bit(curCominfo.officerTel)); |
| | | ui->lineEdit_fillingDateTime->setText(QString::fromLocal8Bit(curCominfo.fillingDateTime)); |
| | | } |
| | | |
| | | void ConverInfo2::readInfo() |
| | |
| | | int index = str.indexOf("内审统01表"); |
| | | qDebug()<<"index:"<<index; |
| | | if(index > 0){ |
| | | QAxObject excel("Excel.Application"); |
| | | QAxObject excel("ket.Application"); |
| | | if(!excel.setControl("ket" |
| | | ".Application")){ // windows内核 |
| | | excel.setControl("Excel.Application"); // wps内核 |
| | | } |
| | | excel.setProperty("Visible",false); |
| | | excel.setProperty("DisplayAlerts",false); |
| | | |
| | | qDebug()<<"open:"<<str; |
| | | qDebug()<<"excel:"<<excel.className(); |
| | | QAxObject * wbs = excel.querySubObject("WorkBooks"); |
| | | qDebug()<<"wbs:"<<wbs->className(); |
| | | QAxObject * wb = wbs->querySubObject("Open(QString&)",str); |
| | | //QAxObject* pWorkBook = excel.querySubObject("ActiveWorkBook"); |
| | | //QAxObject* pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表 |
| | | QAxObject * shs = wb->querySubObject("Sheets"); // WorkSheets 也可以 |
| | | // QAxObject *checkBoxs = shs->querySubObject("CheckBoxes"); |
| | | // qDebug() << "复选框:checkBoxs:" << checkBoxs->asVariant(); |
| | | //QAxObject * shs = wb->querySubObject("Sheets"); // WorkSheets 也可以 |
| | | QAxObject * shs = wb->querySubObject("WorkSheets"); // WorkSheets 也可以 |
| | | // // 指定单元格拿 |
| | | // QAxObject *cell = shs->querySubObject("Cells(int, int)",82,1); |
| | | // qDebug()<<"Cells:82-0:"<<shs->querySubObject("Cells(int, int)",82,0)->dynamicCall("Value()").toString(); |
| | | // qDebug()<<"Cells:82-1:"<<cell->dynamicCall("Value()").toString(); |
| | | |
| | | int cnt = shs->property("Count").toInt(); |
| | | qDebug()<<"cnt="<<cnt; |
| | | for(int i=0;i<cnt;++i){ |
| | |
| | | qDebug()<<"otherNum"<<otherNum; |
| | | } |
| | | |
| | | // 后面的4个信息 |
| | | // 统计负责人 |
| | | QVariant statisticalConOfficer = valRows[81].toList().at(1); |
| | | if(statisticalConOfficer.isValid()){ |
| | | strcpy(curComInfo.statisticalConOfficer,statisticalConOfficer.toString().toLocal8Bit().data()); |
| | | qDebug()<<"statisticalConOfficer"<<statisticalConOfficer; |
| | | }else{ |
| | | qDebug()<<"statisticalConOfficer fail:"<<name.toString(); |
| | | } |
| | | // 填表人 |
| | | QVariant personFilling = valRows[81].toList().at(4); |
| | | if(personFilling.isValid()){ |
| | | strcpy(curComInfo.personFilling,personFilling.toString().toLocal8Bit().data()); |
| | | qDebug()<<"personFilling"<<personFilling; |
| | | } |
| | | // 联系电话 |
| | | QVariant officerTel = valRows[82].toList().at(1); |
| | | if(officerTel.isValid()){ |
| | | strcpy(curComInfo.officerTel,officerTel.toString().toLocal8Bit().data()); |
| | | qDebug()<<"officerTel"<<officerTel; |
| | | } |
| | | // 填报日期 |
| | | QVariant fillingDateTime = valRows[82].toList().at(4); |
| | | if(fillingDateTime.isValid()){ |
| | | strcpy(curComInfo.fillingDateTime,fillingDateTime.toString().toLocal8Bit().data()); |
| | | qDebug()<<"fillingDateTime"<<fillingDateTime; |
| | | } |
| | | |
| | | // 最后存到map中 |
| | | m_nameAndComInfos[name.toString()]=curComInfo; |
| | | |
| | |
| | | connect(m_menu->actions().at(0),SIGNAL(triggered(bool)),this,SLOT(deleteInfo())); |
| | | connect(m_menu->actions().at(1),SIGNAL(triggered(bool)),this,SLOT(addInfo())); |
| | | } |
| | | |
| | | void ConverInfo2::on_pushButton_commit_clicked() |
| | | { |
| | | // 将编辑框的数据更新到map中和数据库中,后期可以更新到文件中 |
| | | // 单位基本情况 |
| | | QString creditCode = ui->lineEdit_creditCode->text(); |
| | | QString name = ui->lineEdit_name->text(); |
| | | QString comType = ui->comboBox_comType->currentText(); |
| | | QString business = ui->lineEdit_business->text(); |
| | | QString businessCode = ui->lineEdit_businessCode->text(); |
| | | QString addr = ui->lineEdit_addr->text(); |
| | | QString areaCode = ui->lineEdit_areaCode->text(); |
| | | QString townCode = ui->lineEdit_townCode->text(); |
| | | QString scale = ui->comboBox_scale->currentText(); |
| | | QString people = ui->lineEdit_people->text(); |
| | | QString representative = ui->lineEdit_representative->text(); |
| | | QString standardType = ui->comboBox_standardType->currentText(); |
| | | QString trunkCode = ui->lineEdit_trunkCode->text(); |
| | | QString fixedTel = ui->lineEdit_fixedTel->text(); |
| | | QString postCode = ui->lineEdit_postCode->text(); |
| | | QString email = ui->lineEdit_email->text(); |
| | | QString webSite = ui->lineEdit_webSite->text(); |
| | | |
| | | // 单位组织结构情况 |
| | | QString hasUpLegal = ui->comboBox_hasUpLegal->currentText(); |
| | | QString upCreditCode = ui->lineEdit_upCreditCode->text(); |
| | | QString oldCreditCode = ui->lineEdit_oldCreditCode->text(); |
| | | QString upName = ui->lineEdit_upName->text(); |
| | | |
| | | // 总审计师与内审机构基本情况 |
| | | QString hasChiefDesigner = ui->comboBox_hasChiefDesigner->currentText(); |
| | | QString ChiefDesignerLevel = ui->comboBox_ChiefDesignerLevel->currentText(); |
| | | QString employmentMode = ui->comboBox_employmentMode->currentText(); |
| | | QString hasSetIntervalAudit = ui->comboBox_hasSetIntervalAudit->currentText(); |
| | | QString internalName = ui->lineEdit_internalName->text(); |
| | | QString leadingOrganization = ui->comboBox_leadingOrganization->currentText(); |
| | | QString hasSetSeparateIA = ui->comboBox_hasSetSeparateIA->currentText(); |
| | | bool financeDepartment = ui->checkBox_financeDepartment->isChecked(); |
| | | bool legalDepartment = ui->checkBox_legalDepartment->isChecked(); |
| | | bool internalConDepart = ui->checkBox_internalConDepart->isChecked(); |
| | | bool disceplineInDepart = ui->checkBox_disceplineInDepart->isChecked(); |
| | | bool otherDepart = ui->checkBox_otherDepart->isChecked(); |
| | | QString intavalAuditLeval = ui->comboBox_intavalAuditLeval->currentText(); |
| | | |
| | | // 四、内审人员配备基本情况 |
| | | int organazationNum = ui->lineEdit_organazationNum->text().toInt(); |
| | | int realNum = ui->lineEdit_realNum->text().toInt(); |
| | | int professionalNum = ui->lineEdit_professionalNum->text().toInt(); |
| | | int CIANum = ui->lineEdit_CIANum->text().toInt(); |
| | | int masterNum = ui->lineEdit_masterNum->text().toInt(); |
| | | int undergraduatesNum = ui->lineEdit_undergraduatesNum->text().toInt(); |
| | | int juniorNum = ui->lineEdit_juniorNum->text().toInt(); |
| | | int seniorNum = ui->lineEdit_seniorNum->text().toInt(); |
| | | int intermediateNum = ui->lineEdit_intermediateNum->text().toInt(); |
| | | int primaryNum = ui->lineEdit_primaryNum->text().toInt(); |
| | | int noTitleNum = ui->lineEdit_noTitleNum->text().toInt(); |
| | | int upFiftyOldNum = ui->lineEdit_upFiftyOldNum->text().toInt(); |
| | | int upThirtyOldNum = ui->lineEdit_upThirtyOldNum->text().toInt(); |
| | | int downThirtyOldNum = ui->lineEdit_downThirtyOldNum->text().toInt(); |
| | | int auditNum = ui->lineEdit_auditNum->text().toInt(); |
| | | int accountingNum = ui->lineEdit_accountingNum->text().toInt(); |
| | | int economyNum = ui->lineEdit_economyNum->text().toInt(); |
| | | int lawNum = ui->lineEdit_lawNum->text().toInt(); |
| | | int managerNum = ui->lineEdit_managerNum->text().toInt(); |
| | | int itNum = ui->lineEdit_itNum->text().toInt(); |
| | | int engineeringNum = ui->lineEdit_engineeringNum->text().toInt(); |
| | | int otherNum = ui->lineEdit_otherNum->text().toInt(); |
| | | |
| | | // 后面的4个信息 |
| | | QString statisticalConOfficer = ui->lineEdit_statisticalConOfficer->text(); |
| | | QString personFilling = ui->lineEdit_personFilling->text(); |
| | | QString officerTel = ui->lineEdit_officerTel->text(); |
| | | QString fillingDateTime = ui->lineEdit_fillingDateTime->text(); |
| | | |
| | | qDebug()<<"统计负责人"<<statisticalConOfficer; |
| | | |
| | | // 更新到map中 |
| | | if(m_nameAndComInfos.count(name)==0){ |
| | | // 添加到map中 |
| | | m_nameAndComInfos[name]=ComInfo(); |
| | | // 添加到右边树部件中 |
| | | QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget); |
| | | top1->setText(0,name); |
| | | } |
| | | auto &curComInfo = m_nameAndComInfos[name]; |
| | | |
| | | |
| | | |
| | | strcpy(curComInfo.creditCode,creditCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.name,name.toLocal8Bit().data()); |
| | | strcpy(curComInfo.comType,comType.toLocal8Bit().data()); |
| | | strcpy(curComInfo.business,business.toLocal8Bit().data()); |
| | | strcpy(curComInfo.businessCode,businessCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.addr,addr.toLocal8Bit().data()); |
| | | strcpy(curComInfo.areaCode,areaCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.townCode,townCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.scale,scale.toLocal8Bit().data()); |
| | | curComInfo.people = people.toInt(); // index 10 |
| | | strcpy(curComInfo.representative,representative.toLocal8Bit().data()); |
| | | strcpy(curComInfo.standardType,standardType.toLocal8Bit().data()); |
| | | strcpy(curComInfo.trunkCode,trunkCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.fixedTel,fixedTel.toLocal8Bit().data()); |
| | | strcpy(curComInfo.postCode,postCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.email,email.toLocal8Bit().data()); |
| | | strcpy(curComInfo.webSite,webSite.toLocal8Bit().data()); // index 17 |
| | | |
| | | // 二 |
| | | strcpy(curComInfo.hasUpLegal,hasUpLegal.toLocal8Bit().data()); |
| | | strcpy(curComInfo.upCreditCode,upCreditCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.oldCreditCode,oldCreditCode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.upName,upName.toLocal8Bit().data()); // index 21 |
| | | |
| | | // 三 |
| | | strcpy(curComInfo.hasChiefDesigner,hasChiefDesigner.toLocal8Bit().data()); |
| | | strcpy(curComInfo.ChiefDesignerLevel,ChiefDesignerLevel.toLocal8Bit().data()); |
| | | strcpy(curComInfo.employmentMode,employmentMode.toLocal8Bit().data()); |
| | | strcpy(curComInfo.hasSetIntervalAudit,hasSetIntervalAudit.toLocal8Bit().data()); |
| | | strcpy(curComInfo.internalName,internalName.toLocal8Bit().data()); |
| | | strcpy(curComInfo.leadingOrganization,leadingOrganization.toLocal8Bit().data()); |
| | | strcpy(curComInfo.hasSetSeparateIA,hasSetSeparateIA.toLocal8Bit().data()); |
| | | curComInfo.financeDepartment = financeDepartment; // index 29 |
| | | curComInfo.legalDepartment = legalDepartment; |
| | | curComInfo.internalConDepart = internalConDepart; |
| | | curComInfo.disceplineInDepart = disceplineInDepart; |
| | | curComInfo.otherDepart = otherDepart; |
| | | strcpy(curComInfo.intavalAuditLeval,intavalAuditLeval.toLocal8Bit().data()); // index 34 |
| | | |
| | | // 四 |
| | | curComInfo.organazationNum = organazationNum; // index 35 |
| | | curComInfo.realNum = realNum; |
| | | curComInfo.professionalNum = professionalNum; |
| | | curComInfo.CIANum = CIANum; |
| | | curComInfo.masterNum = masterNum; |
| | | curComInfo.undergraduatesNum = undergraduatesNum; |
| | | curComInfo.juniorNum = juniorNum; |
| | | curComInfo.seniorNum = seniorNum; |
| | | curComInfo.intermediateNum = intermediateNum; |
| | | curComInfo.primaryNum = primaryNum; |
| | | curComInfo.noTitleNum = noTitleNum; |
| | | curComInfo.upFiftyOldNum = upFiftyOldNum; |
| | | curComInfo.upThirtyOldNum = upThirtyOldNum; |
| | | curComInfo.downThirtyOldNum = downThirtyOldNum; |
| | | curComInfo.auditNum = auditNum; |
| | | curComInfo.accountingNum = accountingNum; |
| | | curComInfo.economyNum = economyNum; |
| | | curComInfo.lawNum = lawNum; |
| | | curComInfo.managerNum = managerNum; |
| | | curComInfo.itNum = itNum; |
| | | curComInfo.engineeringNum = engineeringNum; |
| | | curComInfo.otherNum = otherNum; // index 56 |
| | | |
| | | // 后4个信息 |
| | | strcpy(curComInfo.statisticalConOfficer,statisticalConOfficer.toLocal8Bit().data()); |
| | | strcpy(curComInfo.personFilling,personFilling.toLocal8Bit().data()); |
| | | strcpy(curComInfo.officerTel,officerTel.toLocal8Bit().data()); |
| | | strcpy(curComInfo.fillingDateTime,fillingDateTime.toLocal8Bit().data()); // index 60 |
| | | |
| | | |
| | | // 更新到数据库 |
| | | |
| | | // 先判断是不是已经存在公司名了,若已存在,则更新,不存在则插入 |
| | | QString sql = QString("select id,name from all_company_info where name='%1'").arg(name); |
| | | qDebug()<<"sql:"<<sql; |
| | | QSqlQuery query; |
| | | int rowCnt = 0; |
| | | if(query.exec(sql)){ |
| | | qDebug()<<"size:"<<query.size(); |
| | | |
| | | while (query.next()) { |
| | | rowCnt++; |
| | | } |
| | | } |
| | | if(rowCnt == 0){ |
| | | // 不存在,则插入一条新数据 |
| | | qDebug()<<"不存在:"<<name; |
| | | sql = QString("insert into all_company_info (name,\ |
| | | code,\ |
| | | 机构类型,\ |
| | | 主要业务活动,\ |
| | | 行业代码,\ |
| | | 单位注册地及区域,\ |
| | | 区域代码,\ |
| | | 城乡代码,\ |
| | | 单位规模,\ |
| | | 从业期末人数,\ |
| | | 法定代表人,\ |
| | | 执行会记标准类别,\ |
| | | 长途区号,\ |
| | | 固定电话,\ |
| | | 邮政编码,\ |
| | | 电子邮箱,\ |
| | | 网址,\ |
| | | 是否有上一级法人,\ |
| | | 上一级统信代码,\ |
| | | 原组织代码,\ |
| | | 上级单位名称,\ |
| | | 是否设置总审计师,\ |
| | | 总审计师职位层级,\ |
| | | 总审任职方式,\ |
| | | 是否设置内审机构,\ |
| | | 内审机构名称,\ |
| | | 领导机构,\ |
| | | 是否独立设置内审机构,\ |
| | | 财务部门,\ |
| | | 法务部门,\ |
| | | 内部控制部门,\ |
| | | 纪检部门,\ |
| | | 其他部门,\ |
| | | 内审层级,\ |
| | | 编制数量,\ |
| | | 实有人数量,\ |
| | | 专职人员数量,\ |
| | | 拥有CIA人数,\ |
| | | 硕士学历以上人数,\ |
| | | 本科人数,\ |
| | | 专科及以下人数,\ |
| | | 高级职称人数,\ |
| | | 中级职称人数,\ |
| | | 初级职称人数,\ |
| | | 无职称人数,\ |
| | | 五十岁以上人数,\ |
| | | 三十至五十岁岁人数,\ |
| | | 三十岁以下人数,\ |
| | | 审计数量,\ |
| | | 会计数量,\ |
| | | 经济数量,\ |
| | | 法律数量,\ |
| | | 管理数量,\ |
| | | 信息技术数量,\ |
| | | 工程数量,\ |
| | | 其他数量,\ |
| | | 统计负责人,\ |
| | | 填表人,\ |
| | | 联系电话,\ |
| | | 填报日期) values ('%1','%2','%3','%4','%5','%6','%7','%8','%9',%10,\ |
| | | '%11','%12','%13','%14','%15','%16','%17','%18','%19','%20',\ |
| | | '%21','%22','%23','%24','%25','%26','%27','%28',%29,%30,\ |
| | | %31,%32,%33,'%34',%35,%36,%37,%38,%39,%40,\ |
| | | %41,%42,%43,%44,%45,%46,%47,%48,%49,%50,\ |
| | | %51,%52,%53,%54,%55,%56,'%57','%58','%59','%60'\ |
| | | )").arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people). |
| | | arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode). |
| | | arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment). |
| | | arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum). |
| | | arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum). |
| | | arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime); |
| | | |
| | | |
| | | qDebug()<<"sql insert:"<<sql; |
| | | if(query.exec(sql)){ |
| | | qDebug()<<"insert ok"; |
| | | }else{ |
| | | qDebug()<<"insert fail:"<<query.lastError().text(); |
| | | } |
| | | |
| | | }else{ |
| | | // 更新 |
| | | qDebug()<<"存在:"<<name; |
| | | sql = QString("update all_company_info set name='%1',code='%2',机构类型='%3',主要业务活动='%4',行业代码='%5',单位注册地及区域='%6',区域代码='%7',城乡代码='%8',单位规模='%9',从业期末人数=%10\ |
| | | ,法定代表人='%11',执行会记标准类别='%12',长途区号='%13',固定电话='%14',邮政编码='%15',电子邮箱='%16',网址='%17',是否有上一级法人='%18',上一级统信代码='%19',原组织代码='%20'\ |
| | | ,上级单位名称='%21',是否设置总审计师='%22',总审计师职位层级='%23',总审任职方式='%24',是否设置内审机构='%25',内审机构名称='%26',领导机构='%27',是否独立设置内审机构='%28',财务部门=%29,法务部门=%30\ |
| | | ,内部控制部门=%31,纪检部门=%32,其他部门=%33,内审层级='%34',编制数量=%35,实有人数量=%36,专职人员数量=%37,拥有CIA人数=%38,硕士学历以上人数=%39,本科人数=%40\ |
| | | ,专科及以下人数=%41,高级职称人数=%42,中级职称人数=%43,初级职称人数=%44,无职称人数=%45,五十岁以上人数=%46,三十至五十岁岁人数=%47,三十岁以下人数=%48,审计数量=%49,会计数量=%50\ |
| | | ,经济数量=%51,法律数量=%52,管理数量=%53,信息技术数量=%54,工程数量=%55,其他数量=%56,统计负责人='%57',填表人='%58',联系电话='%59',填报日期='%60'"). |
| | | arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people). |
| | | arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode). |
| | | arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment). |
| | | arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum). |
| | | arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum). |
| | | arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime); |
| | | |
| | | qDebug()<<"update sql:"<<sql; |
| | | if(query.exec(sql)){ |
| | | qDebug()<<"update ok"; |
| | | }else{ |
| | | qDebug()<<"update fail:"<<query.lastError().text(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | void ConverInfo2::on_pushButton_laodFile_clicked() |
| | | { |
| | | |
| | | } |