Chris Froome moved another step closer to Tour de France victory by comfortably defending his lead on a mountainous 15th stage won by breakaway rider Jarlinson Pantano.
The 160km stage contained six categorised climbs and offered plenty of scope for gaps between the general classification contenders, but Froome had to fend off just two short-lived attacks - from Fabio Aru and Romain Bardet - on what turned out to be a routine day in the yellow jersey.
All of the favourites crossed the finish line in Culoz together, meaning Froome (Team Sky) remains 1min 47sec ahead of second-placed Bauke Mollema (Trek-Segafredo) at the top of the overall standings.
Adam Yates (Orica-BikeExchange) stays 2min 45sec back in third, while Nairo Quintana (Movistar) remains 2min 59sec adrift in fourth after another tepid display lacking in aggression.
Pantano (IAM Cycling), meanwhile, formed part of the day's original 28-man breakaway but was one of just two riders who survived to the finish and then beat Rafal Majka (Tinkoff) in a sprint for victory.
The Colombian said: "This is incredible. It's a dream come true. I came to the Tour de France for this, but I didn't believe it could happen. I'm very happy."
Stage 15 took place in the Jura Mountains, just east of Lyon, and had been dubbed the hardest day of this year's Tour.
But after the breakaway had been given a big enough lead to hang on to the finish, the peloton rolled sedately over the first five climbs and it wasn't until they reached the foot of the final ascent that Froome finally came under pressure.
Aru (Astana) accelerated at the bottom of the Lacets du Grand Colombier and was followed by Alejandro Valverde (Movistar), but both were swiftly reeled back in by Froome's relentless team-mate Wout Poels, who then snuffed out a subsequent move from Bardet (Ag2r-La Mondiale) close to the summit to reassert Team Sky's dominance in the mountains.
In the breakaway, meanwhile, Pantano started up the final climb alongside Majka but looked a beaten man when he was dropped half way up the 8.4km ascent.
However, he re-caught Majka on the descent into Culoz and then proved too fast in the sprint for the line.
The Tour continues on Monday with a 209km 16th stage from Moirans-en-Montagne to Berne. Find out more about the route in our race guide and follow the action with our live blog from 1pm BST.
Stage 15 result
1 Jarlinson Pantano (Col) IAM Cycling, 4:24:49
2 Rafal Majka (Pol) Tinkoff, same time
3 Alexis Vuillermoz (Fra) Ag2r-La Mondiale, +6sec
4 Sebastien Reichenbach (Sui) FDJ.fr, sat
5 Julian Alaphilippe (Fra) Etixx - Quick-Step, +22
6 Serge Pauwels (Bel) Dimension Data, +25
7 Pierre Rolland (Fra) Cannondale-Drapac, st
8 Ilnur Zakarin (Rus) Katusha, +1:30
9 Daniel Navarro (Esp) Cofidis, st
10 Tom-Jelte Slagter (Ned) Cannondale-Drapac, +2:08
General classification
1 Chris Froome (GB) Team Sky, 68:14:36
2 Bauke Mollema (Ned) Trek-Segafredo, +1:47
3 Adam Yates (GB) Orica-BikeExchange, +2:45
4 Nairo Quintana (Col) Movistar, +2:59
5 Alejandro Valverde (Esp) Movistar, +3:17
6 Romain Bardet (Fra) Ag2r-La Mondiale, +4:04
7 Richie Porte (Aus) BMC Racing, +4:27
8 Tejay van Garderen (USA) BMC Racing, +4:47
9 Dan Martin (Irl) Etixx - Quick-Step, +5:03
10 Fabio Aru (Ita) Astana, +5:16