public with sharing class ConsumEquipmentSetReturnController extends CreateRelationListPagingCtrlBase{
    private String cesIdsStr;
    public String caIdStr {get;set;}
    private List<String> cesIdList;
    public String c_apply_no { get; private set; }
    public Boolean done_flg { get;  set; }
    private String keywdSort = null;
    public FixtureDeliverySlip__c slip { get; set; }
    public String keepWher { get; set; }
    public String keyword { get; set; }
    public String keywordDate { get; set; }
    public Boolean saveBtnDisabled { get; private set; }
    public String userid {get;set;}
    public Map<Id, Consum_Apply_Equipment_Set_Detail__c> caesdVFMap { get; private set; }
    private List<Consum_Apply_Equipment_Set_Detail__c> useCaesdList;

    public ConsumEquipmentSetReturnController() {
        caIdStr = ApexPages.currentPage().getParameters().get('id');
        String saved = ApexPages.currentPage().getParameters().get('save') ;
        if (saved != null && saved == '1') {
            done_flg = true;
        }
    }

    public override Integer getSearchNumMax() {
        //各ページに制御あれば、最大件数を指定する
        // searchNumMax = Integer.valueOf(Label.Product_Select_Limit);
        // searchNumMax = 20;
        pagesize = '200';
        return searchNumMax;
    }

    /* 選択されたデータ取得用Soql　Fromから*/
    public override String getSelectedDataSql() {
        // オブジェクトAPI名
        selectedDataSql = ' From Consum_Apply_Equipment_Set_Detail__c';
        selectedDataSql += ' where Id != null ';
        selectedDataSql += '   and (';
        selectedDataSql += 'Consum_Apply__r.Name = \'' + String.escapeSingleQuotes(caIdStr) + '\' OR Consum_Apply__c = \'' + String.escapeSingleQuotes(caIdStr) + '\'';
        selectedDataSql += ')';
        selectedDataSql += '   and Shippment_loaner_time2__c != null';
        selectedDataSql += ' AND (Cancel_Select__c = false OR NG_Select_Again__c = true)';
        selectedDataSql += ' order by Fixture_Model_No_F__c nulls last, Consumable_Guaranteen_end_F__c nulls last';
        keepWher = selectedDataSql;
        myComponentController.columnRightRW.put('Yi_Fa_Huo_Jia__c', 'r');
        myComponentController.columnRightRW.put('Dao_Huo_OK_Jia__c', 'r');
        myComponentController.columnRightRW.put('Dao_Huo_NG_Jia__c', 'r');
        myComponentController.columnRightRW.put('Wei_Dao_Huo_Jia__c', 'r');
        myComponentController.columnRightRW.put('Dao_Huo_NG_Confirm_Jia__c', 'r');
        myComponentController.columnRightRW.put('Dao_Huo_NG_UnConfirm_Jia__c', 'r');
        myComponentController.columnRightRW.put('Yi_Xiao_Hao_Jia__c', 'r');
        myComponentController.columnRightRW.put('Hui_Ji_Jia__c', 'w');
        myComponentController.columnRightRW.put('Dai_Xiao_Hao_Jia__c', 'r');

        return selectedDataSql;
    }

    // 検索元対象オブジェクトAPI名
    public override String getOriginObjName() {
        // オブジェクトAPI名
        originObjName = 'Consum_Apply_Equipment_Set_Detail__c';
        return originObjName;
    }
    public override String getOriginObjColumns() {
        // 項目セット
        originObjColumns =  'Id';
        return originObjColumns;
    }

    public override String getObjName() {
        // オブジェクトAPI名
        objName = 'Consum_Apply_Equipment_Set_Detail__c';
        return objName;
    }
    public override String getColumnLeftFieldSetName() {
        // 左の項目セット
        columnLeftFieldSetName = '';
        return columnLeftFieldSetName;
    }
    public override String getColumnRightFieldSetName() {
        // 右の項目セット
        columnRightFieldSetName = 'ConsumEquipmentSetReturn_R';
        return columnRightFieldSetName;
    }

    public override List<String> getColumnFieldList() {
        // strColumus 里加 field
        // FixtureUtil#raesdGroupBy()の項目も必要
        return new List<String>{'Id'
                              , 'Asset__c'
                              , 'Shippment_loaner_time2__c'
                              , 'Received_Confirm__c'
                              , 'Asset_Center_Confirm__c'
                              , 'Check_lost_Item_Final__c'
                              , 'Check_lost_Item__c'
                              , 'Shipment_Saved_Flg__c'
                              , 'Return_DeliverySlip__c'
                              , 'Fixture_Model_No__c'
                              , 'SerialNumber_F__c'
                              , 'Shipment_request_time2__c', 'Consum_Apply_Equipment_Set__r.Yi_Shipment_request__c'};
    }
    // getObjName 连 getOriginObjName 的 FK
    public override String getFKColumnField() {
        return null;
    }

    public override String getRecordTypeId() {
        //ページレイアウトを収得するのレコードタイプ
        recordTypeId = '';
        return recordTypeId;
    }

    // ページコントローラに検索処理は、WhereSoql作成のみ、パラメータとして、コンポーネントに渡される
    public override String getSqlWhereStr() {
        sqlWhereStr = '';
        sqlWhereStr = this.makeSoql(keywdSort);
        System.debug('sqlWhereStr is:' + sqlWhereStr);
        return sqlWhereStr;
    }

    public override String getOrderbyStr() {
        return 'order by Fixture_Model_No_F__c nulls last, Consumable_Guaranteen_end_F__c nulls last';
    }

    public override Boolean getIsNeedRunSearch() {

      //   if (String.isBlank(keyword)) {
            // isNeedRunSearch = false;
      //   }else{
            // isNeedRunSearch = true;
      //   }
        return false;
    }

    public void init() {

        Set<Id> rnsIdSet = new Set<Id>();
        userid = Userinfo.getUserId();
        if (caIdStr != null) {
            // 借出耗材申请一览
            List<Consum_Apply__c> caList = [select Id
                                            from Consum_Apply__c
                                           where (Name =:caIdStr or Id =:caIdStr)
                                             ];
            if (caList.isEmpty()) {
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '耗材备品申请不存在'));
                saveBtnDisabled = true;
                return;
            }
            parentId = caList[0].Id;
        }

        slip = new FixtureDeliverySlip__c();
        slip.Wh_Staff__c = userid;
        slip.ConsumSlip__c = true;

        searchOppSetParam();
        getSqlWhereStr();

        // return null;
    }

    private void searchOppSetParam() {
        keywdSort = keyword;
    }

    public void searchSlip() {
        String qryString = 'select Id, Shippment_loaner_time__c, Name, DeliveryCompany__c, Wh_Staff__c, Combine_Pack__c, Distributor_method__c, DeliveryType__c, DeliveryCompany_SlipNo__c '
                + 'from FixtureDeliverySlip__c '
                + 'where Name =\''+ slip.Name +'\' and DeliveryType__c = \'回寄\'';
        if (String.isNotBlank(slip.Distributor_method__c)) {
            qryString += ' and Distributor_method__c = \''+ slip.Distributor_method__c +'\'';
        }
        if (String.isNotBlank(slip.DeliveryCompany__c)) {
            qryString += ' and DeliveryCompany__c = \''+ slip.DeliveryCompany__c +'\'';
        }
        List<FixtureDeliverySlip__c> slipList = Database.query(qryString);

        if (slipList.size() > 0) {
            if (slipList.size() > 1) {
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '当前条件检索到复数条运输单，请追加检索条件!'));
            }
            slip = slipList[0];
        }
    }

    public PageReference save() {
        if(String.isEmpty(slip.Name)){
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR,'没有填写运输单号！'));
            return null;
        }
        if(String.isEmpty(slip.Distributor_method__c)){
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR,'没有选择运输方式！'));
            return null;
        }
        if(String.isEmpty(slip.DeliveryCompany__c)){
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR,'没有选择物流公司！'));
            return null;
        }
        if(String.isEmpty(slip.Wh_Staff__c)){
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR,'没有选择担当者！'));
            return null;
        }
        Map<String, Integer> sendAssetKey = new Map<String, Integer>();
        for (WrapperInfo wi : viewList) {
            Consum_Apply_Equipment_Set_Detail__c caesd = (Consum_Apply_Equipment_Set_Detail__c)wi.sobj;
            if (!wi.check && caesd.Return_DeliverySlip__c == null) {
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR,'请全部勾选后再保存！'));
                return null;
            }
            Integer cnt = caesd.Hui_Ji_Jia__c == null ? 0 : Integer.valueOf(caesd.Hui_Ji_Jia__c);
            //要发货件数
            if(caesd.Return_DeliverySlip__c == null) {
                sendAssetKey.put(caesd.Asset__c, cnt);
            }

        }


        List<Consum_Apply_Equipment_Set_Detail__c> updList = new List<Consum_Apply_Equipment_Set_Detail__c>();
        List<Consum_Apply_Equipment_Set_Detail__c> sendbackList = new List<Consum_Apply_Equipment_Set_Detail__c>();

        for (Consum_Apply_Equipment_Set_Detail__c caesd : useCaesdList) {
            if(caesd.Return_DeliverySlip__c != null) {
                continue;
            }
            if (sendAssetKey.containsKey(caesd.Asset__c)) {
                Integer cnt = sendAssetKey.get(caesd.Asset__c);
                if (caesd.Received_Confirm__c == 'OK' || caesd.Received_Confirm__c == '默认签收-OK') {
                    // 需要寄回的明细
                    if(cnt > 0) {
                        cnt -= 1;
                        sendAssetKey.put(caesd.Asset__c, cnt);
                        sendbackList.add(caesd);
                        caesdVFMap.get(caesd.Asset__c).Dai_Xiao_Hao_Jia__c = caesdVFMap.get(caesd.Asset__c).Dao_Huo_OK_Jia__c
                                                                           + caesdVFMap.get(caesd.Asset__c).Dao_Huo_NG_Jia__c
                                                                           - caesdVFMap.get(caesd.Asset__c).Yi_Xiao_Hao_Jia__c
                                                                           - caesdVFMap.get(caesd.Asset__c).Hui_Ji_Jia__c;
                    }
                    // 不需要寄回的明细，变成待消耗
                    else {
                        caesd.Check_lost_Item__c = '消耗';
                        // 待消耗操作人和时间在trigger里改
                        updList.add(caesd);
                    }
                }
            }
            // 待消耗数为0 <=> 画面上不显示 => 直接待消耗
            else {
                caesd.Check_lost_Item__c = '消耗';
                // 待消耗操作人和时间在trigger里改
                updList.add(caesd);
            }
        }

        Savepoint sp = Database.setSavepoint();
        try {
            if (sendbackList.size() > 0) {
                slip.Shippment_loaner_time__c = Datetime.now();
                String message = '';
                FixtureUtil.withoutUpsertObjects(new List<FixtureDeliverySlip__c>{slip});
                for (Consum_Apply_Equipment_Set_Detail__c caesd : sendbackList) {
                    caesd.Return_DeliverySlip__c = slip.Id;
                    caesd.Return_Operator__c = slip.Wh_Staff__c;
                    caesd.Asset_return_time__c = slip.Shippment_loaner_time__c;
                    updList.add(caesd);
                }
            }
            if (updList.size() > 0) {
                FixtureUtil.withoutUpdate(updList);
            }
            done_flg = true;

            PageReference pg = new PageReference('/apex/ConsumEquipmentSetReturn');
            pg.getParameters().put('id',caIdStr);
            pg.getParameters().put('save','1');
            pg.setRedirect(true);
            return pg;
        } catch (Exception ex) {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, ex.getMessage()));
            Database.rollback(sp);
            done_flg = false;
            return null;
        }
    }

    public void cancel() {
        for (WrapperInfo wi : viewList) {
            Consum_Apply_Equipment_Set_Detail__c caesd = (Consum_Apply_Equipment_Set_Detail__c)wi.sobj;
            if(caesd.Return_DeliverySlip__c == null){
                caesd.Hui_Ji_Jia__c = 0;
                caesd.Dai_Xiao_Hao_Jia__c = caesd.Dao_Huo_OK_Jia__c
                                          + caesd.Dao_Huo_NG_Jia__c
                                          - caesd.Yi_Xiao_Hao_Jia__c
                                          - caesd.Hui_Ji_Jia__c;
                wi.check = false;
            }
        }
        slip = new FixtureDeliverySlip__c();
        slip.deliveryType__c = '回寄';
        slip.Wh_Staff__c = userid;
        ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '取消成功'));
    }

    private String makeSoql(String keyword) {
        // 検索条件

        return keepWher;
    }

    public override void setViewList(List<Sobject> queryList) {
        viewList = new List<WrapperInfo>();
        if (queryList.size() > 0) {
            useCaesdList = (List<Consum_Apply_Equipment_Set_Detail__c>)queryList;
        }
        else {
            useCaesdList = (List<Consum_Apply_Equipment_Set_Detail__c>)selectedData;
        }
        // asset.Id-->连到asset上的明细列表
        Map<Id, List<Consum_Apply_Equipment_Set_Detail__c>> caesdMap = new Map<Id, List<Consum_Apply_Equipment_Set_Detail__c>>();
        // asset.Id-->用于画面显示的假明细
        caesdVFMap = new Map<Id, Consum_Apply_Equipment_Set_Detail__c>();

        for (Consum_Apply_Equipment_Set_Detail__c caesd : useCaesdList) {
            if (!caesdMap.containsKey(caesd.Asset__c)) {
                caesdMap.put(caesd.Asset__c, new List<Consum_Apply_Equipment_Set_Detail__c>());
            }
            caesdMap.get(caesd.Asset__c).add(caesd);

            if(!caesdVFMap.containsKey(caesd.Asset__c)){
                Consum_Apply_Equipment_Set_Detail__c caesdVF = caesd.clone();
                caesdVF.Received_Confirm__c = null;
                caesdVF.Asset_Center_Confirm__c = null;
                caesdVF.Check_lost_Item_Final__c = null;
                caesdVF.Check_lost_Item__c = null;
                caesdVF.Return_DeliverySlip__c = null;
                // 已发货件数
                caesdVF.Yi_Fa_Huo_Jia__c = 0;
                // 到货确认OK件数
                caesdVF.Dao_Huo_OK_Jia__c = 0;
                // 到货NG件数
                caesdVF.Dao_Huo_NG_Jia__c = 0;
                // 未到货确认件数
                caesdVF.Wei_Dao_Huo_Jia__c = 0;
                // 到货确认NG件数
                caesdVF.Dao_Huo_NG_Confirm_Jia__c = 0;
                // 到货确认未确认数
                caesdVF.Dao_Huo_NG_UnConfirm_Jia__c = 0;
                // 已消耗件数
                caesdVF.Yi_Xiao_Hao_Jia__c = 0;
                // 回寄件数
                caesdVF.Hui_Ji_Jia__c = 0;
                // 待消耗件数
                caesdVF.Dai_Xiao_Hao_Jia__c = 0;
                caesdVFMap.put(caesd.Asset__c, caesdVF);
            }
            Consum_Apply_Equipment_Set_Detail__c caesdVF = caesdVFMap.get(caesd.Asset__c);
            if(caesdVF.Return_DeliverySlip__c == null && caesd.Return_DeliverySlip__c!=null) {
                caesdVF.Return_DeliverySlip__c = caesd.Return_DeliverySlip__c;
            }
            if(caesdVF.Check_lost_Item__c == null
               && (caesd.Check_lost_Item__c == '消耗' && String.isBlank(caesd.Check_lost_Item_Final__c))
               ) {
               caesdVF.Check_lost_Item__c = caesd.Check_lost_Item__c;
            }

            caesdVF.Yi_Fa_Huo_Jia__c += caesd.Shippment_loaner_time2__c != null ? 1 : 0;
            caesdVF.Dao_Huo_OK_Jia__c += caesd.Received_Confirm__c == 'OK' || caesd.Received_Confirm__c == '默认签收-OK' ? 1 : 0;
            caesdVF.Dao_Huo_NG_Jia__c += caesd.Received_Confirm__c == 'NG' ? 1 : 0;
            caesdVF.Wei_Dao_Huo_Jia__c += String.isBlank(caesd.Received_Confirm__c) ? 1 : 0;
            caesdVF.Dao_Huo_NG_Confirm_Jia__c += caesd.Received_Confirm__c =='NG' && caesd.Asset_Center_Confirm__c=='OK' ? 1 : 0;
            caesdVF.Dao_Huo_NG_UnConfirm_Jia__c += caesd.Received_Confirm__c =='NG' && String.isBlank(caesd.Asset_Center_Confirm__c) ? 1 : 0;
            caesdVF.Yi_Xiao_Hao_Jia__c += caesd.Check_lost_Item_Final__c == '消耗' ? 1 : 0;
            caesdVF.Hui_Ji_Jia__c += caesd.Return_DeliverySlip__c != null ? 1 : 0;
            caesdVF.Dai_Xiao_Hao_Jia__c = caesdVF.Dao_Huo_OK_Jia__c + caesdVF.Dao_Huo_NG_Jia__c - caesdVF.Yi_Xiao_Hao_Jia__c - caesdVF.Hui_Ji_Jia__c;
        }

        for(Consum_Apply_Equipment_Set_Detail__c caesdVF : caesdVFMap.values()){
            if(caesdVF.Dai_Xiao_Hao_Jia__c == 0 && caesdVF.Return_DeliverySlip__c == null) {
                continue;
            }
            WrapperInfo winfo = new WrapperInfo(caesdVF, myComponentController);
            if (caesdVF.Return_DeliverySlip__c != null 
                || caesdVF.Check_lost_Item__c == '消耗'
            ) {
                winfo.canEdit = false;
            }
            winfo.check = false;
            viewList.add(winfo);
        }
    }

    @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++;
    }
}