     deinit {
         scroll?.removeObserver(self, forKeyPath: #keyPath(UIScrollView.contentSize), context: &scrollContentContext)
         scroll?.removeObserver(self, forKeyPath: #keyPath(UIScrollView.contentOffset), context: &scrollContentContext)
-
+        
         subscrolls.allObjects.forEach { subscroll in
             subscroll.removeObserver(self, forKeyPath: #keyPath(UIScrollView.contentOffset), context: &scrollContentContext)
         }

        // Stop scroll decelerate
        activeScroll.stopDecelerating()
        
        // To make sure scroll bottom does not get higher than container bottom during animation spring bounce.
        let antiBounce: CGFloat = 1000
        activeScroll.frame.size.height += antiBounce
        activeScroll.contentInset.bottom += antiBounce
        
        let animator = UIViewPropertyAnimator(duration: 0.3, curve: .easeInOut)
        
        animator.addAnimations {
            self.currentOffset = offset
        }
        
        animator.addCompletion { _ in
            self.updateScrollSize()
            self.activeScroll.contentInset.bottom -= antiBounce
        }
        
        animator.startAnimation()

        let offset = min(maxOffset, max(minOffset, targetOffset))
        return (offset, offset - targetOffset)
    }
    
    @objc
    public func didPanDrag(_ pan: UIPanGestureRecognizer) {
        let dragOffset = pan.translation(in: pan.view).y
