def METHOD_NAME(self, provided_partition_key_ranges):
    """Gets the partition key ranges overlapping the provided ranges
    :param list provided_partition_key_ranges: List of partition key ranges.
    :return: List of partition key ranges, where each is a dict.
    :rtype: list
    """
    if isinstance(provided_partition_key_ranges, routing_range.Range):
        return self.METHOD_NAME([provided_partition_key_ranges])
    minToPartitionRange = {}
    sortedLow = [(r.min, not r.isMinInclusive) for r in self._orderedRanges]
    sortedHigh = [(r.max, r.isMaxInclusive) for r in self._orderedRanges]
    for providedRange in provided_partition_key_ranges:
        minIndex = bisect.bisect_right(sortedLow, (providedRange.min, not providedRange.isMinInclusive))
        if minIndex > 0:
            minIndex = minIndex - 1
        maxIndex = bisect.bisect_left(sortedHigh, (providedRange.max, providedRange.isMaxInclusive))
        if maxIndex >= len(sortedHigh):
            maxIndex = maxIndex - 1
        for i in range(minIndex, maxIndex + 1):
            if routing_range.Range.overlaps(self._orderedRanges[i], providedRange):
                minToPartitionRange[
                    self._orderedPartitionKeyRanges[i][PartitionKeyRange.MinInclusive]
                ] = self._orderedPartitionKeyRanges[i]
    overlapping_partition_key_ranges = list(minToPartitionRange.values())
    def getKey(r):
        return r[PartitionKeyRange.MinInclusive]
    overlapping_partition_key_ranges.sort(key=getKey)
    return overlapping_partition_key_ranges