﻿Implement the gift wrapping (Jarvis march) convex hull algorithm in Python:
1. Input: a list of 2D points as (x, y) tuples.
2. Output: the convex hull vertices in counter-clockwise order.
3. Correctly handle collinear points: include all points on the hull boundary, not just the vertices.
4. Test with: (a) a simple convex polygon, (b) points with collinear edges, (c) all points collinear (degenerate case), (d) duplicate points.
