Esempio n. 1
0
        public int Update(StartProcessInput <UpdateEarlyStageInput> input)
        {
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.ReplyNumber}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var record = input.Data.MapTo <EarlyStage>();

            record.ProcessInstanceId = processInstanceId;
            record.State             = DataState.Updating;
            record.Mid = record.Id;
            record.Id  = 0;
            _earlyStageRepository.Add(record);
            var task = tasks[0];

            _taskProvider.Complete(task.Id);
            return(record.Id);
        }
Esempio n. 2
0
        public int Add(StartProcessInput <AddConstructionUnitInput> input)
        {
            if (input.Data.Name == null)
            {
                throw new AppCoreException("单位名称不能为空");
            }
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.Name}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var constructionUnit = input.Data.MapTo <ConstructionUnit>();

            // var count = AppSampleContext.Instance.GetSupplierNoCount(() => _supplierRepository.Count(u => u.CreateTime.Value.Year == DateTime.Now.Year && (u.State == DataState.Stable || u.State == DataState.Creating)));
            constructionUnit.ProcessInstanceId = processInstanceId;
            constructionUnit.State             = DataState.Creating;
            // constructionUnit.SupplierNo = $"{DateTime.Now.Year}{count.ToString("000000")}";
            constructionUnit.Mid = null;
            _constructionUnitRepository.Add(constructionUnit);
            var task = tasks[0];

            _taskProvider.Complete(task.Id);
            return(constructionUnit.Id);
        }
Esempio n. 3
0
        public int Add(StartProcessInput <AddProjectInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.Name}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var project = input.Data.MapTo <Project>();
            var count   = ProjectContext.Instance.GetProjectBaseInfoNoCount(() => _projectRepository.Count(u => u.CreateTime.Value.Year == DateTime.Now.Year && (u.DataState == DataState.Stable || u.DataState == DataState.Creating)));

            project.ProcessInstanceId = processInstanceId;
            project.DataState         = DataState.Creating;
            project.No  = $"{DateTime.Now.Year}{count.ToString("0000")}";
            project.Mid = null;
            _projectRepository.Add(project);
            var task = tasks[0];

            if (!input.PreventCommit)
            {
                _taskProvider.Complete(task.Id);
            }
            return(project.Id);
        }
Esempio n. 4
0
        public int Add(StartProcessInput <AddRecordInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.RecordName}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var record = input.Data.MapTo <Record>();

            record.ProcessInstanceId = processInstanceId;
            record.DataState         = DataState.Creating;
            record.Mid = null;
            _recordRepository.Add(record);
            var task = tasks[0];

            if (!input.PreventCommit)
            {
                _taskProvider.Complete(task.Id);
            }
            return(record.Id);
        }
Esempio n. 5
0
        public int Update(StartProcessInput <UpdateQualityProblemInput> input)
        {
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            if (!_projectHelper.HasPermission("质量信息负责人", input.Data.ProjectId))//权限设置
            {
                throw new AppCoreException("质量问题修改没有权限");
            }
            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.Source}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var record = input.Data.MapTo <QualityProblem>();

            record.ProcessInstanceId = processInstanceId;
            record.State             = DataState.Updating;
            record.Mid = record.Id;
            record.Id  = 0;
            _problemRepository.Add(record);
            var task = tasks[0];

            _taskProvider.Complete(task.Id);
            return(record.Id);
        }
Esempio n. 6
0
        public IActionResult StartProjectProcess([FromBody] StartProcessInput <AddProjectInput> input)
        {
            var id = _projectService.Add(input);

            _ganttService.AddByProject(id);
            return(Created("", new { id }));
        }
Esempio n. 7
0
        public int Update(StartProcessInput <UpdateProjectInput> input)
        {
            //if (!_projectHelper.HasPermission("项目负责人", input.Data.Id))
            //{
            //    throw new AppCoreException("项目没有权限");
            //}
            if (_authInfoProvider.GetCurrent().User.Id != _projectRepository.Get().Where(u => u.Id == input.Data.Id).Select(u => u.CreatorId).FirstOrDefault())
            {
                throw new AppCoreException("项目没有权限");
            }

            NullableHelper.SetNull(input.Data);
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;


            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.Name}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var project   = input.Data.MapTo <Project>();
            var projectNo = _projectRepository.Get().Where(u => u.Id == project.Id).Select(u => u.No).FirstOrDefault();

            project.ProcessInstanceId = processInstanceId;
            project.No = projectNo;
            project.Attachments.ForEach(u => u.Id = 0);
            project.Members.ForEach(u => u.Id     = 0);
            project.Units.ForEach(u => {
                u.Id = 0;
                u.Members.ForEach(v => v.Id = 0);
            });
            if (project.Location != null)
            {
                project.Location.Id        = 0;
                project.Location.ProjectId = 0;
            }
            project.DataState = DataState.Updating;
            project.Mid       = project.Id;
            project.Id        = 0;
            _projectRepository.Add(project);
            var task = tasks[0];

            _taskProvider.Complete(task.Id);
            return(project.Id);
        }
Esempio n. 8
0
        public int Add(StartProcessInput <AddWeeklyProgressInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            if (!_projectHelper.HasPermission("进度填报负责人", input.Data.ProjectId))
            {
                throw new AppCoreException("进度填报没有权限");
            }

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.AddDate}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var progress = input.Data.MapTo <WeeklyProgress>();

            if (progress.ProjectId == 0)
            {
                throw new AppCoreException("传入数据的ProjectId不能为空");
            }
            //if(_progressRepository.Count(u=>u.ProjectId == progress.ProjectId && u.Week == progress.Week && u.Year == progress.Year) > 0)
            //{
            //    throw new EntityException("Week", progress.Week, "PmWeeklyReport", "已存在");
            //}
            progress.ProcessInstanceId = processInstanceId;
            progress.DataState         = DataState.Creating;
            progress.Mid = null;
            _progressRepository.Add(progress);
            var task = tasks[0];

            if (!input.PreventCommit)
            {
                _taskProvider.Complete(task.Id);
            }
            return(progress.Id);
        }
Esempio n. 9
0
        public int Update(StartProcessInput <UpdateMonthlyProgressInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            var projectId = _progressRepository.Get().Where(u => u.Id == input.Data.Id).Select(u => u.ProjectId).FirstOrDefault();
            var list      = _projectRepository.Get().Where(u => u.Id == input.Data.ProjectId).SelectMany(u => u.Members).Where(u => u.ProjectRole == "投资信息负责人").Select(u => u.UserId).ToList();

            if (!_projectHelper.HasPermission("投资信息负责人", projectId))
            {
                throw new AppCoreException("月投资更新没有权限");
            }

            var progress = input.Data.MapTo <MonthlyProgress>();

            if (_progressRepository.Count(u => u.ProjectId == projectId && u.RecordDate == progress.RecordDate && u.DataState == DataState.Stable && u.Id != progress.Id) > 0)
            {
                throw new EntityException("Date", progress.RecordDate, "PmMonthlyReport", "已存在");
            }

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.Year}-{input.Data.Month}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            progress.ProcessInstanceId = processInstanceId;
            progress.DataState         = DataState.Updating;
            progress.Mid = progress.Id;
            progress.Id  = 0;
            _progressRepository.Add(progress);
            var task = tasks[0];

            _taskProvider.Complete(task.Id);
            return(progress.Id);
        }
Esempio n. 10
0
        public int Add(StartProcessInput <AddContractPaymentInput> input)
        {
            if (input.Data.ContractId == 0)
            {
                throw new AppCoreException("合同id不能为0");
            }
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}",//-{input.Data.Title}
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }

            var contractPayment = input.Data.MapTo <ContractPayment>();

            // var count = AppSampleContext.Instance.GetSupplierNoCount(() => _supplierRepository.Count(u => u.CreateTime.Value.Year == DateTime.Now.Year && (u.State == DataState.Stable || u.State == DataState.Creating)));
            contractPayment.ProcessInstanceId = processInstanceId;
            contractPayment.State             = DataState.Creating;
            // memorabiliaRecord.SupplierNo = $"{DateTime.Now.Year}{count.ToString("000000")}";
            var paymentNumberPrefix = $"CP{DateTime.Now.ToString("yyyyMMdd")}";
            var count = _contractPaymentRepository.Count(u => u.PaymentNumber.Contains(paymentNumberPrefix) && (u.State == DataState.Stable || u.State == DataState.Creating));

            contractPayment.PaymentNumber = $"{paymentNumberPrefix}{count.ToString("00")}";
            contractPayment.Mid           = null;
            _contractPaymentRepository.Add(contractPayment);
            var task = tasks[0];

            if (!input.PreventCommit)
            {
                _taskProvider.Complete(task.Id);
            }
            return(contractPayment.Id);
        }
Esempio n. 11
0
        public int Add(StartProcessInput <AddHousekeepingProblemInput> input)
        {
            if (input.Data.ProjectId == 0)
            {
                throw new AppCoreException("文明施工所在项目不能为0");
            }
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            // var list = _projectRepository.Get().Where(u => u.Id == input.Data.ProjectId).SelectMany(u => u.Members).Where(u => u.ProjectRole == "文明施工负责人").Select(u => u.UserId).ToList();
            if (!_projectHelper.HasPermission("文明施工负责人", input.Data.ProjectId))//权限设置
            {
                throw new AppCoreException("文明施工发布没有权限");
            }
            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.Content}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var problem = input.Data.MapTo <HousekeepingProblem>();

            // var count = AppSampleContext.Instance.GetSupplierNoCount(() => _supplierRepository.Count(u => u.CreateTime.Value.Year == DateTime.Now.Year && (u.State == DataState.Stable || u.State == DataState.Creating)));
            problem.ProcessInstanceId = processInstanceId;
            problem.State             = DataState.Creating;
            // memorabiliaRecord.SupplierNo = $"{DateTime.Now.Year}{count.ToString("000000")}";
            problem.Mid = null;
            _problemRepository.Add(problem);
            var task = tasks[0];

            if (!input.PreventCommit)
            {
                _taskProvider.Complete(task.Id);
            }
            return(problem.Id);
        }
Esempio n. 12
0
        public int Add(StartProcessInput <AddQualityProblemInput> input)
        {
            if (input.Data.Source == null)
            {
                throw new AppCoreException("质量问题来源不能为空");
            }
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            if (!_projectHelper.HasPermission("质量信息负责人", input.Data.ProjectId))//权限设置
            {
                throw new AppCoreException("质量问题发布没有权限");
            }
            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.Source}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var qualityProblem = input.Data.MapTo <QualityProblem>();

            // var count = AppSampleContext.Instance.GetSupplierNoCount(() => _supplierRepository.Count(u => u.CreateTime.Value.Year == DateTime.Now.Year && (u.State == DataState.Stable || u.State == DataState.Creating)));
            qualityProblem.ProcessInstanceId = processInstanceId;
            qualityProblem.State             = DataState.Creating;
            // memorabiliaRecord.SupplierNo = $"{DateTime.Now.Year}{count.ToString("000000")}";
            qualityProblem.Mid = null;
            _problemRepository.Add(qualityProblem);
            var task = tasks[0];

            if (!input.PreventCommit)
            {
                _taskProvider.Complete(task.Id);
            }
            return(qualityProblem.Id);
        }
Esempio n. 13
0
        public int Update(StartProcessInput <UpdateRecordInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.RecordName}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var record = _recordRepository.Get()
                         .Include(u => u.Attachments)
                         .Where(u => u.Id == input.Data.Id).FirstOrDefault();
            var updated = input.Data.MapTo <Record>();

            record.ProcessInstanceId             = processInstanceId;
            record.RecordTypeId                  = updated.RecordTypeId;
            record.Attachments                   = updated.Attachments;
            record.Description                   = updated.Description;
            record.RecordName                    = updated.RecordName;
            record.Attachments.ForEach(u => u.Id = 0);
            record.DataState = DataState.Updating;
            record.Mid       = record.Id;
            record.Id        = 0;
            _recordRepository.Add(record);
            var task = tasks[0];

            _taskProvider.Complete(task.Id);
            return(record.Id);
        }
Esempio n. 14
0
        public int Update(StartProcessInput <UpdateWeeklyProgressInput> input)
        {
            NullableHelper.SetNull(input.Data);
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            var projectId = _progressRepository.Get().Where(u => u.Id == input.Data.Id).Select(u => u.ProjectId).FirstOrDefault();

            if (!_projectHelper.HasPermission("进度填报负责人", projectId))
            {
                throw new AppCoreException("进度填报更新没有权限");
            }

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.AddDate}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var progress = input.Data.MapTo <WeeklyProgress>();

            progress.ProcessInstanceId = processInstanceId;
            progress.DataState         = DataState.Updating;
            progress.Mid = progress.Id;
            progress.Id  = 0;
            _progressRepository.Add(progress);
            var task = tasks[0];

            _taskProvider.Complete(task.Id);
            return(progress.Id);
        }
Esempio n. 15
0
        public int Add(StartProcessInput <AddEarlyStageInput> input)
        {
            if (input.Data.ReplyNumber == null)
            {
                throw new AppCoreException("批复文号不能为空");
            }
            var variables = new Dictionary <string, object>();
            var userId    = _authInfoProvider.GetCurrent().User.Id;

            variables.Add("starter", userId.ToString());
            int processInstanceId = _runtimeProvider.StartProcessInstanceByName(
                input.ProcessDefinitionName,
                $"{input.ProcessDefinitionName}-{input.Data.ReplyNumber}",
                variables);
            var tasks = _taskProvider.GetByProcessInstance(processInstanceId);

            if (tasks.Count == 0)
            {
                throw new AppCoreException("任务未创建成功!");
            }
            var earlyStage = input.Data.MapTo <EarlyStage>();

            // var count = AppSampleContext.Instance.GetSupplierNoCount(() => _supplierRepository.Count(u => u.CreateTime.Value.Year == DateTime.Now.Year && (u.State == DataState.Stable || u.State == DataState.Creating)));
            earlyStage.ProcessInstanceId = processInstanceId;
            earlyStage.State             = DataState.Creating;
            // memorabiliaRecord.SupplierNo = $"{DateTime.Now.Year}{count.ToString("000000")}";
            earlyStage.Mid = null;
            _earlyStageRepository.Add(earlyStage);
            var task = tasks[0];

            if (!input.PreventCommit)
            {
                _taskProvider.Complete(task.Id);
            }
            return(earlyStage.Id);
        }
Esempio n. 16
0
 public IActionResult StartConstructionUnitProcess(int id, [FromBody] StartProcessInput <UpdateConstructionUnitInput> input)
 {
     input.Data.Id = id;
     _constructionUnitService.Update(input);
     return(Created("", new { id }));
 }
Esempio n. 17
0
        public IActionResult StartSafetyAccidentProcess([FromBody] StartProcessInput <AddSafetyAccidentInput> input)
        {
            var id = _safetyAccidentTaskService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 18
0
 public IActionResult StartSafetyAccidentProcess(int id, [FromBody] StartProcessInput <UpdateSafetyAccidentInput> input)
 {
     input.Data.Id = id;
     _safetyAccidentTaskService.Update(input);
     return(Created("", new { id }));
 }
Esempio n. 19
0
        public IActionResult StartHousekeepingProcess([FromBody] StartProcessInput <AddHousekeepingProblemInput> input)
        {
            var id = _housekeepingProblemTaskService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 20
0
        public IActionResult StartMonthlyProgressProcess([FromBody] StartProcessInput <AddMonthlyProgressInput> input)
        {
            var id = _monthlyProgressService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 21
0
        public IActionResult StartEarlyStageProcess([FromBody] StartProcessInput <AddEarlyStageInput> input)
        {
            var id = _earlyStageTaskService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 22
0
 public IActionResult StartEarlyStageProcess(int id, [FromBody] StartProcessInput <UpdateEarlyStageInput> input)
 {
     input.Data.Id = id;
     _earlyStageTaskService.Update(input);
     return(Created("", new { id }));
 }
Esempio n. 23
0
        public IActionResult StartMemoProcess([FromBody] StartProcessInput <AddRecordInput> input)
        {
            var id = _recordService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 24
0
 public IActionResult StartMemoProcess(int id, [FromBody] StartProcessInput <UpdateRecordInput> input)
 {
     input.Data.Id = id;
     _recordService.Update(input);
     return(Created("", new { id }));
 }
Esempio n. 25
0
 public IActionResult StartPaymentProcess(int id, [FromBody] StartProcessInput <UpdateContractPaymentInput> input)
 {
     input.Data.Id = id;
     _paymentService.Update(input);
     return(Created("", new { id }));
 }
Esempio n. 26
0
        public IActionResult StartProblemsProcess([FromBody] StartProcessInput <AddProblemInput> input)
        {
            var id = _problemsTaskService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 27
0
 public IActionResult StartMonthlyProgressProcess(int id, [FromBody] StartProcessInput <UpdateMonthlyProgressInput> input)
 {
     input.Data.Id = id;
     _monthlyProgressService.Update(input);
     return(Created("", new { id }));
 }
Esempio n. 28
0
        public IActionResult StartConstructionUnitProcess([FromBody] StartProcessInput <AddConstructionUnitInput> input)
        {
            var id = _constructionUnitService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 29
0
        public IActionResult StartPaymentProcess([FromBody] StartProcessInput <AddContractPaymentInput> input)
        {
            var id = _paymentService.Add(input);

            return(Created("", new { id }));
        }
Esempio n. 30
0
 public IActionResult StartProblemsProcess(int id, [FromBody] StartProcessInput <UpdateProblemInput> input)
 {
     input.Data.Id = id;
     _problemsTaskService.Update(input);
     return(Created("", new { id }));
 }