Mumbai Indians 129 for 8 (Krunal 47, Unadkat 2-19, Zampa 2-32, Christian 2-34) beat Rising Pune Supergiant 128 for 6 (Smith 51, Rahane 44, Johnson 3-26, Bumrah 2-26) by 1 run
Scorecard and ball-by-ball details
This was, barring a WWE-style rebirth, Rising Pune Supergiant's last ever IPL game. They made sure it went the distance, all the way to the last ball, despite keeping Mumbai Indians down to the lowest first-innings total in an IPL final.
Somehow, Pune managed to drag a chase of 130 to the last ball.
The first ever IPL final had come down to the last ball too. Then, nine years ago, Sohail Tanvir pulled L Balaji for a single to win it for Rajasthan Royals.
Now, Mitchell Johnson bowled to Daniel Christian with Pune needing four to win. Bowling from around the wicket, Johnson went full and straight. Christian whipped it away to the left of deep square leg. J Suchith, the substitute fielder, fumbled at the boundary, allowing a second run. That wouldn't do for Pune. They needed four to win, and three to tie.
The batsmen chased a desperate third with Suchith's throw almost already in Parthiv Patel's gloves. Once Parthiv collected it safely, only one result was possible. Mumbai Indians, playing their fourth final, wrapped up their third title, winning by one run.
Krunal Pandya was Mumbai's hero with the bat, his 38-ball 47 dragging them from 79 for 7 to an eventual 129 for 8, a total that would enable their bowlers to scrap all the way. Then, helped along by Pune's ODI-style top-order approach, those scrapping bowlers managed to make the required rate creep steadily upwards - with five overs to go, Pune were only two down but needed 47 from 30.
Given Mumbai's death bowling, this was definitely not over. Jasprit Bumrah took out MS Dhoni in the 17th over. Then Lasith Malinga and Bumrah again ensured Pune would only get two boundaries across the 18th and 19th. That left Steven Smith, batting on 51, and Manoj Tiwary 11 to get from the last over.
Despite taking a boundary off his first ball, they couldn't quite do it against Johnson.
Mumbai bat, Mumbai falter
Six of the nine previous IPL finals had been won by the team batting first. Perhaps that and how it was difficult to chase in Hyderabad was why Rohit Sharma went against his team's record this season of eight wins in 11 games while chasing. That too when they only had a 3-2 record while batting first.
Perhaps it had something to do with Mumbai's record against Pune: they had met three times this season, and Pune had won all three times, twice while batting first.
It seemed, right through Mumbai's innings, that they had some mental scars from all those defeats to Pune. A first-ball leave from Lendl Simmons set the tone for a cautious start on a slower-than-usual Hyderabad surface, with only seven coming off the first two overs, against Jaydev Unadkat's back-of-a-length cutters and Washington Sundar's flat, stump-to-stump offspin.
Then Unadkat dismissed both openers in the third over - a short ball cramping Parthiv Patel's attempt to pull, a slower ball clipping Simmons' leading edge and popping back for a diving return catch.
Mumbai never really recovered from there, despite Rohit Sharma smacking Lockie Ferguson for four fours in the sixth over. Adam Zampa removed Rohit and Kieron Pollard in the 11th over, and Mumbai were 65 for 5.
Krunal gives Mumbai a chance
Christian trapped Hardik Pandya lbw in the 14th, playing across the line, and Karn Sharma was run out in the next over, in most comical manner. Dropped by Christian diving to his left at slip, he ran out of his crease in a panic anyway. It seemed to sum up Mumbai's state of mind.
Krunal, though, seemed to be achieving some clarity of thought. For now, he was simply thinking of extending the innings as far as he could. It took until the 19th over for him to hit his first six, straight back over Unadkat's head. Then he swiped and slogged Christian for a four and a six in the last over, off which Pune scored 14. Still, their total was 14 short of the previous-lowest first-innings total in an IPL final.
That had come in 2009, when Deccan Chargers defended 143.
Rahane, Smith keep Mumbai in the game
No team had defended a total of 129 or below since the 2013 season. Mumbai, though, had the bowling to do it. Pune, meanwhile, adopted a keep-wickets-in-hand approach. With Rahul Tripathi lbw in the third over to Bumrah, Smith joined Ajinkya Rahane at the crease. Rahane could have fallen for 14, foxed by a Malinga slower ball, but Krunal failed to hold on to a fairly straightforward chance at short cover.
By the time he holed out to long-on in the 12th over, he had made 44 of 38, batting as he would in the longer forms of the game. Smith, playing in the same manner, was batting on 18 off 25 at that point. Given the slowness of the surface and the difficulty new batsmen would face in getting going straightaway, this seemed a questionable approach.
As it happened, Dhoni struggled initially, scoring only four off his first nine balls. With Karn Sharma and Krunal getting the ball to grip, and Malinga varying his pace, Pune batted out three boundary-free overs. With 30 balls remaining, they now needed 47.
End-overs experts squeeze out Pune
A half-controlled square-cut from Dhoni sped between backward point and short third man, and two balls later Smith reverse-swiped Krunal for six. Fourteen came off that over, and Rising Pune seemed to be back on track.
Bumrah and Malinga, though, still had three overs to bowl. Bumrah got Dhoni caught behind, denying him width for the cut, and closed out that over, the 17th, with two lbw appeals against Manoj Tiwary, the batsman unable to read his changes of pace and angle, coupled with a hint of reverse.
Smith managed to flick Malinga for four in the 18th, in between a string of unhittable yorkers, and launched Bumrah over long-off in the 19th, off the one ball in the over that was pitched short of the blockhole. When Tiwary shuffled across and whipped the first ball of the 20th over to the vacant square-leg boundary - Johnson had just lost an argument with Rohit to station a fielder there - the equation came down to 7 off 5.
Surely, that would do it. Johnson, though, hadn't had his say yet. Looking to hit him over extra-cover, Tiwary was undone by the slower ball, only managing to drag it round to long-on. Then Smith, having crossed over, timed an inside-out slice perfectly, but straight to sweeper cover.
With three balls left, Pune needed seven, with two new batsmen at the crease. Washington Sundar brought Christian on strike off the fourth ball, failing to make contact with a wide-ish yorker but managing to scamper a bye. Then Christian, slogging at another full slower one, was dropped by Hardik running forward from deep midwicket - he sprinted a second, and Pune needed four from the last ball.
The last ball of Rising Pune Supergiant's two years in the IPL. It wouldn't be the last ball they wanted.
Karthik Krishnaswamy is a senior sub-editor at ESPNcricinfo