Sergio Aguero scored an 89th-minute winner as Manchester City kept their Quadruple hopes alive by coming from 2-0 down to win 3-2 in an outstanding FA Cup tie at Championship side Swansea.
A Matt Grimes penalty and a superb goal from Bersant Celina had the Swans in command at the break, but Bernardo Silva put City back into the tie before a controversial penalty, which was taken by Aguero and went in off post and keeper, made it 2-2.
And with time running out Aguero — who looked offside — headed home Bernardo Silva’s cross to break Swansea hearts.
Visitors City started at a fast pace and Leroy Sane fired in a shot that keeper Kristoffer Nordfeldt saved, Riyad Mahrez heading wide from the rebound.
Sane and Mahrez were again at the heart of things soon afterwards, setting up Kyle Walker who was thwarted by a fine challenge from Daniel James.
But the home side responded, James involved but the move breaking down when Celina took on one defender too many.
Bernardo Silva sent in a shot that was well saved by Nordfeldt — but after 20 minutes the home side took a shock lead, Fabian Delph bringing down Connor Roberts and Grimes crashing home the penalty.
Grimes almost made a costly error moments later, his loose clearance snapped up by Mahrez, who freed Gabriel Jesus to provide a cross that just eluded Sane.
But he and Swansea were celebrating again when they doubled their lead in brilliant style after 29 minutes, the move beginning with keeper Nordfeldt.
From his pass, James advanced down the right and found Wayne Routledge in the centre, his ball out to the left taken on by former City player Celina, who bent his finish beyond Ederson.
Nordfeldt made another stop as Bernardo Silva tried to give City a foothold, and then Roberts scrambled the ball away from almost on the line after David Silva’s shot beat the keeper.
With half-time approaching, Aymeric Laporte betrayed City’s frustration with an optimistic long-range attempt that was easily blocked. And as the players made their way off for half-time it got worse for Laporte, booked for getting into a spat with Routledge.
Guardiola’s side almost had a way back in the opening moments of the second half, the ball ricocheting just wide off Jesus, before Celina sent a 25-yarder over the top.
Ilkay Gundogan’s strike was blocked by Cameron Carter-Vickers as City began to crank up the pressure, and the same defender headed away a David Silva cross seconds later.
City made a double change, Delph and Sane off, Raheem Sterling and Oleksandr Zinchenko on, and on the hour Swansea made a switch, bringing Joel Asoro on for Dyer.
Ederson came out of his area to intercept as James raced away looking to make it 3-0, and Pep Guardiola responding by bringing on Sergio Aguero for Mahrez.
And after 69 minutes they had hope, Bernardo Silva thumping a fine finish into the corner from the left of the box to make it 2-1.
Sterling shot over from Zinchenko’s pass, but with 12 minutes to go City were awarded a controversial penalty, Sterling adjudged to have been brought down by Carter-Vickers when the defender got a touch on the ball. Aguero’s kick hit the inside of the post and went in off Nordfeldt.
The Swansea keeper kept his side in it moments later, repelling a Jesus header and somehow blocking the follow-up from Aguero, beforen Osoro broke only to fire a disappointing effort wide.
Swansea brought on Cian Harries for Jay Fulton, but they could not hold on as Aguero directed an 88th-minute header away from Nordfeldt to settle an enthralling tie.