global without sharing class ConsumApplyWebService { // TODO please use public okStatus public final static Integer okStatus = 99; // 备品借出时间check WebService static String approvalCheck(String ConsumApplyId) { try { // check结果 String returnStr = ''; //备品借出申请 Consum_Apply__c[] ConsumApply = [select Id //,repair__r.Repair_Final_Inspection_Date__c ,Bollow_Date__c //,repair__r.Return_Without_Repair_Date__c ,CreatedDate ,Consum_Apply_Equipment_Set_Detail_Cnt__c //,Prepare_Day__c from Consum_Apply__c where Id = :ConsumApplyId]; if (ConsumApply.size() == 0) { returnStr = '没有备品借出申请,请确认。'; return returnStr; } Consum_Apply__c ra = ConsumApply[0]; if (ra.Consum_Apply_Equipment_Set_Detail_Cnt__c <= 0) { returnStr = '没有耗材一览,请确认。'; return returnStr; } String message = ''; List caesdList = [SELECT Id , Asset__c , Consum_Can_Request_approval_Date__c , Fixture_Model_No_F__c FROM Consum_Apply_Equipment_Set_Detail__c WHERE Consum_Apply__c = :ConsumApplyId AND Cancel_Select__c = false ORDER BY Id]; for (Consum_Apply_Equipment_Set_Detail__c caesd : caesdList) { caesd.InputCheck__c = true; if (String.isBlank(caesd.Asset__c)) { return '有没有暂定分配的明细,不能提交申请'; } message += caesd.Fixture_Model_No_F__c + '\n'; } message = message.removeEnd('\n'); update caesdList; ra.Consum_Apply_Detail_ForEmail__c = message; if (Trigger.isExecuting == false) { update ra; } else { return '1' + message; } } catch (Exception e) { return e.getMessage(); } return '1'; } WebService static String getwkDate(String date1, String number1) { if (String.isBlank(date1)) { return '没有时间,无法检测工作日'; } else { date1 = date1.replaceAll('/', '-'); } Date d = Date.valueOf(date1); Map calendarMap = Consum_ApplyUtil.getOlympusCalendarMAp(d, d); OlympusCalendar__c can = calendarMap.get(d); Integer num = Integer.valueOf(number1); Integer num1 = 1; String key = 'After'; if (num < 0) { key = 'Before'; num1 = -1; } String api = key + '_' + (num * num1) + '_WorkDay__c'; if (can.get(api) != null) { return ((Date)can.get(api)).format(); } else { return Consum_ApplyUtil.getWD_addday(d, num).format(); } } // 分配验证 Webservice static String AssignBtn(String Rid){ List raList = [select Id //,repair__r.Repair_Final_Inspection_Date__c //,repair__r.Return_Without_Repair_Date__c from Consum_Apply__c where id = :Rid]; if(raList.size()>0){ //Consum_Apply__c Ra = raList[0]; //if(Ra.repair__r.Repair_Final_Inspection_Date__c!=null){ // return '修理最终检测日不为空,不能分配'; //}else if(Ra.repair__r.Return_Without_Repair_Date__c !=null){ // return '未修理归还日不为空,不能分配'; //}else{ return 'Fin'; //} }else{ return '该借出申请不存在'; } } Webservice static String postponeCheck(String endDate, Integer d) { Date before5day = getWD_addday(date.parse(endDate), d); if (Date.today() > before5day) { return System.Label.EquipmentRentalPostponeOverDeadline; } return 'OK'; } // FIXME 仇yj please use public public static Date getWD_now(Date d) { List workday = [ select Id, Date__c, IsWorkDay__c from OlympusCalendar__c where Date__c >= :d and IsWorkDay__c = 1 order by Date__c limit 1]; Date selectDate = workday[0].Date__c; return selectDate; } // FIXME 仇yj please use public public static Date getWD_addday(Date d, Integer i) { if (d == Date.valueOf('4000-12-31')) { return d; } if (i >= 0) { List workday = [ select Id, Date__c, IsWorkDay__c from OlympusCalendar__c where Date__c >= :d and IsWorkDay__c = 1 order by Date__c limit :(i+1)]; Date selectDate = workday[i].Date__c; return selectDate; } else { i = Math.abs(i); List workday = [ select Id, Date__c, IsWorkDay__c from OlympusCalendar__c where Date__c <= :d and IsWorkDay__c = 1 order by Date__c desc limit :(i+1)]; Date selectDate = workday[i].Date__c; return selectDate; } } // pd:0代表当天,1代表第二天 public Map> getDateMap(Date sd, Date ed, Integer pd) { Map> returnMap = new Map>(); List workdayList = [ select Id, Date__c, IsWorkDay__c from OlympusCalendar__c where Date__c >= :sd and Date__c <= :ed.addDays(15 + pd) // +15 的目的是、为了取得ed の 下一个工作日 order by Date__c]; for (Integer i = 0; i < workdayList.size(); i++) { OlympusCalendar__c wd = workdayList[i]; if (wd.Date__c > ed) break; Integer nextWordDays = 0; Map valueMap = new Map(); valueMap.put('WorkDay', String.valueOf(wd.IsWorkDay__c)); Integer maxJ = 15 + i + pd; if (maxJ > workdayList.size()) maxJ = workdayList.size(); for (Integer j = i; j < maxJ; j++) { OlympusCalendar__c oc = workdayList[j]; if (oc.IsWorkDay__c == 1) { nextWordDays++; if (nextWordDays == pd + 1) { valueMap.put('Next', String.valueOf(oc.Date__c)); break; } } } returnMap.put(wd.Date__c, valueMap); } return returnMap; } WebService static String ConsumApplyCancel(String raid, Boolean autoCancel) { List raList = [select id , Shipment_request_Cnt__c , Status__c , RA_Status__c //, Shippment_loaner_cnt__c , Loaner_cancel_request__c , Arrival_wh_cnt__c , Cancel_Reason__c from Consum_Apply__c where id = :raid]; List raesList = [select id //, StockDown_time__c from Consum_Apply_Equipment_Set__c where Consum_Apply__c = :raid and Cancel_Select__c = false]; List updList = new List(); // List delList = new List(); Set esIdSet = new Set(); if (raList.size() <= 0) { return '备品申请书不存在。'; } Consum_Apply__c ra = raList[0]; if (ra.Status__c == '取消') { return '备品申请书已经取消。'; } if (ra.Status__c == '删除') { return '备品申请书已经删除。'; } if (ra.RA_Status__c == FixtureUtil.raStatusMap.get(FixtureUtil.RaStatus.Yi_Chu_Ku.ordinal()) || ra.Arrival_wh_cnt__c > 0) { return '备品已经出库,不能取消。'; } User loginUser = [Select Id, Name, ProfileId From User where Id = :Userinfo.getUserId()]; if(loginUser.ProfileId != System.Label.ProfileId_SystemAdmin && loginUser.ProfileId != System.Label.ProfileId_EquipmentCenter && !System.Label.ProfileId_EquCenCheckAndDepot.contains(loginUser.ProfileId) && !System.Label.ProfileId_EquCenAdmin.contains(loginUser.ProfileId) && loginUser.ProfileId != System.Label.ProfileId_IThelp && ra.Shipment_request_Cnt__c > 0 ){ return '不能取消申请,请联系备品中心窗口取消。'; } if (autoCancel == false && String.isBlank(ra.Cancel_Reason__c)) { return '必须输入取消理由。'; } if (autoCancel) { if (ra.Status__c == '申请中') { List requests = new List (); Map piMap = New Map([Select Id from ProcessInstance where TargetObjectId = :ra.Id]); for(ProcessInstanceWorkItem wi : [Select Id from ProcessInstanceWorkItem where ProcessInstanceId IN :piMap.keySet()]){ Approval.ProcessWorkitemRequest req2 = new Approval.ProcessWorkitemRequest(); req2.setAction('Removed'); req2.setWorkitemId(wi.Id); requests.add(req2); } if (requests.size() > 0) { Approval.ProcessResult[] processResults = null; processResults = Approval.process(requests, true); } } ra.Cancel_Reason__c = '主动取消'; ra.Loaner_cancel_request__c = '本申请审批超时自动关闭申请单'; } ra.Status__c = '取消'; Savepoint sp = Database.setSavepoint(); try { Set selectAssetIdSet = new Set(); for (Consum_Apply_Equipment_Set_Detail__c caesd : [SELECT Id, Asset__c FROM Consum_Apply_Equipment_Set_Detail__c WHERE Consum_Apply__c = :raid] ) { if (String.isNotBlank(caesd.Asset__c)) { selectAssetIdSet.add(caesd.Asset__c); } } if (selectAssetIdSet.size() > 0) { List assList = [SELECT Id FROM Asset WHERE Id = :selectAssetIdSet FOR UPDATE]; } update ra; } catch (Exception ex) { Database.rollback(sp); return ex.getMessage(); } return '1'; } // 一覧単位 WebService static String setRaesShipment_request(String raesid) { return setShipment_requests(null, raesid); } // 申請書単位 WebService static String setShipment_request(String raid) { System.debug(raid); return setShipment_requests(raid, null); } //出库指示按钮js一次最多更新200条,所以改在WebService做出库指示 WebService static String setShipment_requests(String raid, String raesid) { Savepoint sp = Database.setSavepoint(); try { System.debug(raid); //一览情况下检索一览对应的申请书Id,soql子查询不能和主查询是同一个表,单独检索一次 if (String.isBlank(raid)) { List raesList = [select Id, Consum_Apply__c from Consum_Apply_Equipment_Set__c where id = :raesid]; if (raesList.size() > 0) { raid = raesList[0].Consum_Apply__c; } else { //应该不会到这里 return '没有可以出库指示的一览'; } } //String soql = 'SELECT Id, Wei_Assigned_Cnt__c, Yi_Assigned_Cnt__c' // + ' FROM Consum_Apply_Equipment_Set__c ' // + ' WHERE Shippment_loaner_time2__c <> null ' // + ' AND Consum_Apply__c = :raid ' // + ' ORDER BY Id' ; //List shippedRaesList = Database.query(soql); //String raesStrShipped = ''; //for (Consum_Apply_Equipment_Set__c raes : shippedRaesList) { // raesStrShipped += raes.Id; // if (raes.Wei_Assigned_Cnt__c > 0 || raes.Yi_Assigned_Cnt__c == 0) { // return '不能做出库指示,需要分单后再操作'; // } //} //Srring soql = "SELECT Id FROM Consum_Apply_Equipment_Set_Detail__c WHERE Consum_Apply__c = '{!Consum_Apply__c.Id}' AND Cancel_Select__c = false AND Consum_Num__c > 0 AND Consum_Apply_Equipment_Set__r.Wei_Assigned_Cnt__c = 0 AND Consum_Apply_Equipment_Set__r.Yi_Assigned_Cnt__c > 0 AND Shipment_request__c = false"; String soql = 'SELECT Id, Consum_Apply__c, Consum_Apply_Equipment_Set__c, Asset__c, Select_Time__c' + ' FROM Consum_Apply_Equipment_Set_Detail__c ' + ' WHERE ' + (String.isNotBlank(raesid) ? 'Consum_Apply_Equipment_Set__c = :raesid ' : 'Consum_Apply__c = :raid ') + ' AND Cancel_Select__c = false ' // + ' AND Consum_Num__c > 0 ' //+ ' AND Consum_Apply_Equipment_Set__r.Wei_Assigned_Cnt__c = 0 ' //+ ' AND Consum_Apply_Equipment_Set__r.Yi_Assigned_Cnt__c > 0 ' + ' AND Shipment_request__c = false' + ' ORDER BY Consum_Apply_Equipment_Set__c, Id'; System.debug(soql); System.debug(raesid); System.debug(raid); List raesds = Database.query(soql); Map> Consum_Asset_SerialNumberMap = new Map>(); if (raesds.size() < 1) { return '没有可以出库指示的明细'; } else { //Set raesSet = new Set(); //String raesStrRequest = ''; for (Consum_Apply_Equipment_Set_Detail__c raesd : raesds) { //if (false == raesSet.contains(raesd.Consum_Apply_Equipment_Set__c)) { // raesSet.add(raesd.Consum_Apply_Equipment_Set__c); // raesStrRequest += raesd.Consum_Apply_Equipment_Set__c; //} if(raesd.Asset__c == null || raesd.Select_Time__c == null){ return '申请单内存在未分配的耗材,请分配或分割申请单'; } raesd.Shipment_request_time2__c = Datetime.now(); raesd.Shipment_request__c = true; } // 出库后, 再次做出库指示的一览, 一定要个出过库的一览一样 //if (false == String.isBlank(raesStrShipped) && raesStrRequest != raesStrShipped) { // return '不能做出库指示,需要分单后再操作'; //} } Consum_Apply__c ra = new Consum_Apply__c(Id = raesds[0].Consum_Apply__c, Status__c = '已出库指示'); update ra; Database.SaveResult[] results = Database.update(raesds); Database.SaveResult dmlResult = results[0]; if (dmlResult.isSuccess()) { //明细更新成功后才更新一览的Consum_Asset_SerialNumber__c soql = 'SELECT Id, SerialNumber_text__c, Consum_Apply_Equipment_Set__c ' +'FROM Consum_Apply_Equipment_Set_Detail__c ' +'WHERE Consum_Apply__c = \'' + raesds[0].Consum_Apply__c + '\'' +'AND Shipment_request_time2__c != null ' +'AND Shipment_request__c = true ' +'AND SerialNumber_text__c != null ' +'ORDER BY Consum_Apply_Equipment_Set__c '; List raesdSerialNumbers = Database.query(soql); for (Consum_Apply_Equipment_Set_Detail__c raesd : raesdSerialNumbers) { if (!Consum_Asset_SerialNumberMap.containsKey(raesd.Consum_Apply_Equipment_Set__c)) { // Asset__r.SerialNumber + ',' Consum_Asset_SerialNumberMap.put(raesd.Consum_Apply_Equipment_Set__c, new List()); } Consum_Asset_SerialNumberMap.get(raesd.Consum_Apply_Equipment_Set__c).add(raesd.SerialNumber_text__c); } List raess = new List(); for (Id key : Consum_Asset_SerialNumberMap.keySet()) { raess.add(new Consum_Apply_Equipment_Set__c(Id = key, Consum_Asset_SerialNumber__c = ',' + String.join(Consum_Asset_SerialNumberMap.get(key), ',') + ',')); } if (!raess.isEmpty()) { update raess; } return '状态更新到已出库指示'; } else { Database.rollback(sp); Database.Error emsg = dmlResult.getErrors()[0]; return 'failed to update:' + emsg.getFields() + ' ' + emsg.getMessage(); } } catch (Exception ex) { Database.rollback(sp); return ex.getMessage(); }} /** * 注残申请备品的管控 */ WebService static String ConsumApplyCheckForSAoneEle(String SaID) { Statu_Achievements__c Sac = [select id, SalesChannel__c, Opportunity__r.Sales_Root__c, Status_1__c, Status_2_Formula__c, Opp_Number__c, ContractNO__c, FirstApproveDate__c, CreatedDate, X30_Deposit_Day__c, Deposit_In_Full_Day__c, DeliveryDate__c from Statu_Achievements__c where id = :SaID]; if(Sac.Opportunity__r.Sales_Root__c == '販売店'){ if(Sac.Opp_Number__c.contains('GI')||Sac.Opp_Number__c.contains('BF')||Sac.Opp_Number__c.contains('ET') ){ if(Sac.Status_1__c == '注残' && (Sac.Status_2_Formula__c == '12 已订货・付全款'||Sac.Status_2_Formula__c == '13 待发货')){ if((Date.today().addDays(-30)>Sac.Deposit_In_Full_Day__c)&&Sac.DeliveryDate__c == null){ return 'Fin'; }else{ return '经销商内科订单不在申请期内,不能申请备品'; } }else{ return '经销商内科订单状态不符合备品申请资格,不能申请备品'; } }else if(Sac.Opp_Number__c.contains('SP')){ if(Sac.Status_1__c == '注残' && (Sac.Status_2_Formula__c == '11 已订货・付订金'||Sac.Status_2_Formula__c == '12 已订货・付全款'||Sac.Status_2_Formula__c == '13 待发货')){ if((Date.today().addDays(-60)>Sac.X30_Deposit_Day__c )&&Sac.DeliveryDate__c == null){ return 'Fin'; }else{ return '经销商SP订单不在申请期内,不能申请备品'; } }else{ return '经销商SP订单状态不符合备品申请资格,不能申请备品'; } }else{ return '注残销售渠道类别不在可申请备品范围内'; } }else if(Sac.Opportunity__r.Sales_Root__c == 'OCM直接販売'){ if(Sac.Opp_Number__c.contains('GI')||Sac.Opp_Number__c.contains('BF')||Sac.Opp_Number__c.contains('ET')){ if(Sac.Status_1__c == '注残' && (Sac.Status_2_Formula__c == '09 已录入订单未付款'||Sac.Status_2_Formula__c == '10 库存已预留・未付款'||Sac.Status_2_Formula__c == '11 已订货・付订金'||Sac.Status_2_Formula__c == '12 已订货・付全款'||Sac.Status_2_Formula__c == '13 待发货')){ if((Date.today().addDays(-30)>Sac.FirstApproveDate__c )&&Sac.DeliveryDate__c == null){ return 'Fin'; }else{ return 'OCM直销内科订单不在申请期内,不能申请备品'; } }else{ return 'OCM直销内科订单状态不符合备品申请资格,不能申请备品'; } }else if(Sac.Opp_Number__c.contains('SP')){ if(Sac.Status_1__c == '注残' && (Sac.Status_2_Formula__c == '09 已录入订单未付款'||Sac.Status_2_Formula__c == '10 库存已预留・未付款'||Sac.Status_2_Formula__c == '11 已订货・付订金'||Sac.Status_2_Formula__c == '12 已订货・付全款'||Sac.Status_2_Formula__c == '13 待发货')){ if((Date.today().addDays(-60)>Sac.FirstApproveDate__c )&&Sac.DeliveryDate__c == null){ return 'Fin'; }else{ return 'OCM直销SP订单不在申请期内,不能申请备品'; } }else{ return 'OCM直销SP订单状态不符合备品申请资格,不能申请备品'; } }else{ return '注残销售渠道类别不在可申请备品范围内。'; } }else{ return '销售渠道未知,不能新建'; } } Webservice static String all_received_fse(String caId) { Savepoint sp = Database.setSavepoint(); try { List caesdList = [SELECT Id , RAESD_Status__c , Loaner_received_time__c , Consum_Apply__r.Loaner_received_ng_num__c FROM Consum_Apply_Equipment_Set_Detail__c WHERE DeliverySlip__c !=null AND Cancel_Select__c = false AND Consum_Apply__c = :caId]; if (caesdList.size() == 0) { return '未发货'; } else if (caesdList[0].Consum_Apply__r.Loaner_received_ng_num__c == 0) { return '现场已经全部收到实物了'; } else { List caesdL = new List(); for (Consum_Apply_Equipment_Set_Detail__c caesd : caesdList) { if (caesd.Loaner_received_time__c == null && caesd.RAESD_Status__c=='已出库') { Consum_Apply_Equipment_Set_Detail__c caesd1 = new Consum_Apply_Equipment_Set_Detail__c(); caesd1.Id = caesd.Id; caesd1.Received_Confirm__c = 'OK'; caesdL.add(caesd1); } } if (caesdL.size() > 0) { update caesdL; } return '现场已全部收货'; } } catch (Exception e) { Database.rollback(sp); return e.getMessage(); } } @TestVisible private static void test() { if (false == Test.isRunningTest()) return; Integer i = 0; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; } }