                             [self.stored_size - 1, self.stored_size - 1],
                             [self.stored_size - 1, 0]], np.int32).reshape((-1, 1, 2))
          matrix = cv2.invertAffineTransform(self._affine_matrix)
          roi = cv2.transform(points, matrix).reshape((4, 2))
          logger.trace("Returning: %s", roi)
          return roi
  
      @property
      def affine_matrix(self):
          """ :class: `numpy.ndarray`: The affine matrix to transpose the mask to a full frame. """
 
</s> remove     def affine_matrix(self):
 </s> add     def affine_matrix(self) -> np.ndarray: </s> remove     def original_roi(self):
 </s> add     def original_roi(self) -> np.ndarray: </s> remove     def interpolator(self):
 </s> add     def interpolator(self) -> int: </s> remove             landmark = aligned.landmarks[landmark_index]  # pylint:disable=unsubscriptable-object
 </s> add             landmark = aligned.landmarks[landmark_index]
        logger.trace("Returning: %s", roi)  # type: ignore
                             [self.stored_size - 1, self.stored_size - 1],
                             [self.stored_size - 1, 0]], np.int32).reshape((-1, 1, 2))
          matrix = cv2.invertAffineTransform(self._affine_matrix)
          roi = cv2.transform(points, matrix).reshape((4, 2))
        logger.trace("Returning: %s", roi)  # type: ignore
          return roi
  
      @property
      def affine_matrix(self):
          """ :class: `numpy.ndarray`: The affine matrix to transpose the mask to a full frame. """
keep keep keep keep replace keep keep keep keep keep
 lib.align updates:
  - alignments.py
    - Add typed dicts for imported alignments
    - Explicitly check for presence of thumb value in alignments dict
    - linting
  - detected_face.py
    - Typing
    - Linting
    - Legacy support for pre-aligned face
    - Update dependencies to new property names 
lib/align/detected_face.py