public CutSlideOperation(Model model, Slide slide, Note past, Note future)
 {
     #region 分割した手前側のSlideノーツを生成
     Slide before = new Slide();
     foreach (var note in slide.Where(x => x.Position.Tick < past.Position.Tick))
     {
         before.Add(note);
     }
     before.Add(new SlideEnd(past));
     #endregion
     #region 分割した奥側のSlideノーツを生成
     Slide after = new Slide();
     after.Add(new SlideBegin(future));
     foreach (var note in slide.Where(x => x.Position.Tick > future.Position.Tick))
     {
         after.Add(note);
     }
     #endregion
     Invoke += () =>
     {
         if (!slide.Any() || !before.Any() || !after.Any())
         {
             Logger.Warn("空のSlideが存在します。", true);
             return;
         }
         model.NoteBook.UnPut(slide);
         model.NoteBook.Put(before);
         model.NoteBook.Put(after);
     };
     Undo += () =>
     {
         if (!slide.Any() || !before.Any() || !after.Any())
         {
             Logger.Warn("空のSlideが存在します。", true);
             return;
         }
         model.NoteBook.Put(slide);
         model.NoteBook.UnPut(before);
         model.NoteBook.UnPut(after);
     };
 }
        protected Presentation Merge(UserIdentity identity,
                                     PresentationInfo presentationInfo,
                                     Slide[] newSlideArr,
                                     Presentation presentationStored,
                                     out LockingInfo[] lockedSlides,
                                     out Slide[] slideAlreadyExists)
        {
            IEnumerable<Slide> existedSlides = presentationStored.SlideList.Where(
                sl => newSlideArr.Any(newsl=>newsl.Id == sl.Id));
            if (existedSlides.Count() != 0)
            {
                slideAlreadyExists = existedSlides.ToArray();
                lockedSlides = new LockingInfo[] {};
                return null;
            }

            foreach (Slide slide in newSlideArr)
            {
                //Slide slideStored = presentationStored.SlideList.Find(
                //    sl => sl.Id == slide.Id);
                //if (slideStored != null) return null;
                slide.State = SlideState.Normal;
                presentationStored.SlideList.Add(slide);
            }
            // анализ удаленных слайдов
            List<Slide> slideListDeleted = presentationStored.SlideList.FindAll(
                sl => !presentationInfo.SlideInfoList.Exists(sli => sli.Id == sl.Id));
            if (!IsStandAlone)
            {
                IEnumerable<LockingInfo> lockedSl = slideListDeleted.Select(
                    sl => _lockService.GetLockInfo(ObjectKeyCreator.CreateSlideKey(presentationInfo.UniqueName, sl.Id))).Where(
                    li=>li != null);

                if (lockedSl.Count() != 0)
                {
                    lockedSlides = lockedSl.ToArray();
                    slideAlreadyExists = new Slide[] {};
                    return null;
                }
            }
            // удаляем слайды
            presentationStored.SlideList.RemoveAll(slideListDeleted.Contains);
            presentationStored.SavePresentationLevelChanges(presentationInfo);
            slideAlreadyExists = new Slide[] { };
            lockedSlides = new LockingInfo[] { };
            return presentationStored;
        }