Hannibal (film)

Template:About
Template:Short description
Template:Use dmy dates

***Hannibal*** is a 2001 American psychological horror-thriller film directed by Ridley Scott, adapted from the 1999 novel by Thomas Harris. The sequel to the 1991 film *The Silence of the Lambs*, Anthony Hopkins reprises his role as the cannibalistic serial killer Hannibal Lecter. Julianne Moore co-stars as FBI Special Agent Clarice Starling, the role first held by Jodie Foster. Ray Liotta, Giancarlo Giannini, and Gary Oldman also star.

*Silence of the Lambs* director Jonathan Demme, screenwriter Ted Tally, and Foster all declined to be involved in the adaptation, finding the novel too lurid. Scott became attached after the success of *Gladiator* (2000), and signed on after reading the script pitched by Dino De Laurentiis, who produced *Manhunter* (1986), the first Lecter film. David Mamet and Steven Zaillian wrote the screenplay.

Set ten years after *The Silence of the Lambs*, *Hannibal* follows Starling's attempts to apprehend Lecter in Italy before his surviving victim, Mason Verger, captures him. *Hannibal* broke box office records in the United States, Australia, Canada and the United Kingdom in February 2001, but received mixed reviews.
Template:TOC limit

## Plot

A decade after tracking down serial killer Jame Gumb,Template:Efn FBI Special Agent Clarice Starling is blamed for a botched drug raid. She is contacted by Mason Verger, the only surviving victim of the cannibalistic serial killer Hannibal Lecter, who has been missing since escaping custody during the Gumb investigation. A wealthy child molester, Verger was paralyzed and disfigured by Lecter during a therapy session. He has been pursuing an elaborate scheme to capture, torture, and kill Lecter ever since. Using his wealth and political influence, Verger has Starling reassigned to Lecter's case, hoping her involvement will draw Lecter out.

After learning of Starling's disgrace, Lecter sends her a taunting letter. A perfume expert identifies a fragrance on the letter: skin cream with ingredients only available to a few shops in the world. She contacts the police departments of the cities where the shops are located, requesting surveillance tapes. In one city, Florence, Chief Inspector Rinaldo Pazzi is investigating the disappearance of a library curator. Pazzi questions Lecter, who is masquerading as Dr. Fell, the assistant curator and caretaker.

Recognizing Dr. Fell in the surveillance tape, Pazzi accesses the Violent Criminal Apprehension Program database of wanted fugitives. He learns of Verger's US$3 million personal bounty on Lecter. Seeking the bounty, Pazzi ignores Starling's warnings and attempts to capture Lecter alone. He recruits a pickpocket to obtain Lecter's fingerprint to show Verger as proof. The pickpocket, mortally wounded by Lecter, manages to get the print and gives it to Pazzi. Lecter baits Pazzi into an isolated room of the Palazzo Vecchio, ties him up, disembowels him, and hangs him from the balcony.

Verger bribes Justice Department official Paul Krendler to accuse Starling of withholding a note from Lecter, leading to her suspension. Lecter lures Starling to Union Station. Verger's men, having trailed Starling, capture and bring Lecter to Verger. Verger intends to feed Lecter alive to a herd of wild boars bred for this purpose. After her superiors refuse to act, Starling infiltrates Verger's estate. After neutralizing two guards and freeing Lecter, she is shot by a third guard. Lecter picks up an unconscious Starling just before the boars break through the doors. Verger orders his physician Cordell Doemling to shoot Lecter, but, at Lecter's suggestion, Cordell shoves his hated boss into the pen with Lecter offering to take the blame. Lecter carries Starling away and the boars eat Verger alive.

Lecter takes Starling to Krendler's secluded lake house and treats her wounds. When Krendler arrives, Lecter subdues and drugs him. Starling, disoriented by morphine and dressed in a cocktail dress, awakens to find Krendler seated at the table set for an elegant dinner. Weakened by the drugs, she watches in horror as Lecter removes part of Krendler's prefrontal cortex, sautés it, and feeds it to him. Starling tries to attack Lecter, but he overpowers and traps her. She handcuffs his wrist to hers. Hearing the police closing in, Lecter is about to sever her cuffed hand to escape and brings down the cleaver. Starling surrenders to the FBI with her hands intact. On a flight, Lecter prepares to eat a meal he has brought himself, his bandaged arm in a sling. Lecter shares cooked brain with the boy next to him, saying it is important "always to try new things".

## Cast

Template:Div col

* Anthony Hopkins as Dr. Hannibal Lecter / Dr. Fell
* Julianne Moore as FBI Agent Clarice Starling
* Gary Oldman as Mason VergerTemplate:Efn
* Ray Liotta as Paul Krendler
* Frankie R. Faison as Barney Matthews
* Giancarlo Giannini as Chief Inspector Rinaldo Pazzi
* Francesca Neri as Allegra Pazzi
* Željko Ivanek as Dr. Cordell Doemling
* David Andrews as FBI Agent Clint Pearsall
* Francis Guinan as FBI Assistant Director Noonan
* Robert Rietti as Sogliato
* Enrico Lo Verso as Gnocco
* Ivano Marescotti as Carlo Deogracias
* Fabrizio Gifuni as Fabrizio
* Marco Greco as Tommaso
* Hazelle Goodman as Evelda Drumgo
* Terry Serpico as Officer Bolton
* Boyd Kestner as FBI Agent Burke
* Peter Shaw as FBI Agent John Brigham
* James Opher as DEA Agent Eldridge
* Don McManus as Benny Holcombe
* Danielle de Niese as Beatrice in *Vide Cor Meum*
* Mark Margolis and Ajay Naidu as Perfume Experts

Template:Div col end

## Development

*The Silence of the Lambs*, based on the 1988 novel by Thomas Harris, was released in 1991 to critical and commercial success, winning five Academy Awards. Harris spent several years writing a sequel novel; *Silence of the Lambs* director Jonathan Demme expressed interest in developing a film adaptation when the novel was complete.

The film rights to the Lecter character were owned by producer couple Dino De Laurentiis and Martha De Laurentiis. After producing the first Lecter film, *Manhunter,* in 1986, they allowed Orion Pictures to produce *The Silence of Lambs* free without their involvement. When *The Silence of the Lambs* became a success, the couple became eager for a new Lecter novel they could adapt. After a lengthy wait, De Laurentiis received a call from Harris telling him he had finished the novel and De Laurentiis purchased the rights for a record $10 million.

In April 1999, *Los Angeles Times* reported that the budget for an adaptation of *Hannibal* could cost as much as $100 million. It speculated that both Jodie Foster and Anthony Hopkins would receive $15 million each to reprise their roles and that Demme would receive $5 million to $19 million. Mort Janklow, Harris's agent at the time, told the *Los Angeles Times* that Foster, Hopkins, and Demme would soon receive manuscripts of the novel, claiming it would make an unbelievable film. The novel sold out of its initial 1.6 million print run in the 1999, and went on to sell millions of copies.

Demme declined the invitation to direct, as he reportedly found the material lurid and too gory. In the 2010 Biography Channel documentary *Inside Story: The Silence of the Lambs*, Demme said: "Tom Harris, as unpredictable as ever, took Clarice and Dr. Lecter's relationship in a direction that just didn't compute for me. And Clarice is drugged up, and she's eating brains with him, and I just thought, 'I can't do this.'" De Laurentiis said of Demme's decision to decline: "When the pope dies, we create a new pope. Good luck to Jonathan Demme. Good-bye." He later said that Demme felt he could not make a sequel as good as *The Silence of the Lambs*.

### Ridley Scott

De Laurentiis visited Ridley Scott on the set of *Gladiator* and suggested he read *Hannibal*. Scott was in the third week before principal photography was due to finish on *Gladiator*. *Gladiator* became a commercial and critical success, earning 12 Academy Award nominations. De Laurentiis asked Scott if he would like to direct *Hannibal*. Scott thought De Laurentiis was speaking of the Carthaginian general who nearly brought down the Roman Empire around 200 B.C., and replied: "Dino, I'm doing a Roman epic right now. I don't wanna do elephants coming over the Alps next, old boy."

Scott read the manuscript in four sittings within a week, seeing it as a "symphony", and expressed his desire to direct. Scott said: "I haven't read anything so fast since *The Godfather*. It was so rich in all kinds of ways." Scott had reservations with the ending of the novel, in which Lecter and Starling become lovers: "I couldn't take that quantum leap emotionally on behalf of Starling. Certainly, on behalf of Hannibal—I'm sure that's been in the back of his mind for a number of years. But for Starling, no. I think one of the attractions about Starling to Hannibal is what a straight arrow she is." He also did not find the book believable after the opera scene, "which became like a vampire movie". Harris gave Scott permission to change the ending.

### Writing

Ted Tally, screenwriter for *The Silence of the Lambs*, was another key member of the *Silence of the Lambs* team to decline involvement. Tally, like Demme, had problems with the novel's "excesses". David Mamet was the first screenwriter to produce a draft, which, according to Scott and the producers, needed major revisions. Stacey Snider, co-chairman of Universal Pictures, said: "There's no way David was going to read 15 pages of our notes and then be available to work on the script day-to-day." A script review at ScreenwritersUtopia.com describes the Mamet draft as "stunningly bad" but found Zaillian's rewrite "gripping entertainment". Scott praised Mamet as fast and efficient, but said he passed on his draft because it needed work and he feared Mamet, who was soon directing his own film, would be too busy to redraft it.

Steven Zaillian, writer of *Schindler's List*, initially declined to write *Hannibal*, saying he was busy and that "you can almost never win when you do a sequel". He changed his mind, as "it's hard to say no to Dino once and it's almost impossible to say no to him twice". Scott said there were "very few rewrites once I brought in Steve Zaillian ... If you were to ask who were the best three screenwriters in the business, Steve Zaillian would be one of them. We discussed *Hannibal* endlessly." One of Zaillian's key objectives was to revise Mamet's script until it pleased all parties, meaning that the "love story" would be told by suggestion instead of by "assault". Scott worked through the script with Zaillian for 28 days, making him "sweat through it with him and discuss every inch of the way with him". After 25 days, Scott suddenly realized that Zaillian was "exorcising the 600 pages of the book. He was distilling through discussion what he was gonna finally do ... Frankly I could have just made it."

### Casting

It was unclear if Jodie Foster (Clarice Starling) and Anthony Hopkins (Hannibal Lecter) would reprise their respective roles for which they won Academy Awards in *The Silence of the Lambs* (Best Actress/Best Actor). It became apparent that the producers and the studio could do without one of the original "stars" and would go on to find a replacement. The withdrawal of both Foster and Hopkins could possibly have been terminal for the project, however. De Laurentiis confirmed this after the film's release: "First and foremost, I knew we had no movie without Anthony Hopkins."

#### Involvement of Jodie Foster

Foster told Larry King in 1997 that she "would definitely be part of" a sequel to *The Silence of the Lambs*. In the same year, she told *Entertainment Weekly:* "Anthony Hopkins always talks about it. I mean, everybody wants to do it. Every time I see him, it's like: 'When is it going to happen? When is it going to happen?'" De Laurentiis thought Foster would decline once she read the book, and believed the final film was better for it. Hopkins also had doubts Foster would be involved, saying he had a "hunch" she would not be.

Foster confirmed that she had turned down the film in December 1999. This caused problems for Universal and partner MGM. "The studio is just back from the holiday and is regrouping based on the news, and has no cohesive game plan at the moment," said Kevin Misher, Universal's President of Production. Misher added that, "It was one of those moments when you sit down and think, 'Can Clarice be looked upon as James Bond for instance? A character who is replaceable?' Or was Jodie Foster Clarice Starling, and the audience will not accept anyone else?" Foster said in December 1999 that the characterization of Starling in *Hannibal* had "negative attributes" and "betrayed" the original character.

Foster's spokeswoman said she declined because Claire Danes had become available for Foster's film *Flora Plum*. *Entertainment Weekly* described the *Hannibal* project as having become "a bloody mess, hemorrhaging talent and money" despite Hopkins being on board. In 2005, after the film had been released, Foster told *Total Film*: "The official reason I didn't do *Hannibal* is I was doing another movie, *Flora Plum*. So I get to say, in a nice dignified way, that I wasn't available when that movie was being shot ... Clarice meant so much to Jonathan and I, she really did, and I know it sounds kind of strange to say but there was no way that either of us could really trample on her."

#### Julianne Moore as Clarice Starling

When it became clear that Foster would skip *Hannibal*, the production team considered several different actresses, including Cate Blanchett, Angelina Jolie, Gillian Anderson, Hilary Swank, Ashley Judd, Helen Hunt and Julianne Moore. Hopkins asked his agent if he had any "power" over casting. He informed De Laurentiis that he knew Moore, with whom he had worked on *Surviving Picasso*, and thought her a "terrific actress". Although Hopkins' agent told him he had no contractual influence on casting, Scott thought it correct to discuss who would be Hopkins' "leading lady". Scott said he was "really surprised to find that [he] had five of the top actresses in Hollywood wanting it."

Scott said his decision was swayed in favor of Moore: "She is a true chameleon. She can be a lunatic in *Magnolia*, a vamp in *An Ideal Husband*, a porn star in *Boogie Nights* and a romantic in *The End of the Affair*." "Julianne Moore, once Jodie decided to pass, was always top of my list," said Scott on his female lead. Moore talked about stepping into a role made famous by another actress: "The new Clarice would be very different. Of course people are going to compare my interpretation with that of Jodie Foster's ... but this film is going to be very different."

#### Anthony Hopkins as Hannibal Lecter

 File:London Film Museum - Hannibal (5755433470).jpg
Hopkins was generally expected to reprise his Academy Award-winning role. Hopkins said in June 1999 that he would only be interested if the script was "really good". Hopkins said he could not make up his mind to commit: "I was kind of surprised by this book, *Hannibal*. I thought it was really overreaching and so bizarre. So I couldn't make up my mind about it all. Some of it I found intriguing, some I was a little doubtful about." When the producers confirmed that they were going to film Harris' novel, Hopkins told them yes, but added: "It needs some condensing." *The Hollywood Reporter* confirmed that Hopkins had agreed to reprise his role in late December 1999, saying he had approved the latest draft of the script.

Hopkins said he had no difficulty moving back into "Lecter's mind". "I just learned the lines and showed up and walked around as Hannibal Lecter. I thought, 'Do I repeat that same performance, or do I vary it?' Ten years had passed so I changed a bit." In the book, Lecter uses bandages to disguise himself as a plastic surgery patient. This was left out of the film because Scott and Hopkins agreed to leave the face alone. Hopkins said: "It's as if he's making a statement—'catch me if you can'. With his big hat, he's so obvious that nobody thinks he's Hannibal Lecter. I've always thought he's a very elegant man, a Renaissance man." In the film, Lecter is first seen in Florence "as the classical Lecter, lecturing and being smooth", according to Hopkins. When the film moves to the U.S., Hopkins changed his appearance by building up muscle and cropping his hair short "to make him like a mercenary, that he would be so fit and so strong that he could just snap somebody in two if they got ... in his way".

#### Gary Oldman as Mason Verger

The part of Mason Verger, one of Lecter's two surviving victims, was originally offered to Christopher Reeve based on his work as a police officer who uses a wheelchair in *Above Suspicion* (1995). Not having read the novel, Reeve showed initial interest in the role, but ultimately declined upon realizing that Verger was a quadriplegic, facially-disfigured child rapist. The part was later accepted by secondary choice Gary Oldman. Co-producer Martha De Laurentiis claimed they had a "funny situation" with Oldman wanting a prominent "credit". She said: "Now how can you have a prominent credit with *Hannibal*? The characters are Hannibal and Clarice Starling. So we really couldn't work something out (at first)." Oldman was apparently "out" of the film for a while, but then came back in, asking to go "unbilled". Oldman would become transformed and "unrecognizable as himself" to play the part of Verger. He would have no lips, cheeks or eyelids. Make-up artist Greg Cannom said: "It's really disgusting ... I've been showing people pictures [of Oldman as Verger], and they all just say 'Oh my God,' and walk away, which makes me very happy." Oldman said that having his name completely removed from the billing and credits allowed him to "do it anonymously" under the heavy make-up. In home-release versions of the film, Oldman's name is included in the closing credits.

#### Further casting

Other stars subsequently cast included Ray Liotta as U.S. Justice Department official Paul Krendler (the character had appeared in *The Silence of the Lambs*, but original actor Ron Vawter had died in the interim) and Italian actor Giancarlo Giannini as Detective Rinaldo Pazzi. Francesca Neri played Pazzi's wife, Allegra. Frankie Faison reprised his role as orderly Barney Matthews, remaining the only actor to play a role in all Hannibal feature films (until *Hannibal Rising* in 2007), including *Manhunter*.

### Key production crew

Scott recruited key production crew whom he had worked with previously. Production designer Norris Spencer had worked on *Thelma & Louise*, *Black Rain* and *1492: Conquest of Paradise*. Cinematographer John Mathieson, editor Pietro Scalia and composer Hans Zimmer had all worked on Scott's previous film *Gladiator*.

## Production

### Background

*Hannibal* was filmed in 83 working days over 16 weeks. The film began production on 8 May 2000 in Florence. The film visited key locations in Florence and various locations around the United States. Martha De Laurentiis said the film has almost a hundred locations and that it was a "constant pain of moving and dressing sets. But the locations were beautiful. Who could complain about being allowed to shoot in Palazzo Vecchio in Florence? Or President James Madison's farm in Montpelier or the amazing Biltmore Estate in Asheville?" Eighty million dollars and a year and a half in production were spent before Scott got his first look at *Hannibal* in the editing room.

### Filming locations

* The whole second act of *Hannibal* takes place in Florence. Ridley Scott had never filmed there before, but described it as "quite an experience ... It was kind of organized chaos ... We were there at the height of tourist season." Within Florence, the production would visit various locations such as the Palazzo Capponi (as Dr. Fell's workplace), the Ponte Vecchio, the Palazzo Vecchio, the Pharmacy of Santa Maria Novella and the Cathedral.
* After leaving Italy on 5 June 2000, the production moved to Washington, D.C. Filming took place over six days at Union Station. The unusual sight of a carousel would appear in the transportation hub and shopping plaza at Ridley Scott's request.
* Filming would last for seven weeks in Richmond, Virginia for the shootout in a crowded fish market (shot at Richmond Farmer's Market) early in the film. Julianne Moore underwent Federal Bureau of Investigation training at the Bureau's headquarters before filming.
* A barn in Orange, Virginia, situated on the estate of President James Madison, was used to house 15 "performing hogs". The 15 Russian boars used in the shoot were from a selection of around 6,000 that the animal wranglers observed.
* Biltmore Estate in Asheville, North Carolina, the biggest privately owned estate in the U.S., was chosen to signify the huge personal wealth of Mason Verger.

### Special make-up effects

Make-up artist Greg Cannom was pleased to be involved in *Hannibal* as it offered him the chance to produce "incredible and original make-ups". For Mason Verger, the make-up team would initially produce 20 different heads which looked like zombies and did not reflect the vision Scott had of the character; Scott wanted Verger to look real with hideous scarring, and not something from the "House of Wax". Scott himself would actually call up the help of expert doctors in an effort to get the look of the character as realistic as possible. Scott showed the make-up team pictures of foetal things, which he thought touching; he wanted to make Mason Verger more touching than monstrous, as he thought of Verger as being someone who hadn't lost his sense of humour ... almost sympathetic. Oldman would spend six hours a day in make-up to prepare for the role.

For one of the film's final and infamous scenes, an exact duplicate was created of the character Paul Krendler, played by Ray Liotta, a scene which blended make-up, puppet work and CGI in a way which Scott called "seamless".

### Title sequence

The main titles were designed by Nick Livesey, a graduate of the Royal College of Art who worked for one of Scott's production companies in London. The sequence, shot in Florence by Livesey himself was intended as the film's second promotional trailer. The studio thought it not "quite right", but it remained on Scott's mind and would eventually end up as the main title sequence. Livesey would gather footage of pigeons in an empty square in Florence early one morning which, in the final cut, would morph into the face of Hannibal Lecter. Scott believed it a good idea, as it fundamentally asked the question: 'Where is Hannibal Lecter?' Scott explains: "And of course this story tells it, with pigeons in the cobblestones of somewhere, where you wonder where that is ... and there he is... his face appears." The titles are said to have been influenced by the film *Seven*.

## Music

Ridley Scott worked very closely with composer Hans Zimmer, during post-production on *Hannibal*. Scott believes the music to a film is as important as dialogue—"It is the final adjustment to the screenplay, being able to also adjust the performance of the actors in fact." Zimmer and Scott sat in during the editing process with editor Pietro Scalia to discuss scenes in the film and "not music". Zimmer used a symphony orchestra for the opera sequence, but would mostly use what he described as a "very odd orchestra ... only cellos and basses all playing at the extreme ends of their range." This was done to emphasise the character of Lecter. He explains: "Anthony's character is for me somebody at the extreme range of whatever is humanly imaginable somehow." Zimmer also did not want the score to sound like a "modern day orchestra".

The character Mason Verger had his own theme, which become more "perverted" as the film progressed, according to Zimmer. Dante's sonnet was put to music by Zimmer and Patrick Cassidy titled Vide cor Meum for the opera scene in Florence. Tracksounds.com wrote positively of Zimmer's score. "Zimmer truly crafts a score worthy of most fans' full attention ... the classical elements, and yes, even the monologue combine to make this an intense listening experience." In a poll by British Classic FM listeners to find the greatest film soundtrack of all time, *Hannibal* ranked at Template:Abbr 59. Strauss's *The Blue Danube* is also played at several points in the film.

## Themes

### Romance

Scott has said he believes the underlying emotion of *Hannibal* is "affection". "In some instances, you might even wonder or certainly from one direction—is it more than affection? It is dark, because the story is of course essentially dark, but it's kind of romantic at the same time." Scott openly admits to a "romantic thematic" running through the film. He told CNN that: "*Hannibal* was quite a different target, essentially a study between two individuals. Funny enough, it's rather romantic and also quite humorous, but also there's some quite bad behaviour as well." During the opera scene in Florence, Lecter attends an operatic adaptation of one of Dante's sonnets, and meets with Detective Pazzi and his wife, Allegra. She asks Lecter, "Do you believe a man could become so obsessed by a woman after a single encounter?" Lecter replies: "Yes, I believe he could ... but would she see through the bars of his plight and ache for *him*?" This scene, in the film, is one which Scott claims most people "missed" the meaning of. It was in reference to Starling—to their encounter in *The Silence of the Lambs*. *The New York Times*, in its review of the film, said *Hannibal*, "toys" with the idea of "love that dare not speak its name".

Composer Hans Zimmer believed there were messages and subtext in each scene. He said, "I can score this movie truly as a Freudian archetypal beauty and the beast fairy tale, as a horror movie, as the most elegant piece, on corruption in the American police force, as the loneliest woman on earth, the beauty in renaissance ..." Zimmer ultimately believes it to be a dark love story, centering on two people who should never be together—a modern day *Romeo and Juliet*. During post-production, Scott, Zimmer and the editor passionately argued about the meaning of Starling's tear during a confrontation with Lecter. They could not agree if it was a tear of "anguish", "loneliness" or "disgust". Scott told the *New York Post* that, the affair of the heart between Lecter and Starling is metaphorical. *Rolling Stone* magazine said in their review, "Scott offers a sly parody of relationships—think 'When Hannibal met Sally'."

### Retribution and punishment

Scott has said he believed Lecter, in his own way, was "pure", whose motivation is the search for "retribution and punishment". "There is something very moral about Lecter in this film," said Scott in his audio commentary. "The behaviour of Hannibal is never insane—[I] didn't want to use that excuse. Is he insane? No, I think he's as sane as you or I. He just likes it." Scott did say, however, "In our normal terms, he's truly evil." Scott also brings up the notion of absolution in reference to Lecter towards the film's end. Verger has one overriding objective in life: to capture Lecter and subject him to a slow, painful death.

### Corruption

Part of the story involves the character Rinaldo Pazzi (Giancarlo Giannini), a Florentine policeman who learns "Dr. Fell"'s true identity and realizes that this knowledge could make him rich. His escalating abandonment of morality allows him to countenance and facilitate the death of a Romani pickpocket, egged on by the desire to have the best for his much younger wife. There is a moment in the film when Pazzi becomes corrupted, despite being what Scott describes as "very thoughtful".

## Release

### Marketing

The first trailer appeared in theaters and was made available via the official website in early May 2000, over nine months before the film's release. As the film had only just begun production, footage was used from *The Silence of the Lambs*. A second trailer, which featured footage from the new film, was released in late November 2000. In marketing the film, Hopkins' portrayal of Hannibal Lecter was chosen as the unique selling point of *Hannibal*. "Mr Hopkins is the draw here", said Elvis Mitchell in a 2001 *The New York Times* article. A poster released in the UK to promote *Hannibal*, featuring Lecter with a "skin mask" covering the right side of his face, was quickly removed from circulation as it was deemed "too shocking and disturbing for the public."

Upon its release, *Hannibal* was met with significant media attention, with the film's stars and director making several appearances on television, in newspapers and in magazines. In an article for CBS News, Jill Serjeant stated that "the long-awaited sequel to the grisly 1991 thriller *Silence of the Lambs* is cooking up the hottest Internet and media buzz since the 1999 *Star Wars* 'prequel'." Stars Anthony Hopkins and Julianne Moore made the covers of a number of magazines, including *Vanity Fair*, *Entertainment Weekly*, *Premiere* and *Empire*.

### Home media

*Hannibal* is available on VHS, as well as a one-disc and two-disc DVD. The two-disc DVD contains an array of special features including: commentary by director Ridley Scott, deleted and alternate scenes, five production featurettes and a "marketing gallery" which contains trailers, production stills and unused poster concepts. While the VHS version features the deleted scenes.

A special "steel-book" edition of *Hannibal* was released in 2007. There are no significant changes made to the DVD itself; only the package artwork was changed.

The film was originally released as part of *The Hannibal Lecter Collection* on Blu-ray in 2009. It was re-released as a stand-alone in 2011.

On February 6, 2019, it was announced that the film would be released on Ultra HD Blu-ray in April. The release includes a new 4K restoration supervised by cinematographer John Mathieson, as well as all special features on the previous two-disc DVD release.

## Reception

### Box office

*Hannibal* grossed $58 million (U.S.) in its opening weekend (from 3,230 screens). At the time (February 2001), this was the fourth-biggest debut ever with 1997's *The Lost World: Jurassic Park*, 1999's *Star Wars: Episode I – The Phantom Menace*, and 2000's *How the Grinch Stole Christmas* (the latter was released a couple months prior) grossed more in an opening weekend. It would outperform 2000's *Scream 3* as both the highest debut in February until the 2003 release of *Daredevil* and the highest debut for a horror film until September 2017 with the release of *It* and 1999's *The Sixth Sense* as the highest opening for a psychological thriller until October 2019 with the release of *Joker*, though it had remained as of 2012 and up until that point as the highest-grossing psychological thriller with the December 2010 release of *Black Swan* coming to a close second. It also outperformed *Scary Movie* as, when it was released, the highest-grossing R-rated film of all time until the November 2003 release of *The Matrix Revolutions*, and the biggest-opening box office for an R-rated film ever until the February 2004 release of *The Passion of the Christ* (the title for being highest opening for February and R-rated film would go to *Deadpool* by 2016). On October 2012, it was ranked 90th all time. Final domestic box office gross (U.S.) reached $165,092,268, with a worldwide gross of $351,692,268. The film spent three weeks at number one in the U.S. box office chart, and four weeks at number one in the UK, and was the year's third highest-grossing film in that country behind *Lara Croft: Tomb Raider* and *Harry Potter and the Philosopher's Stone*. In Italy, it grossed $4.6 million in its opening weekend, setting a record for a US release, beating *The Blair Witch Project*. It also set a record opening week in the Netherlands with $1.3 million in six days, beating *Independence Day* and had the second biggest opening in Spain with $4.1 million in 6 days. *Hannibal* was the tenth highest-grossing film of the year worldwide, in a year which also saw the blockbuster releases (a year which also had already established franchises such as *The Mummy Returns*, *Planet of the Apes* and *Jurassic Park III*, or would later become big franchises like *The Fast and the Furious*, *Shrek*, *Monsters, Inc.*, *Harry Potter and the Philosopher's Stone*, and *The Lord of the Rings: The Fellowship of the Ring*. *Hannibal* also made over $87,000,000 in U.S. video rentals following release in August 2001.

### Critical response

The reviews for *Hannibal* were mixed. On Rotten Tomatoes, the film holds an approval score of 40% based on 171 reviews, with an average rating of 5.1/10. The website's critical consensus reads, "While superbly acted and stylishly filmed, *Hannibal* lacks the character interaction between the two leads which made the first movie so engrossing." On Metacritic, the film has a rating of 57 out of 100 from 36 reviews. *Time* magazine wrote: "A banquet of creepy, gory or grotesque incidents is on display in *Hannibal*. But this superior sequel has romance in its dark heart." *Empire* magazine gave it two out of five stars, calling it "laughable to just plain boring, *Hannibal* is toothless to the end." David Thomson, writing in the British Film Institute magazine *Sight & Sound*, praised the film. "It works. It's smart, good-looking, sexy, fun ... dirty, naughty and knowing." Thomson does make clear, however, he is a great fan of director Ridley Scott's work. He adds: "It is, literally, that Hannibal Lecter has become such a household joke that he can't be dreadful again. It seems clear that Anthony Hopkins and Scott saw that, and planned accordingly. That's how the movie was saved." *Variety* magazine in its review said "*Hannibal* is not as good as *Lambs* ... ultimately more shallow and crass at its heart than its predecessor, *Hannibal* is nevertheless tantalizing, engrossing and occasionally startling."

A negative review in *The Guardian* claimed that what was wrong with the film was carried over from the book: "The result is an inflated, good-looking bore of a movie. *The Silence of the Lambs* was a marvelous thing. This, by contrast is barely okey-dokey." Roger Ebert gave the film a "Thumbs down" rating on the television program *At the Movies with Ebert & Roeper* and gave the film a 2.5 out of 4 stars rating in his print review, which he began with the following: "Ridley Scott's *Hannibal* is a carnival geek show. We must give it credit for the courage of its depravity; if it proves nothing else, it proves that if a man cutting off his face and feeding it to his dogs doesn't get the NC-17 rating for violence, nothing ever will."

## Differences from the novel

According to *Variety* magazine, the script for *Hannibal* was: "quite faithful to the Harris blueprint; fans of the tome may regret the perhaps necessary excision of some characters, most notably Mason Verger's muscle-bound macho sister Margot, as well as the considerable fascinating academic detail, but will basically feel the book has been respected (yes, even the climactic dinner party is served up almost intact, with the only surprise twists saved for its wake)." *Time Out* noted: "The weight-watchers script sensibly dispenses with several characters to serve a brew that's enjoyably spicy but low on substance. So much story is squeezed into 131 minutes that little time's left for analysis or characterization." Producer Dino De Laurentiis was asked why some characters, notably Jack Crawford, were left out of the film: "I think if you get a book which is 600 pages, you have to reduce it to a script of 100 pages. In two hours of film, you cannot possibly include all the characters. We set ourselves a limit, and cut characters which weren't so vital."

In the book, Mason Verger runs an orphanage, from which he calls children to verbally abuse as a substitute for his no longer being able to molest them. He also has a sister, Margot, whom he had raped when they were children and who is a lesbian. When she disclosed her sexual orientation to her family, their father disowned her. As she is sterile due to steroid abuse, Verger exerts some control over her by promising her a semen sample with which to impregnate her lover, who could then inherit the Verger fortune. At the book's end, Margot and Starling both help Lecter escape during a shootout between Starling and Verger's guards. Margot, at Lecter's advice, stimulates her brother to ejaculate with a rectally inserted cattle prod, and then kills him by ramming his pet moray eel down his throat.

The book's controversial ending has Lecter presenting Starling with the exhumed bones of her father, which he "brings to life" by hypnotizing Starling, allowing her to say goodbye. This forges an odd alliance between Starling and Lecter, culminating in their becoming lovers and escaping to Argentina. At the novel's end, Barney sees them at the Teatro Colón of Buenos Aires.

Also gone from the film are the flashbacks to Lecter's childhood, in which he sees his younger sister, Mischa, eaten by German deserters in 1944. These flashbacks formed the basis for the 2007 film *Hannibal Rising* (written concurrently with the 2006 novel of the same name) which portrays Lecter as a young man.

Hopkins was asked in an interview on the subject of whether or not he believed the idea of Starling and Lecter heading off into the sunset as lovers (as happens in the book). "Yes, I did. Other people found that preposterous. I suppose there's a moral issue there. I think it would have been a very interesting thing though. I think it would have been very interesting had she gone off, because I suspected that there was that romance, attachment there, that obsession with her. I guessed that a long time ago, at the last phone call to Clarice, at the end of *SotL*, she said, 'Dr. Lecter, Dr. Lecter ... '."

## Other media

### Prequels

The film was followed by two films which are prequels based on novels by Thomas Harris (although the novel of *Red Dragon* isn’t itself a prequel as it was written before Hannibal).

* *Red Dragon* (2002)
* *Hannibal Rising* (2007)

### In popular culture

In 2013, there was a news story from Italy where a gangster fed his rival alive to pigs. Many media stories compared this to a similar scene in *Hannibal*.

## See also

**Lua error: bad argument #2 to 'title.new' (unrecognized namespace name 'Portal').**

* "Vide Cor Meum"—the song from the opera in Florence

## References

1. ↑ *Hannibal* (18). *British Board of Film Classification* (1 February 2001).
2. ↑ http://lumiere.obs.coe.int/web/film\_info/?id=17252
3. ↑ http://www.afi.com/members/catalog/DetailView.aspx?s=&Movie=62035
4. ↑ http://www.tcm.com/tcmdb/title/451729/Hannibal/
5. ↑ 5.0 5.1 5.2 Hannibal (2001).
6. ↑ Cult Horror 'Hannibal' Just Dropped On Netflix (en).
7. ↑ Williams, Karl. Hannibal (2001). AllMovie.
8. ↑ "Taste of success", *The Independent*, 20 February 2001.
9. ↑ 9.0 9.1 Hannibal Reviews. *Metacritic*. CBS Interactive.
10. ↑ Collins, Jim (1992). *Film Theory Goes to the Movies*. London, England: Routledge, page 35. ISBN 978-0-415-90576-3.
11. ↑ 11.00 11.01 11.02 11.03 11.04 11.05 11.06 11.07 11.08 11.09 11.10 11.11 11.12 11.13 11.14 11.15 11.16 11.17 11.18 11.19 11.20 11.21 11.22 11.23 11.24 11.25 11.26 11.27 11.28 11.29 11.30 11.31 11.32 11.33 11.34 *Hannibal* DVD "Making of feature"
12. ↑ 12.00 12.01 12.02 12.03 12.04 12.05 12.06 12.07 12.08 12.09 12.10 12.11 Bernstein, Jill. "How Hannibal came to be made", *The Guardian*, 9 February 2001.
13. ↑ 13.0 13.1 13.2 13.3 "News articles", IMDB.
14. ↑ 14.0 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 Template:Cite magazine
15. ↑ 15.0 15.1 15.2 "Bloody 'Hannibal' lacks bite of 'Lambs'", CNN, 8 February 2001.
16. ↑ 16.0 16.1 Morris, Mark. "Pleased to eat you", *The Guardian*, 4 February 2001.
17. ↑ Flynn, Gillian. "Rebirth of Cruel", *Entertainment Weekly*, 11 October 2002.
18. ↑ https://www.youtube.com/watch?v=GomRnogIdHE
19. ↑ 19.0 19.1 19.2 Prigge, Steven (2004). *Movie Moguls Speak: Interview with top film producers*. McFarland. ISBN 978-0-7864-1929-6.
20. ↑ Stax. "Script Review: Hannibal", *ScreenwriterUtopia*.
21. ↑ 21.0 21.1 Travers, Peter. "Hannibal—Rolling Stone Review", *Rolling Stone*.
22. ↑ 22.0 22.1 22.2 Fierman, Daniel. "Killer Instinct", *Entertainment Weekly*, 17 March 2000.
23. ↑ 23.0 23.1 "Lambs 'in doubt' without Foster", *BBC*, 6 January 2000.
24. ↑ "Foster passes on Lambs sequel", *BBC*, 29 December 1999.
25. ↑ "The Total Film Interview: Jodie Foster", *Total Film*.
26. ↑ 26.0 26.1 26.2 26.3 26.4 26.5 26.6 26.7 Hannibal DVD "Ridley Scott commentary"
27. ↑ 27.0 27.1 Rob, Brian (2005). *Ridley Scott: Pocket Essential*. Pocket Essentials. ISBN 978-1-904048-47-3.
28. ↑ "Sir Anthony set for Lambs sequel", *BBC*, 21 December 1999.
29. ↑ 29.0 29.1 "Movie Interview: Anthony Hopkins", *BBC*.
30. ↑ 30.0 30.1 Rose, Charlie. "60 Minutes: Actors' Take On Ridley Scott", *CBS News*, 30 January 2001.
31. ↑ Llenden, Joseph (June 2003). "You Offered Me *What*?! Roles Rejected By Great Actors". *Total Film* (Future plc).
32. ↑ Johnson, Malcolm. "A Heroic Persona". *Hartford Courant*. 12 October 2004. Retrieved 22 July 2012.
33. ↑ IGN.com: Interview with Gary Oldman --[[ ----------------------------------

Lua module implementing the Template loop detected: Template:Webarchive template.

A merger of the functionality of three templates: Template:Wayback, Template:Webcite and Template:Cite archives

]]

--[[--------------------------< D E P E N D E N C I E S >------------------------------------------------------
]]

require('Module:No globals');
local getArgs = require ('Module:Arguments').getArgs;

--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]

local categories = {}; -- category names
local config = {}; -- global configuration settings
local digits = {}; -- for i18n; table that translates local-wiki digits to western digits
local err\_warn\_msgs = {}; -- error and warning messages
local excepted\_pages = {};
local month\_num = {}; -- for i18n; table that translates local-wiki month names to western digits
local prefixes = {}; -- service provider tail string prefixes
local services = {}; -- archive service provider data from
local s\_text = {}; -- table of static text strings used to build final rendering
local uncategorized\_namespaces = {}; -- list of namespaces that we should not categorize
local uncategorized\_subpages = {}; -- list of subpages that should not be categorized

--[[--------------------------< P A G E S C O P E I D E N T I F I E R S >----------------------------------
]]

local non\_western\_digits; -- boolean flag set true when data.digits.enable is true
local this\_page = mw.title.getCurrentTitle();

local track = {}; -- Associative array to hold tracking categories
local ulx = {}; -- Associative array to hold template data

--[[--------------------------< S U B S T I T U T E >----------------------------------------------------------

Populates numbered arguments in a message string using an argument table.

]]

local function substitute (msg, args)
 return args and mw.message.newRawMessage (msg, args):plain() or msg;
end

--[[--------------------------< tableLength >-----------------------

Given a 1-D table, return number of elements

]]

local function tableLength(T)
 local count = 0
 for \_ in pairs(T) do count = count + 1 end
 return count
end

--[=[-------------------------< M A K E \_ W I K I L I N K >----------------------------------------------------

Makes a wikilink; when both link and display text is provided, returns a wikilink in the form D; if only
link is provided, returns a wikilink in the form L; if neither are provided or link is omitted, returns an
empty string.

]=]

local function make\_wikilink (link, display, no\_link)
 if nil == no\_link then
 if link and ( *~= link) then*
 if display and ( *~= display) then*
 return table.concat ({'', display, ''});
 else
 return table.concat ({'', link, ''});
 end
 end
 return display or *; -- link not set so return the display text*

 else -- no\_link
 if display and ( *~= display) then -- if there is display text*
 return display; -- return that
 else
 return link or *; -- return the target article name or empty string*
 end
 end
end

--[[--------------------------< createTracking >-----------------------

Return data in track[] ie. tracking categories

]]

local function createTracking()
 if not excepted\_pages[this\_page.fullText] then -- namespace:title/fragment is allowed to be categorized (typically this module's / template's testcases page(s))
 if uncategorized\_namespaces[this\_page.nsText] then
 return *; -- this page not to be categorized so return empty string*
 end
 for \_,v in ipairs (uncategorized\_subpages) do -- cycle through page name patterns
 if this\_page.text:match (v) then -- test page name against each pattern
 return *; -- this subpage type not to be categorized so return empty string*
 end
 end
 end

 local out = {};
 if tableLength(track) > 0 then
 for key, \_ in pairs(track) do -- loop through table
 table.insert (out, make\_wikilink (key)); -- and convert category names to links
 end
 end
 return table.concat (out); -- concat into one big string; empty string if table is empty

end

--[[--------------------------< inlineError >-----------------------

Critical error. Render output completely in red. Add to tracking category.

This function called as the last thing before abandoning this module

]]

local function inlineError (msg, args)
 track[categories.error] = 1
 return table.concat ({
 'Error in ', -- open the error message span
 config.tname, -- insert the local language template name
 ' template: ',
 substitute (msg, args), -- insert the formatted error message
 '.', -- close the span
 createTracking() -- add the category
 })
end

--[[--------------------------< inlineRed >-----------------------

Render a text fragment in red, such as a warning as part of the final output.
Add tracking category.

 ]]

local function inlineRed(msg, trackmsg)
 if trackmsg == "warning" then
 track[categories.warning] = 1;
 elseif trackmsg == "error" then
 track[categories.error] = 1;
 end

 return '' .. msg .. ''
end

--[[--------------------------< base62 >-----------------------

Convert base-62 to base-10
Credit: https://de.wikipedia.org/wiki/Modul:Expr

]]

local function base62( value )
 local r = 1 -- default return value is input value is malformed

 if value:match ('%W') then -- value must only be in the set [0-9a-zA-Z]
 return; -- nil return when value contains extraneous characters
 end

 local n = #value -- number of characters in value
 local k = 1
 local c
 r = 0
 for i = n, 1, -1 do -- loop through all characters in value from ls digit to ms digit
 c = value:byte( i, i )
 if c >= 48 and c <= 57 then -- character is digit 0-9
 c = c - 48
 elseif c >= 65 and c <= 90 then -- character is ascii a-z
 c = c - 55
 else -- must be ascii A-Z
 c = c - 61
 end
 r = r + c \* k -- accumulate this base62 character's value
 k = k \* 62 -- bump for next
 end -- for i

 return r
end

--[[--------------------------< D E C O D E \_ D A T E >--------------------------------------------------------

Given a date string, return it in iso format along with an indicator of the date's format. Except that month names
must be recognizable as legitimate month names with proper capitalization, and that the date string must match one
of the recognized date formats, no error checking is done here; return nil else

]]

local function decode\_date (date\_str)
 local patterns = {
 ['dmy'] = {'^(%d%d?) +([^%s%d]+) +(%d%d%d%d)$', 'd', 'm', 'y'}, -- %a does not recognize unicode combining characters used by some languages
 ['mdy'] = {'^([^%s%d]+) (%d%d?), +(%d%d%d%d)$', 'm', 'd', 'y'},
 ['ymd'] = {'^(%d%d%d%d) +([^%s%d]+) (%d%d?)$', 'y', 'm', 'd'}, -- not mos compliant at en.wiki but may be acceptible at other wikis
 };

 local t = {};

 if non\_western\_digits then -- this wiki uses non-western digits?
 date\_str = mw.ustring.gsub (date\_str, '%d', digits); -- convert this wiki's non-western digits to western digits
 end

 if date\_str:match ('^%d%d%d%d%-%d%d%-%d%d$') then -- already an iso format date, return western digits form
 return date\_str, 'iso';
 end

 for k, v in pairs (patterns) do
 local c1, c2, c3 = mw.ustring.match (date\_str, patterns[k][1]); -- c1 .. c3 are captured but we don't know what they hold

 if c1 then -- set on match
 t = { -- translate unspecified captures to y, m, and d
 [patterns[k][2]] = c1, -- fill the table of captures with the captures
 [patterns[k][3]] = c2, -- take index names from src\_pattern table and assign sequential captures
 [patterns[k][4]] = c3,
 };
 if month\_num[t.m] then -- when month not already a number
 t.m = month\_num[t.m]; -- replace valid month name with a number
 else
 return nil, 'iso'; -- not a valid date form because month not valid
 end

 return mw.ustring.format ('%.4d-%.2d-%.2d', t.y, t.m, t.d), k; -- return date in iso format
 end
 end
 return nil, 'iso'; -- date could not be decoded; return nil and default iso date
end

--[[--------------------------< makeDate >-----------------------

Given year, month, day numbers, (zero-padded or not) return a full date in df format
where df may be one of:
 mdy, dmy, iso, ymd

on entry, year, month, day are presumed to be correct for the date that they represent; all are required

in this module, makeDate() is sometimes given an iso-format date in year:
 makeDate (2018-09-20, nil, nil, df)
this works because table.concat() sees only one table member

]]

local function makeDate (year, month, day, df)
 local format = {
 ['dmy'] = 'j F Y',
 ['mdy'] = 'F j, Y',
 ['ymd'] = 'Y F j',
 ['iso'] = 'Y-m-d',
 };

 local date = table.concat ({year, month, day}, '-'); -- assemble year-initial numeric-format date (zero padding not required here)

 if non\_western\_digits then -- this wiki uses non-western digits?
 date = mw.ustring.gsub (date, '%d', digits); -- convert this wiki's non-western digits to western digits
 end

 return mw.getContentLanguage():formatDate (format[df], date);
end

--[[--------------------------< I S \_ V A L I D \_ D A T E >----------------------------------------------------

Returns true if date is after 31 December 1899 (why is 1900 the min year? shouldn't the internet's date-of-birth
be min year?), not after today's date, and represents a valid date (29 February 2017 is not a valid date). Applies
Gregorian leapyear rules.

all arguments are required

]]

local function is\_valid\_date (year, month, day)
 local days\_in\_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 local month\_length;
 local y, m, d;
 local today = os.date ('\*t'); -- fetch a table of current date parts

 if not year or  *== year or not month or*  == month or not day or  *== day then*
 return false; -- something missing
 end

 y = tonumber (year);
 m = tonumber (month);
 d = tonumber (day);

 if 1900 > y or today.year < y or 1 > m or 12 < m then -- year and month are within bounds TODO: 1900?
 return false;
 end

 if (2==m) then -- if February
 month\_length = 28; -- then 28 days unless
 if (0==(y%4) and (0~=(y%100) or 0==(y%400))) then -- is a leap year?
 month\_length = 29; -- if leap year then 29 days in February
 end
 else
 month\_length=days\_in\_month[m];
 end

 if 1 > d or month\_length < d then -- day is within bounds
 return false;
 end
 -- here when date parts represent a valid date
 return os.time({['year']=y, ['month']=m, ['day']=d, ['hour']=0}) <= os.time(); -- date at midnight must be less than or equal to current date/time
end

--[[--------------------------< decodeWebciteDate >-----------------------

Given a URI-path to Webcite (eg. /67xHmVFWP) return the encoded date in df format

returns date string in df format - webcite date is a unix timestamp encoded as bae62
or the string 'query'

]]

local function decodeWebciteDate(path, df)

 local dt = {};
 local decode;

 dt = mw.text.split(path, "/")

 -- valid URL formats that are not base62

 -- http://www.webcitation.org/query?id=1138911916587475
 -- http://www.webcitation.org/query?url=http..&date=2012-06-01+21:40:03
 -- http://www.webcitation.org/1138911916587475
 -- http://www.webcitation.org/cache/73e53dd1f16cf8c5da298418d2a6e452870cf50e
 -- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e

 if dt[2]:find ('query', 1, true) or
 dt[2]:find ('cache', 1, true) or
 dt[2]:find ('getfile', 1, true) or
 tonumber(dt[2]) then
 return 'query';
 end

 decode = base62(dt[2]); -- base62 string -> exponential number
 if not decode then
 return nil; -- nil return when dt[2] contains characters not in %w
 end
 dt = os.date('\*t', string.format("%d", decode):sub(1,10)) -- exponential number -> text -> first 10 characters (a unix timestamp) -> a table of date parts

 decode = makeDate (dt.year, dt.month, dt.day, 'iso'); -- date comparisons are all done in iso format with western digits
 if non\_western\_digits then -- this wiki uses non-western digits?
 decode = mw.ustring.gsub (decode, '%d', digits); -- convert this wiki's non-western digits to western digits
 end

 return decode;
end

--[[--------------------------< decodeWaybackDate >-----------------------

Given a URI-path to Wayback (eg. /web/20160901010101/http://example.com )
or Library of Congress Web Archives (eg. /all/20160901010101/http://example.com)
or UK Government Web Archive (eg. /ukgwa/20160901010101/http://example.com or /tna/20160901010101/http://example.com)

return the formatted date eg. "September 1, 2016" in df format
Handle non-digits in snapshot ID such as "re\_" and "-" and "\*"

 valid date string in df format - wayback date is valid (including the text string 'index' when date is '/\*/')
 empty string - wayback date is malformed (less than 8 digits, not a valid date)
 nil - wayback date is '/save/' or otherwise not a number

 second return value is an appropriate 'message' may or may not be formatted

]]

local function decodeWaybackDate(path, df)

 local msg, snapdate;

 snapdate = path:gsub ('^/web/', *):gsub ('^/all/',* ):gsub ('^/ukgwa/', *):gsub ('^/tna/',* ):gsub ('^/', *); -- remove leading /web/, /all/, /ukgwa/, /tna/, or /*
 snapdate = snapdate:match ('^[^/]+'); -- get timestamp
 if snapdate == "\*" then -- eg. /web/\*/http.., etc.
 return 'index'; -- return indicator that this url has an index date
 end

 snapdate = snapdate:gsub ('%a%a\_%d?$', *):gsub ('%-',* ); -- from date, remove any trailing "re\_", dashes

 msg = *;*
 if snapdate:match ('%\*$') then -- a trailing '\*' causes calendar display at archive .org
 snapdate = snapdate:gsub ('%\*$', *); -- remove so not part of length calc later*
 msg = inlineRed (err\_warn\_msgs.ts\_cal, 'warning'); -- make a message
 end

 if not tonumber(snapdate) then
 return nil, 'ts\_nan'; -- return nil (fatal error flag) and message selector
 end

 local dlen = snapdate:len();
 if dlen < 8 then -- we need 8 digits TODO: but shouldn't this be testing for 14 digits?
 return *, inlineRed (err\_warn\_msgs.ts\_short, 'error'); -- return empty string and error message*
 end

 local year, month, day = snapdate:match ('(%d%d%d%d)(%d%d)(%d%d)'); -- no need for snapdatelong here

 if not is\_valid\_date (year, month, day) then
 return *, inlineRed (err\_warn\_msgs.ts\_date, 'error'); -- return empty string and error message*
 end

 snapdate = table.concat ({year, month, day}, '-'); -- date comparisons are all done in iso format
 if 14 == dlen then
 return snapdate, msg; -- return date with message if any
 else
 return snapdate, msg .. inlineRed (err\_warn\_msgs.ts\_len, 'warning'); -- return date with warning message(s)
 end
end

--[[--------------------------< decodeArchiveisDate >-----------------------

Given an Archive.is "long link" URI-path (e.g. /2016.08.28-144552/http://example.com)
return the date in df format (e.g. if df = dmy, return 28 August 2016)
Handles "." and "-" in snapshot date, so 2016.08.28-144552 is same as 20160828144552

 valid date string in df format - archive.is date is valid (including the text string 'short link' when url is the short form)
 empty string - wayback date is malformed (not a number, less than 8 digits, not a valid date)
 nil - wayback date is '/save/'

 second return value is an appropriate 'message' may or may not be formatted

]]

local function decodeArchiveisDate(path, df)
 local snapdate

 if path:match ('^/%w+$') then -- short form url path is '/' followed by some number of base 62 digits and nothing else
 return "short link" -- e.g. http://archive.is/hD1qz
 end

 snapdate = mw.text.split (path, '/')[2]:gsub('[%.%-]', *); -- get snapshot date, e.g. 2016.08.28-144552; remove periods and hyphens*

 local dlen = string.len(snapdate)
 if dlen < 8 then -- we need 8 digits TODO: but shouldn't this be testing for 14 digits?
 return *, inlineRed (err\_warn\_msgs.ts\_short, 'error'); -- return empty string and error message*
 end

 local year, month, day = snapdate:match ('(%d%d%d%d)(%d%d)(%d%d)'); -- no need for snapdatelong here

 if not is\_valid\_date (year, month, day) then
 return *, inlineRed (err\_warn\_msgs.ts\_date, 'error'); -- return empty string and error message*
 end

 snapdate = table.concat ({year, month, day}, '-'); -- date comparisons are all done in iso format
 if 14 == dlen then
 return snapdate; -- return date
 else
 return snapdate, inlineRed (err\_warn\_msgs.ts\_len, 'warning'); -- return date with warning message
 end
 end

--[[--------------------------< serviceName >-----------------------

Given a domain extracted by mw.uri.new() (eg. web.archive.org) set tail string and service ID

]]

local function serviceName(host, no\_link)
 local tracking;
 local index;

 host = host:lower():gsub ('^web%.(.+)', '%1'):gsub ('^www%.(.+)', '%1'); -- lowercase, remove web. and www. subdomains

 if services[host] then
 index = host;
 else
 for k, \_ in pairs (services) do
 if host:find ('%f[%a]'..k:gsub ('([%.%-])', '%%%1')) then
 index = k;
 break;
 end
 end
 end

 if index then
 local out = {*}; -- empty string in [1] so that concatenated result has leading single space*
 ulx.url1.service = services[index][4] or 'other';
 tracking = services[index][5] or categories.other;
 -- build tail string
 if false == services[index][1] then -- select prefix
 table.insert (out, prefixes.at);
 elseif true == services[index][1] then
 table.insert (out, prefixes.atthe);
 else
 table.insert (out, services[index][1]);
 end

 table.insert (out, make\_wikilink (services[index][2], services[index][3], no\_link)); -- add article wikilink
 if services[index][6] then -- add tail postfix if it exists
 table.insert (out, services[index][6]);
 end

 ulx.url1.tail = table.concat (out, ' '); -- put it all together; result has leading space character

 else -- here when unknown archive
 ulx.url1.service = 'other';
 tracking = categories.unknown;
 ulx.url1.tail = table.concat ({*, prefixes.at, host, inlineRed (err\_warn\_msgs.unknown\_url, error)}, ' ');*
 end

 track[tracking] = 1
end

--[[--------------------------< parseExtraArgs >-----------------------

Parse numbered arguments starting at 2, such as url2..url10, date2..date10, title2..title10
 For example: Template loop detected: Template:Webarchive
 Three url arguments not in numeric sequence (1..4..7).
 Function only processes arguments numbered 2 or greater (in this case 4 and 7)
 It creates numeric sequenced table entries like:
 urlx.url2.url = <argument value for url4>
 urlx.url3.url = <argument value for url7>
 Returns the number of URL arguments found numbered 2 or greater (in this case returns "2")

 ]]

local function parseExtraArgs(args)

 local i, j, argurl, argurl2, argdate, argtitle

 j = 2
 for i = 2, config.maxurls do
 argurl = "url" .. i
 if args[argurl] then
 argurl2 = "url" .. j
 ulx[argurl2] = {}
 ulx[argurl2]["url"] = args[argurl]
 argdate = "date" .. i
 if args[argdate] then
 ulx[argurl2]["date"] = args[argdate]
 else
 ulx[argurl2]["date"] = inlineRed (err\_warn\_msgs.date\_miss, 'warning');
 end

 argtitle = "title" .. i
 if args[argtitle] then
 ulx[argurl2]["title"] = args[argtitle]
 else
 ulx[argurl2]["title"] = nil
 end
 j = j + 1
 end
 end

 if j == 2 then
 return 0
 else
 return j - 2
 end
end

--[[--------------------------< comma >-----------------------

Given a date string, return "," if it's MDY

]]

local function comma(date)
 return (date and date:match ('%a+ +%d%d?(,) +%d%d%d%d')) or *;*
end

--[[--------------------------< createRendering >-----------------------

Return a rendering of the data in ulx[][]

]]

local function createRendering()

 local displayfield
 local out = {};

 local index\_date, msg = ulx.url1.date:match ('(index)(.\*)'); -- when ulx.url1.date extract 'index' text and message text (if there is a message)
 ulx.url1.date = ulx.url1.date:gsub ('index.\*', 'index'); -- remove message

 if 'none' == ulx.url1.format then -- For Template:Wayback, Template:Webcite
 table.insert (out, '['); -- open extlink markup
 table.insert (out, ulx.url1.url); -- add url

 if ulx.url1.title then
 table.insert (out, ' ') -- the required space
 table.insert (out, ulx.url1.title) -- the title
 table.insert (out, ']'); -- close extlink markup
 table.insert (out, ulx.url1.tail); -- tail text
 if ulx.url1.date then
 table.insert (out, ' ('); -- open date text; TODO: why the html entity? replace with regular space?
 table.insert (out, 'index' == ulx.url1.date and s\_text.archive or s\_text.archived); -- add text
 table.insert (out, ' '); -- insert a space
 table.insert (out, ulx.url1.date); -- add date
 table.insert (out, ')'); -- close date text
 end
 else -- no title
 if index\_date then -- when url date is 'index'
 table.insert (out, table.concat ({' ', s\_text.Archive\_index, ']'})); -- add the index link label
 table.insert (out, msg or *); -- add date mismatch message when url date is /\*/ and |date= has valid date*
 else
 table.insert (out, table.concat ({' ', s\_text.Archived, '] '})); -- add link label for url has timestamp date (will include mismatch message if there is one)
 end
 if ulx.url1.date then
 if 'index' ~= ulx.url1.date then
 table.insert (out, ulx.url1.date); -- add date when data is not 'index'
 end
 table.insert (out, comma(ulx.url1.date)); -- add ',' if date format is mdy
 table.insert (out, ulx.url1.tail); -- add tail text
 else -- no date
 table.insert (out, ulx.url1.tail); -- add tail text
 end
 end

 if 0 < ulx.url1.extraurls then -- For multiple archive URLs
 local tot = ulx.url1.extraurls + 1
 table.insert (out, '.') -- terminate first url
 table.insert (out, table.concat ({' ', s\_text.addlarchives, ': '})); -- add header text

 for i=2, tot do -- loop through the additionals
 local index = table.concat ({'url', i}); -- make an index
 displayfield = ulx[index]['title'] and 'title' or 'date'; -- choose display text
 table.insert (out, '['); -- open extlink markup
 table.insert (out, ulx[index]['url']); -- add the url
 table.insert (out, ' '); -- the required space
 table.insert (out, ulx[index][displayfield]); -- add the label
 table.insert (out, ']'); -- close extlink markup
 table.insert (out, i==tot and '.' or ', '); -- add terminator
 end
 end
 return table.concat (out); -- make a big string and done

 else -- For Template:Cite archives
 if 'addlarchives' == ulx.url1.format then -- Multiple archive services
 table.insert (out, table.concat ({s\_text.addlarchives, ': '})); -- add header text
 else -- Multiple pages from the same archive
 table.insert (out, table.concat ({s\_text.addlpages, ' '})); -- add header text
 table.insert (out, ulx.url1.date); -- add date to header text
 table.insert (out, ': '); -- close header text
 end

 local tot = ulx.url1.extraurls + 1;
 for i=1, tot do -- loop through the additionals
 local index = table.concat ({'url', i}); -- make an index
 table.insert (out, '['); -- open extlink markup
 table.insert (out, ulx[index]['url']); -- add url
 table.insert (out, ' '); -- add required space

 displayfield = ulx[index]['title'];
 if 'addlarchives' == ulx.url1.format then
 if not displayfield then
 displayfield = ulx[index]['date']
 end
 else -- must be addlpages
 if not displayfield then
 displayfield = table.concat ({s\_text.Page, ' ', i});
 end
 end
 table.insert (out, displayfield); -- add title, date, page label text
 table.insert (out, ']'); -- close extlink markup
 table.insert (out, (i==tot and '.' or ', ')); -- add terminator
 end
 return table.concat (out); -- make a big string and done
 end
end

--[[--------------------------< P A R A M E T E R \_ N A M E \_ X L A T E >--------------------------------------

for internaltionalization, translate local-language parameter names to their English equivalents

TODO: return error message if multiple aliases of the same canonical parameter name are found?

returns two tables:
 new\_args - holds canonical form parameters and their values either from translation or because the parameter was already in canonical form
 origin - maps canonical-form parameter names to their untranslated (local language) form for error messaging in the local language

unrecognized parameters are ignored

]]

local function parameter\_name\_xlate (args, params, enum\_params)
 local name; -- holds modifiable name of the parameter name during evaluation
 local enum; -- for enumerated parameters, holds the enumerator during evaluation
 local found = false; -- flag used to break out of nested for loops
 local new\_args = {}; -- a table that holds canonical and translated parameter k/v pairs
 local origin = {}; -- a table that maps original (local language) parameter names to their canonical name for local language error messaging
 local unnamed\_params; -- set true when unsupported positional parameters are detected

 for k, v in pairs (args) do -- loop through all of the arguments in the args table
 name = k; -- copy of original parameter name

 if 'string' == type (k) then
 if non\_western\_digits then -- true when non-western digits supported at this wiki
 name = mw.ustring.gsub (name, '%d', digits); -- convert this wiki's non-western digits to western digits
 end

 enum = name:match ('%d+$'); -- get parameter enumerator if it exists; nil else

 if not enum then -- no enumerator so looking for non-enumnerated parameters
 -- TODO: insert shortcut here? if params[name] then name holds the canonical parameter name; no need to search further
 for pname, aliases in pairs (params) do -- loop through each parameter the params table
 for \_, alias in ipairs (aliases) do -- loop through each alias in the parameter's aliases table
 if name == alias then
 new\_args[pname] = v; -- create a new entry in the new\_args table
 origin [pname] = k; -- create an entry to make canonical parameter name to original local language parameter name
 found = true; -- flag so that we can break out of these nested for loops
 break; -- no need to search the rest of the aliases table for name so go on to the next k, v pair
 end
 end

 if found then -- true when we found an alias that matched name
 found = false; -- reset the flag
 break; -- go do next args k/v pair
 end
 end
 else -- enumerated parameters
 name = name:gsub ('%d$', '#'); -- replace enumeration digits with place holder for table search
 -- TODO: insert shortcut here? if num\_params[name] then name holds the canonical parameter name; no need to search further
 for pname, aliases in pairs (enum\_params) do -- loop through each parameter the num\_params table
 for \_, alias in ipairs (aliases) do -- loop through each alias in the parameter's aliases table
 if name == alias then
 pname = pname:gsub ('#$', enum); -- replace the '#' place holder with the actual enumerator
 new\_args[pname] = v; -- create a new entry in the new\_args table
 origin [pname] = k; -- create an entry to make canonical parameter name to original local language parameter name
 found = true; -- flag so that we can break out of these nested for loops
 break; -- no need to search the rest of the aliases table for name so go on to the next k, v pair
 end
 end

 if found then -- true when we found an alias that matched name
 found = false; -- reset the flag
 break; -- go do next args k/v pair
 end
 end
 end
 else
 unnamed\_params = true; -- flag for unsupported positional parameters
 end
 end -- for k, v
 return new\_args, origin, unnamed\_params;
end

--[[--------------------------< W E B A R C H I V E >----------------------------------------------------------

template entry point

]]

local function webarchive(frame)
 local args = getArgs (frame);

 local data = mw.loadData (table.concat ({ -- make a data module name; sandbox or live
 'Module:Webarchive/data',
 frame:getTitle():find('sandbox', 1, true) and '/sandbox' or  *-- this instance is ./sandbox then append /sandbox*
 }));
 categories = data.categories; -- fill in the forward declarations
 config = data.config;
 if data.digits.enable then
 digits = data.digits; -- for i18n; table of digits in the local wiki's language
 non\_western\_digits = true; -- use\_non\_western\_digits
 end
 err\_warn\_msgs = data.err\_warn\_msgs;
 excepted\_pages = data.excepted\_pages;
 month\_num = data.month\_num; -- for i18n; table of month names in the local wiki's language
 prefixes = data.prefixes;
 services = data.services;
 s\_text = data.s\_text;
 uncategorized\_namespaces = data.uncategorized\_namespaces;
 uncategorized\_subpages = data.uncategorized\_subpages;

 local origin = {}; -- holds a map of English to local language parameter names used in the current template; not currently used
 local unnamed\_params; -- boolean set to true when template call has unnamed parameters
 args, origin, unnamed\_params = parameter\_name\_xlate (args, data.params, data.enum\_params); -- translate parameter names in args to English

 local date, format, msg, udate, uri, url;
 local ldf = 'iso'; -- when there is no |date= parameter, render url dates in iso format

 if args.url and args.url1 then -- URL argument (first)
 return inlineError (data.crit\_err\_msgs.conflicting, {origin.url, origin.url1});
 end

 url = args.url or args.url1;

 if not url then
 return inlineError (data.crit\_err\_msgs.empty);
 end
 -- these iabot bugs perportedly fixed; removing these causes lua script error
--[[ -- at Template:Webarchive/testcases/Production; resolve that before deleting these tests
 if mw.ustring.find( url, "https://web.http", 1, true ) then -- track bug - TODO: IAbot bug; not known if the bug has been fixed; deferred
 track[categories.error] = 1;
 return inlineError (data.crit\_err\_msgs.iabot1);
 end
 if url == "https://web.archive.org/http:/" then -- track bug - TODO: IAbot bug; not known if the bug has been fixed; deferred
 track[categories.error] = 1;
 return inlineError (data.crit\_err\_msgs.iabot2);
 end
]]

 if not (url:lower():find ('^http') or url:find ('^//')) then
 return inlineError (data.crit\_err\_msgs.invalid\_url );
 end

 ulx.url1 = {}
 ulx.url1.url = url

 ulx.url1.extraurls = parseExtraArgs(args)

 local good = false;
 good, uri = pcall (mw.uri.new, ulx.url1.url); -- get a table of uri parts from this url; protected mode to prevent lua error when ulx.url1.url is malformed

 if not good or nil == uri.host then -- abandon when ulx.url1.url is malformed
 return inlineError (data.crit\_err\_msgs.invalid\_url);
 end

 serviceName(uri.host, args.nolink)

 if args.date and args.date1 then -- Date argument
 return inlineError (data.crit\_err\_msgs.conflicting, {origin.date, origin.date1});
 end

 date = args.date or args.date1;
 date = date and date:gsub (' +', ' '); -- replace multiple spaces with a single space

 if date and config.verifydates then
 if '\*' == date then
 date = 'index';
 ldf = 'iso'; -- set to default format
 elseif 'mdy' == date then
 date = nil; -- if date extracted from URL,
 ldf = 'mdy'; -- then |date=mdy overrides iso
 elseif 'dmy' == date then
 date = nil; -- if date extracted from URL,
 ldf = 'dmy'; -- then |date=dmy overrides iso
 elseif 'ymd' == date then
 date = nil; -- if date extracted from URL,
 ldf = 'ymd'; -- then |date=ymd overrides iso
 else
 date, ldf = decode\_date (date); -- get an iso format date from date and get date's original format
 end
 end

 if 'wayback' == ulx.url1.service or 'locwebarchives' == ulx.url1.service or 'ukgwa' == ulx.url1.service then
 if date then
 if config.verifydates then
 if ldf then
 udate, msg = decodeWaybackDate (uri.path); -- get the url date in iso format and format of date in |date=; 'index' when wayback url date is \*
 if not udate then -- this is the only 'fatal' error return
 return inlineError (data.crit\_err\_msgs[msg]);
 end

 if udate ~= date then -- date comparison using iso format dates
 date = udate;
 msg = table.concat ({
 inlineRed (err\_warn\_msgs.mismatch, 'warning'), -- add warning message
 msg, -- add message if there is one
 });
 end
 end
 end
 else -- no |date=
 udate, msg = decodeWaybackDate (uri.path);

 if not udate then -- this is the only 'fatal' error return
 return inlineError (data.crit\_err\_msgs[msg]);
 end

 if  *== udate then*
 date = nil; -- unset
 else
 date = udate;
 end
 end

 elseif 'webcite' == ulx.url1.service then
 if date then
 if config.verifydates then
 if ldf then
 udate = decodeWebciteDate (uri.path); -- get the url date in iso format
 if 'query' ~= udate then -- skip if query
 if udate ~= date then -- date comparison using iso format dates
 date = udate;
 msg = table.concat ({
 inlineRed (err\_warn\_msgs.mismatch, 'warning'),
 });
 end
 end
 end
 end
 else
 date = decodeWebciteDate( uri.path, "iso" )
 if date == "query" then
 date = nil; -- unset
 msg = inlineRed (err\_warn\_msgs.date\_miss, 'warning');
 elseif not date then -- invalid base62 string
 date = inlineRed (err\_warn\_msgs.date1, 'error');
 end
 end

 elseif 'archiveis' == ulx.url1.service then
 if date then
 if config.verifydates then
 if ldf then
 udate, msg = decodeArchiveisDate (uri.path) -- get the url date in iso format
 if 'short link' ~= udate then -- skip if short link
 if udate ~= date then -- date comparison using iso format dates
 date = udate;
 msg = table.concat ({
 inlineRed (err\_warn\_msgs.mismatch, 'warning'), -- add warning message
 msg, -- add message if there is one
 });
 end
 end
 end
 end
 else -- no |date=
 udate, msg = decodeArchiveisDate( uri.path, "iso" )
 if udate == "short link" then
 date = nil; -- unset
 msg = inlineRed (err\_warn\_msgs.date\_miss, 'warning');
 elseif  *== udate then*
 date = nil; -- unset
 else
 date = udate;
 end
 end

 else -- some other service
 if not date then
 msg = inlineRed (err\_warn\_msgs.date\_miss, 'warning');
 end
 end

 if 'index' == date then
 ulx.url1.date = date .. (msg or *); -- create index + message (if there is one)*
 elseif date then
 ulx.url1.date = makeDate (date, nil, nil, ldf) .. (msg or *); -- create a date in the wiki's local language + message (if there is one)*
 else
 ulx.url1.date = msg;
 end

 format = args.format; -- Format argument

 if not format then
 format = "none"
 else
 for k, v in pairs (data.format\_vals) do -- |format= accepts two specific values loop through a table of those values
 local found; -- declare a nil flag
 for \_, p in ipairs (v) do -- loop through local language variants
 if format == p then -- when |format= value matches
 format = k; -- use name from table key
 found = true; -- declare found so that we can break out of outer for loop
 break; -- break out of inner for loop
 end
 end

 if found then
 break;
 end
 end

 if format == "addlpages" then
 if not ulx.url1.date then
 format = "none"
 end
 elseif format == "addlarchives" then
 format = "addlarchives"
 else
 format = "none"
 end
 end
 ulx.url1.format = format

 if args.title and args.title1 then -- Title argument
 return inlineError (data.crit\_err\_msgs.conflicting, {origin.title, origin.title1});
 end

 ulx.url1.title = args.title or args.title1;

 local rend = createRendering()
 if not rend then
 return inlineError (data.crit\_err\_msgs.unknown);
 end

 return rend .. ((unnamed\_params and inlineRed (err\_warn\_msgs.unnamed\_params, 'warning')) or *) .. createTracking();*

end

--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]

return {webarchive = webarchive};
34. ↑ 34.00 34.01 34.02 34.03 34.04 34.05 34.06 34.07 34.08 34.09 34.10 Official Hannibal production notes
35. ↑ 35.0 35.1 Official Hannibal Journal
36. ↑ Rose, Charlie. "60 Minutes: Ridley Scott", *CBS News*, 27 January 2001.
37. ↑ 37.0 37.1 Mitchell, Elvis. "FILM REVIEW; Whetting That Large Appetite for Second Helpings", *The New York Times*, 9 February 2001.
38. ↑ 38.0 38.1 Clarke, James (2002). *Virgin Film: Ridley Scott*. Virgin Books. ISBN 0-7535-0731-5.
39. ↑ Coleman, Christopher. "Goodie, Goodie!", *TrackSounds*.
40. ↑ "Top 100 movie soundtracks", *Classic FM*. [dead link]
41. ↑ "Hannibal News", *Counting Down*. 5800.
42. ↑ Wilson, Mark. "Lecter's bloody second course has a hollow centre", *The Independent*, 6 February 2001.
43. ↑ Elvis Mitchell. "*Hannibal* FILM REVIEW; Whetting That Large Appetite for Second Helpings", *The New York Times*, 9 February 2001.
44. ↑ *Hannibal* trivia on imdb.com. *IMDB*.
45. ↑ 45.0 45.1 Nick Sambides Jr.. "Taking A Bite Out Of *Hannibal*", cbsnews.com, 8 February 2001.
46. ↑ 46.0 46.1 Jill Serjeant. "Appetites Whet For Hannibal", *MMI Reuters Limited*, CBS News, 2 February 2001.
47. ↑ https://www.blu-ray.com/news/?id=24599
48. ↑ 48.0 48.1 48.2 "Box Office: Hannibal Takes Record-Sized Bite", *ABC News*, 11 February 2001.
49. ↑ "Box Office", *IMDB Pro*.
50. ↑ Template:Cite magazine
51. ↑ Template:Cite magazine
52. ↑ "Box-Office data for Hannibal", *Box Office Mojo*.
53. ↑ "US Video rentals", IMDB.
54. ↑ 54.0 54.1 54.2 54.3 Thomson, David. "The Riddler Has His Day", *Sight & Sound*.
55. ↑ Hannibal (2001). *Rotten Tomatoes*. Fandango Media.
56. ↑ 56.0 56.1 McCarthy, Todd. "Hannibal Review", *Variety*, 5 February 2001.
57. ↑ Brooks, Xan. "Hannibal Review", *The Guardian*, 16 February 2001.
58. ↑ Roger Ebert. "Hannibal", *Chicago Sun-Times*, 9 February 2001.
59. ↑ "Hannibal review", Time Out Film Guide.
60. ↑ Mattram, James. "Interview: Dino De Laurentiis", *BBC*.
61. ↑ "Interview with Anthony Hopkins", *IGN*.
62. ↑ Calder, Rich (29 November 2013). Mobster left to be eaten alive by pigs. NY Post.

## External links

Template:Wikiquote

* *Hannibal* at the Internet Movie Database
* Template:Tcmdb title
* Template:Allmovie title
* Template:Rotten-tomatoes
* Template:Metacritic film
* Template:Mojo title
* Unproduced script by David Mamet

Template:Hannibal
Template:Ridley Scott
Template:David Mamet
Template:Steven Zaillian
Template:Good article

Template:Authority control