```python
def gen_plan(state: BridgeState,
             a_start_x_offset: float, a_start_y_offset: float,
             a_end_x_offset:   float, a_end_y_offset:   float):
    
    import numpy as np

    # Build the bridge
    actions = []
    red_box = state.getFrame("big_red_block")
    target = state.getFrame("target_pose")
    dir = np.array([target.x_pos, target.y_pos]) - np.array([red_box.x_pos, red_box.y_pos])
    dir_normed = dir / np.linalg.norm(dir)

    # First push start
    offset_mag = max(red_box.size[:2]) * 3
    a_start_x = red_box.x_pos - dir_normed[0]*offset_mag + a_start_x_offset
    a_start_y = red_box.y_pos - dir_normed[1]*offset_mag + a_start_y_offset
    
    # First push end
    a_end_x = target.x_pos + a_end_x_offset
    a_end_y = target.x_pos + a_end_y_offset

    # First Push #
    actions.append(Action("push_motion", [a_start_x, a_start_y, a_end_x, a_end_y]))

    return actions

def gen_domain(initial_state: BridgeState):
    return {
        "a_start_x_offset": ContinuousSampler(-0.3, 0.3),
        "a_start_y_offset": ContinuousSampler(-0.3, 0.3),
        "a_end_x_offset":   ContinuousSampler(-0.3, 0.3),
        "a_end_y_offset":   ContinuousSampler(-0.3, 0.3),
    }
```
