text:
And social media's debate winner is…Tom Tugendhat! Tory MP makes audience laugh quoting Dumbledore
July 16, 2022 July 16, 2022 / International News / By Chairman
Channel 4 viewers have crowned Tom Tugendhat the winner of last night's Tory leadership debate after quoting Harry Potter's Albus Dumbledore before mistakenly thanking an NHS worker for given him his two children.
The MP Tonbridge and Malling, 49, impressed as the five remaining leadership hopefuls appeared for a first live television debate on Channel 4 in front of a studio audience.
The candidates were asked questions from members of the audience and host Krishnan Guru-Murthy on a variety of topics including the cost of living crisis and whether outgoing Prime Minister Boris Johnson is trustworthy.
Opening the debate, host Krishnan Guru-Murthy asked each individual Tory MP why the public should trust each of them.
When given an opportunity to answer, Mr Tugendhat cited a quote from the Hogwarts headmaster.
He said: 'It is easy to stand up your enemies, it is harder to stand up to your friends.'
He also praised the NHS for the impact it had on his comrades wounded in Iraq and Afghanistan, saying he was 'eternally grateful'.
'You've also given me two children', he said in response to a question on the health service from a woman in the audience, before hastily adding 'not you personally, of course'.
A snap poll conducted by strategic insight agency Opinium also confirmed Mr Tugendhat as the most impressive performer.
Of more than 1,000 normal voters polled, 36 per cent believed he had 'performed best' in the debate.
The MP Tonbridge and Malling, 49, impressed during Friday evening's first live debate on Channel 4
Krishnan Guru-Murthy hosted the debate with the candidates who are in the running to become the next Prime Minister
Leadership contender Mr Tugendhat with his wife Anissia Tugendhat arriving at Here East studios in Stratford, east London, on Friday
Mr Tugendhat also drew applause from the audience as Boris Johnson's time in office overshadowed the beginning of the debate.
The candidates were asked if the outgoing Prime Minister is an honest man.
Mr Tugendhat, a long-time critic of Mr Johnson, was the only candidate to swiftly reply 'no'.
He spoke while acknowledging 'trust in politics has been collapsing, trust in our party has been collapsing', and added: 'I've been holding a mirror to many of our actions and asking those in our party, those in our leadership positions, to ask themselves "is that what the public really expects?"
'Are you serving the people of the United Kingdom or are you serving your career? Because that's the real question tonight. That's the real question for all of us.'
Asked about Mr Johnson, former Equalities Minister Kemi Badenoch was the first to reply, simply answering: 'Sometimes.'
Ms Mordaunt then added: 'There have been some really severe issues and I think he has paid a price for that.'
Former Chancellor Mr Sunak, who resignation with ex-Health Secretary Sajid Javid sparked Mr Johnson's downfall, said there were a 'number of reasons' why he had left his role.
Viewers took to social media to praise the Mr Tugendhat, crowning his performance as the most impressive following the live debate.
One said: 'The farce of this Tory leadership debate is that Tugenhadt is smashing it, yet he will be more unpopular amongst MPs for being brutally honest.'
Another added: 'Tom Tugendhat is coming across very well. Put together, not engaging in catty arguments. Pains me to say it, but he's quite likeable.'
A third said: 'Just watched 90 minutes of paint drying. Tom Tugendhat won that entire debate with a quick shake of the head.'
A fourth tweeted: 'Tom Tugendhat absolutely destroying the rest of the field this evening.
'An honest, admirable man whilst quoting Albus Dumbledore and ridiculing Boris Johnson. And he's my MP. Excellent viewing.'
Mr Sunak defended his record in No 11, saying: 'I don't think the responsible thing to do right now is launch into some unfunded spree of borrowing and more debt'
His comments came after Ms Truss went on the attack towards the former Chancellor during the debate
Ms Mordaunt also faced tough questioning from her rivals over her attitude towards women's rights and transgender people
Former Equalities Minister Ms Badenoch pictured during the live television debate on Channel 4 on Friday evening
The former Army officer has suggested military planners could help tackle the backlog because "we are looking to drive leadership and efficiency into processes, we are looking to create order out of what is sometimes a confusing situation".
He also pointed to his 'track record of leadership in a final pitch to viewers on why he should be the next Tory leader and Prime Minister.
He told the debate: 'The country is going through a crisis at home and challenges abroad. What we're seeing around the world is we're seeing division and disunity and we can pull people together.
'What we can do is we can turn this around. Now I have a track record of leadership: I have led on operations and I have led in Parliament and now I would like to lead the United Kingdom.'
It came after viewers had earlier poked fun at his Dumbledore reference and were quick to take to social media to highlight his wizard-related response.
One viewer said: 'Who else noticed Tom Tugendhat quoting Álbus Dumbledore? It's easy to stand up to your enemies, but much harder to stand up to your friends.. 50 house points to Gryffindor! Lol'
Another added: 'Well who had "Quoting Dumbledore" on the Conservative leadership debate bingo card?'
Mr Sunak pictured as he arrived at Here East studios in Stratford, east London, for the TV debate
A third said: 'Didn't think dumbledore would be a script writer for team #Tugendhat going to be an Interesting #C4LeaderDebate.'
Mr Tugendhat also said that as Prime Minister he would deliver a global 'energy resilience plan' so that Britain does not lose out by reducing 'dirty coal' from its industries.
He added: 'What I've spoken about is things like carbon offshore pricing, to make sure that what we don't do is cut carbon emissions here in the UK and see jobs go to China.
'What we don't want to see is the punishment of British workers for higher standards, steel industries closing down because other people use dirty coal and we're not allowed to.
'What we need to make sure is that we set rules, we don't allow others to undercut them with cheaper prices.
'What we need to make sure is that we maintain standards everywhere, because around the world the carbon is going into the same atmosphere and it's poisoning the same planet.
'So, what we need to be making sure is that we are delivering around the world and that's why I'm talking about an energy resilience plan.'
Elsewhere in the debate, Ms Truss, who is languishing in third in the race to replace Boris Johnson, also vowed to reverse a planned increase in corporation tax next year from 19 to 25 per cent – at a cost of £16billion.
Mr Sunak defended his record in No 11, saying: 'I don't think the responsible thing to do right now is launch into some unfunded spree of borrowing and more debt, that will just make inflation worse, it will make the problem longer.'
Ms Truss pinned the blame on the Bank of England, saying 'we have inflation because of our monetary policy, that we haven't been tough enough on the monetary supply, that's the way that I would address that issue'.
But the former chancellor told her: 'Borrowing your way out of inflation isn't a plan, it's a fairytale.'
Ms Truss responded: 'I think it is wrong to put taxes up.'
The blue-on-blue bun fight begins! Penny Mordaunt comes under attack from rivals over transgender rights as Tory leadership rivals clash on live television – with Rishi Sunak mocking Liz Truss to her face over her 'fairytale' economic plans
The Tory leadership race spilled over into bitter sniping on live television tonight as the five would-be prime ministers tore into each other in open view of the public.
Penny Mordaunt was attacked on both sides from Liz Truss and Kemi Badenoch at the Channel 4 leaders' debate over her attitude towards women's rights and transgender people.
It has been identified as a weakpoint in her campaign after previously saying that 'trans women are women', with both the other female candidates trailing her insurgent campaign.
When asked to define her position on gender identity against claims that she previously supported gender self-identification, Ms Mordaunt said she has 'never been in favour of self-ID'.
'I can't imagine why people are not comprehending what I say and have been regurgitating this issue for weeks and weeks, but I'm happy to state my position and evidence to back it up,' Ms Mordaunt said.
'I took through a consultation looking at the Gender Recognition Act, I've never been in favour of self-ID. I would have made the system much better but I would not have divorced it from healthcare.'
When asked whether she accepted this account, Ms Badenoch said: 'I find it difficult to, because when I took over as equalities minister in 2020, the policy that was being pushed was self-ID. So, I don't understand how that would have changed unless someone else did it in between.
'I didn't work with Penny, but my understanding was that the previous minister who had done the role had wanted self-ID, and that was something that I reversed with Liz.'
Ms Mordaunt retaliated, saying: 'That is not correct and this will all be on record in Government.'
Ms Badenoch replied: 'It is on record.'
At the same time, Ms Truss turned her sights on front runner Rishi Sunak over tax and borrowing. The Foreign Secretary had earlier vowed to temporarily remove green levies to take £153 off household power bills and relieve the cost-of-living pressure.
Ms Truss, who is languishing in third in the race to replace Boris Johnson, also vowed to reverse a planned increase in corporation tax next year from 19 to 25 per cent – at a cost of £16billion.
The show kicked off with none of the candidates able to describe Boris Johnson as honest.
The opening questions were dominated by the shadow of the Prime Minister's time in office and trust and integrity in office.
And those closest to him before he announced he was stepping down facing the hardest time. Asked if the PM was an honest man, Ms Badenoch, who was only a junior minister, admitted he only 'sometimes' told the truth.
Mr Tugendhat, a long-term Johnson critic, was the only one to simply say 'no'. A snap poll after the debate saw Tory swing voters rate him as the best performer, ahead of Mr Sunak, with Liz Truss last.
The opening questions were dominated by the shadow of the Prime Minister's time in office, with Liz Truss, Penny Mordaunt, Kemi Badenoch, Rishi Sunak and Tom Tugendhat facing questions about trust and integrity in office.
Ms Truss, who is still Foreign Secretary, and Mr Sunak, the ex-chancellor, tried to caveat their reasons for staying in government as long as they did.
They jostled this afternoon in a digital hustings after favourite Penny Mordaunt accused rival camps of deploying 'black ops' to block her from the last two in the contest because they know she will win.
Asked if the PM was an honest man, Ms Badenoch, who was only a junior minister, admitted he only 'sometimes' told the truth. Mr Tugendhat, a long-term Johnson critic, was the only one to simply say 'no'.
Mr Johnson leaving No10 today
'Male politicians are never asked why they aren't married': Mordaunt blasts political sexism
'Ready for spellcheck': Sunak mocked over campaign spelling error
Tory leadership race: Round two vote result
Penny Mordaunt lashed out at sexism in politics today as she brushed aside questions about her private life.
The 49-year-old is divorced and has no children, and would become the first unmarried prime minister to enter No10 since Edward Heath if she replaces four-times married Boris Johnson.
But speaking to Sky News today she pointed out that such issues are only ever raised about female leaders – citing the row over motherhood that affected the start of Theresa May's time in power.
Interviewer Beth Rigby asked whether it 'irritated' her that motherhood and marriage are still 'relevant' talking about women in powerful positions.
Ms Mordaunt said people's backgrounds were relevant to both men and women seeking public office, but said: 'The question… why aren't you married, is never asked of men.'
When pressed if that meant she would never answer that question, the North Portsmouth MP replied: 'I'd probably answer it, but you could never show it on television.'
However, she did later reveal a glimpse of her private life. Asked in an online leadership hustings about her greatest weakness, she revealed she owns four Burmese cats, and questioned how they would get on with No10's house cat, Larry.
Ms Mordaunt said: 'There have been some really severe issues and I think he has paid a price for that.'
Mr Sunak said: 'I tried to give him the benefit of the doubt for as long as possible and ultimately I reached the conclusion that I couldn't, and that's why I resigned… There were a number of reasons that I resigned but trust and honesty was part of that.'
Liz Truss said 'he has been very clear himself that he made mistakes in Government' but she had taken his explanation for inaccurate statements over Partygate 'at face value'.
It came after Ms Truss had earlier vowed to take an axe to taxes hitting families and businesses today as she ratcheted up the pressure on her rivals for the Tory leadership.
She made the pledge as she and the other four MPs still in the race for No10 faced off for the first time, in an online hustings.
Her tax pledges were in contrast to rivals including frontrunner Rishi Sunak, who again refused to commit to tax cuts. He told those watching the Zoom event organised by the Conservative Home website that controlling soaring inflation was more important than blindly cutting tax.
Ms Truss said: 'We immediately need to start putting money back into people's pockets, we know families are struggling to make ends meet at the moment.
'I would reverse the national insurance rise, I opposed it in Cabinet at the time because I thought it was a mistake, I think it's even more of a mistake now when we're facing such strong economic headwinds.
'I would also have a temporary moratorium on the green energy level to cut £153 from people's energy bills.
'And I would also not do the corporation tax hikes because I think it's vitally important that we're attracting investment into our country.'
The trade minister – a surprise bookies' favourite – demanded her opponents tone down their tactics as she boasted about polls suggesting is the most popular with party members.
Ms Truss has been boosted by an endorsement from right-wing rival Suella Braverman (pictured), who was knocked out of the contest in the second round last night
Senior backbencher Simon Hoare, who is supporting Mr Sunak, hit back at interventions from Lord Frost backing Liz Truss, swiping that no-one 'gives a flying f***' what an 'unelected, failed minister' thinks
Conservative leadership hopeful Rishi Sunak has drawn mockery from social media users after an unfortunate spelling mistake at an online hustings event encouraged voters to 'join the campiaign'.
The mis-spelling of the word 'campaign' appeared over the former chancellor's shoulder during a live stream on Friday afternoon, beneath which messages stated the candidate will 'restore trust, rebuild the economy' and 'reunite the country'.
Next to a QR code, the promotional material read: 'Scan me to join the campiaign.'
Mr Sunak is the frontrunner in the Conservatives' leadership race, with 101 votes in the second ballot, but the mistake drew ire from some on Twitter.
'I thought it had to be a joke. I thought it had to be photoshopped,' tweeted British author Tony Lee.
'My favourite part is, while this is behind him, he claims he is a 'perfectionist'. Um…'
Mr Sunak's team later tried to get in on the joke by tweeting a version of the graphic reading 'ready for spellcheck'.
This afternoon, former candidate Suella Braverman urged her supporters to choose Ms Truss over Mrs Badenoch, saying: 'Kemi is a great woman and a friend. She could do a fantastic job as PM one day but we need to look realistically at the numbers. Liz and Kemi are not both going to make it into the final two.'
Ms Mordaunt had earlier tried to quell a rising backlash about her stance on gender issues, saying 'Westminster is tying itself in knots' about the topic and she believes women have a right to exclude trans people from single-sex spaces.
The hustings, taking place on Zoom by the Conservative Home website, were beset by some technical problems, with Ms Truss forgetting to unmute herself before speaking and Kemi Badenoch struggling with connection issues that made her hard to hear.
Ms Mordaunt repeated her plea for a clean fight in her pitch to readers. 'I want a positive contest,' she told the audience. 'I don't want mudslinging. Without that teamwork, we can't deliver.
'This is not about one party leader, it is about all the talents of the party being able to thrive and pull together in the same direction.'
Rivals have been engaged in a wave of brutal briefing as the Foreign Secretary tries to claw back ground, with allies of the Foreign Secretary branding Ms Mordaunt 'utterly incompetent' and warning her becoming PM would be 'akin to a Corbynite takeover of the Conservative Party'.
Rishi Sunak: 101 (+13)
Penny Mordaunt: 83 (+16)
Liz Truss: 64 (+14)
Kemi Badenoch: 49 (+9)
Tom Tugendhat: 32 (-5)
Suella Braverman: 27 (-5)
Former Brexit minister Lord Frost drew a furious response after urging the other right-winger left in the contest, Kemi Badenoch, to pull out and get behind Ms Truss – something she has flatly dismissed.
Senior backbencher Simon Hoare, who is supporting Mr Sunak, swiped at the peer saying no-one 'gives a flying f***' what an 'unelected, failed minister' thinks.
Ms Mordaunt's supporters have struck back by predicting that Ms Truss will be 'aggressive and Marmite' in the first televised debate on Channel 4 tonight, with one telling The Times she could end up looking like 'Cruella de Vil'.
Ms Truss has been boosted by an endorsement from right-wing rival Suella Braverman, who was knocked out of the contest in the second round last night.
Ms Braverman also laid into Ms Mordaunt over her stance on gender issues, accusing her of trying to keep the word 'woman' out of maternity legislation.
Ms Mordaunt said: 'People obviously are trying to stop me getting into the final because they don't want to run against me.'
She insisted that her campaign was 'not engaging in any of these black ops', and said her competitors 'might like to think about doing the same' because 'the worst thing would be is if we come out of this contest not in good shape'.
Ms Mordaunt also tried to put the gender debate to one side, saying that she is 'genetically a woman' and trans women are not. She insisted it is not fair for biological men to compete in women's sport.
But she added: 'I think we should be concentrating on the big issues that are worrying – and terrifying in some cases – the public.
'The huge cost of living issues that we have, access to health care, just the services that they want to see run really efficiently from the state.
'I understand why people are trying to stop me getting into the final two, but I am going to stay focused on the things that matter to the public and the people we're here to serve.'
On Sky, Beth Rigby pointed out that Ms Mordaunt would be the first single PM since Ted Heath, mentioned the motherhood row over Theresa May and asked whether it 'irritated' her that motherhood and marriage are still 'relevant' talking about women in powerful positions.
When Beth pressed if that meant Ms Mordaunt would never answer that question, she replied: 'I'd probably answer it, but you could never show it on television.'
The identity of the top two contenders who will go forward to the run-off ballot of Tory activists is still far from clear after the second round of voting by MPs.
Former Chancellor Rishi Sunak came top with 101 votes and Ms Mordaunt was second with 83 – adding 16 to her previous tally.
Ms Truss was still well behind on 64 – up 14 – while Ms Badenoch received 49, up nine. Tom Tugendhat is also still in the battle with 32 votes despite losing support.
The candidates will take part in hustings for the grassroots ConservativeHome website at 1pm, before facing off on Channel 4 at 7.30pm. There will be another ITV debate on Sunday night and MPs then vote again on Monday to eliminate another hopeful.
A YouGov poll found the run-off margin for Penny Mordaunt against Rishi Sunak could be 67 per cent to 28 per cent, while the former Chancellor could lose 59 per cent to 25 per cent against Liz Truss
Ms Braverman came out in support of Ms Truss after they held talks last night, describing the Foreign Secretary as the 'best person to unleash the opportunities of Brexit' and deliver tax cuts, as the right of the party seeks to rally round a single candidate.
Taking influential Tory Steve Baker's vote with her, it was a blow to Kemi Badenoch, who was facing pressure to pull out and back Ms Truss to keep Mr Sunak or Ms Mordaunt out of No 10.
In a statement, Ms Braverman said: 'Liz is the best person to unleash the opportunities of Brexit, and deliver much needed tax cuts.
'I'm confident she will defend free speech, champion equality of opportunity and take a robust line on illegal immigration.'
Meanwhile, Lord Frost urged Ms Badenoch to withdraw from the Tory leadership race and back Ms Truss.
Writing for the Daily Telegraph, Lord Frost said: 'We need unity among free marketeers. Kemi and Suella Braverman set out convincing programmes, with differing emphases, for change.
'But Liz's depth of experience, her energy and ideas – as well as the simple fact she has the most votes of the three – put her in the lead.
He added: 'It is now time for pragmatism. I urge Kemi to stand down in return for a serious job in a Truss administration.'
Former health minister Ed Argar, Home Office minister Tom Pursglove and defence minister James Heappey also endorsed Ms Truss yesterday.
The Foreign Secretary used her campaign launch yesterday to promise continuity on Mr Johnson's key pledges such as levelling up, while breaking with the economic policy pursued by Mr Sunak.
There had been fury at the refusal of Mrs Braverman to step aside and lend her supporters to Miss Truss.
One ally said: 'If she had dropped out in the morning we could have expected a significant number of her people to come across, giving Liz momentum into the weekend. It was a golden opportunity missed.'
In her speech in central London yesterday, Miss Truss highlighted her experience as a former chief secretary to the Treasury, and said she was the only candidate with the experience to offer a credible economic alternative to Mr Sunak.
'We are at a critical moment for our country,' she said. 'Now is the time to be bold, we cannot have business-as-usual economic management, which has led to low growth for decades.'
She pledged to introduce 'bold supply-side reforms' including 'cutting taxes'.
Ms Truss also said she had opposed Mr Sunak's hike in national insurance and would scrap it if elected.
And she defended her decision to stand by Boris Johnson when others were deserting him.
'I am a loyal person. I am loyal to Boris Johnson,' she said.
'I supported our Prime Minister's aspirations and I want to deliver the promise of the 2019 manifesto.
'What we need to do now is deliver, deliver, deliver, and I am the person in this race who has the record of delivery.'
Teacher's Pet wife killer Chris Dawson moved from Sydney's Silverwater Prison to Macquarie jail
International News / By Chairman
Serial killer Peter Tobin who murdered three women and is suspected of killing many more dies at 76
Boris Becker's ex says tennis star's first months in prison have been 'tough' for her and their son
Tasmanian Rodney James Bessell, 64, procured pre-teen Filipino kids over SKYPE through their MUM
SEVEN dead in 'devastating' Irish petrol station explosion with death toll expected to rise
Massive explosion destroys the only bridge between Russia and Crimea in suspected attack by Ukraine
Met police sergeant thrown out of the force for making unwelcome advances to female junior colleague
St Mary's, Western Sydney: Woman dies, woman fleeing with baby arrested after car crashes into home
Husband and wife team behind Pfizer-BioNTech COVID shot insist pandemic ISN'T over
Outraged DC commuters threaten to SHOOT climate change protesters after they blocked busy freeway
Columbia University agrees to pay $165 million settlement to 147 patients of pervert gynecologist
Port Hedland shark attack: Father almost has arm ripped off only metres away from four-year-old son
PM Liz Truss and Home Secretary Suella Braverman in disagreement over immigration rules
Free nursery hours 'could be axed' under Liz Truss's radical plans to shakeup childcare provision
Miss USA INSISTS she is the rightful winner after competitors claims the beauty pageant was rigged


Enjoy your favourite hot drink with this elegant Lady mug with an inspiring message. The handmade and hand-painted mug can hold up to 16 ounces of delicious coffee or tea, and will definitely make your morning routine more colourful. The mug is microwave and dishwasher-safe.
16 oz, 5.3" x 3.7" x 4.9"


There are so many flash video downloaders out there that downloading videos from the internet is not a problem any more. What all developers miss out is that there are thousands if not millions of video portals out there, so we need a tool that can work for most or all of them, rather than merely the popular ones.
I used Ant toolbar Firefox add-on for the past one year, and it worked. But because the developer has not updated and made it compatible with FF version 3.5, I had to search for other methods. One successful way I have found so far is to download flash videos using Orbit Downloader.
This method is quite easy and a piece-of-cake if you want to go on a video-download-marathon. First grab the Orbit Downloader from the link given at the bottom of the post. Once installed, open it, go to Tools menu, and select Grab++ from the list.
Now you can close the original Orbit Downloader program since Grab++ is a separate tool that can work independently. Now visit any video portal and run the video, you will notice that everything is grabbed by Grab++ including the video. To filter out video from the rest of the objects that were grabbed, click the Video link.
Note: If the video is not grabbed, you need to refresh the page and make sure that the video is playing. Once the video comes in the list, you can go ahead and close the webpage if you want.
Now check the video that you want to download and click Download button.
Enter the destination of the video and it's name and click Download to begin downloading the video. You can also set some advanced download options by clicking More, but it is recommended that you use the default settings.
To confirm if the video has been downloaded, double-click the Orbit Downloader system tray icon, select Completed from the left sidebar and you will find the video.
To clear the list from Grab++, click Actions and select Clear All List or some other options depending on your situation.
You can also select which browsers you want Grab++ to monitor by going to Actions > Preferences and going to Monitoring tab.
From the General tab in Preferences you can select which files you want to exclude from the list. Overall, Grab++ feature of Orbit Downloader works flawlessly. I tested it on various different types of video portals and it grabbed every video that was played.


text:
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
(function (global){
(function() {

'use strict';

require('@pamplemousse/front-end-tracker');

/*
 * Expect the following variables to be replaced by ZAP:
 *   - HISTORY_REFERENCE_ID: helps ZAP to associate the vulnerability
 *   to an HTTP exchange.
 *   - CALLBACK_ENDPOINT: url to report back to.
 *   - SCRIPTS: array of functions, any which is a script to be run.
 */
const HISTORY_REFERENCE_ID = '<<HISTORY_REFERENCE_ID>>';
const CALLBACK_ENDPOINT = '<<ZAP_CALLBACK_ENDPOINT>>';
const SCRIPTS = '<<LIST_OF_PASSIVE_SCRIPTS>>';

const axios = require('axios');

class FrontEndScanner {
  constructor() {
    this.zapAlertConstants = require('./zap-alert-constants.js');
    this.mailbox = global.mailbox;
  }

  reportAlertToZap(alertData) {
    alertData.historyReferenceId = HISTORY_REFERENCE_ID;

    const params = {
      alert: alertData
    };

    // CALLBACK_ENDPOINT has been injected by ZAP
    axios.post(CALLBACK_ENDPOINT, params)
      .then(response => {
        console.log(response);
      })
      .catch(error => {
        console.log(error);
      });
  }
}

const frontEndScanner = new FrontEndScanner();

SCRIPTS.forEach(script => {
  script(frontEndScanner);
});
})();

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./zap-alert-constants.js":34,"@pamplemousse/front-end-tracker":5,"axios":6}],2:[function(require,module,exports){
/*
 * A list of DOM events can be found on MDN:
 *   https://developer.mozilla.org/en-US/docs/Web/Events
 * Note that the more events are tracked, the slower the scanner will be.
 */

'use strict';

const FORM_EVENTS = ['reset', 'submit'];
const CLIPBOARD_EVENTS = ['cut', 'copy', 'paste'];
const KEYBOARD_EVENTS = ['keydown', 'keypress', 'keyup'];
const MOUSE_EVENTS = [
  'mousedown', 'mouseup', 'click', 'dblclick', 'contextmenu', 'wheel', 'select',
  'pointerlockchange', 'pointerlockerror'
];
const DRAG_AND_DROP_EVENTS = [
  'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop'
];

const EVENTS = Array.prototype.concat(
  FORM_EVENTS, CLIPBOARD_EVENTS, KEYBOARD_EVENTS,
  MOUSE_EVENTS, DRAG_AND_DROP_EVENTS
);

module.exports = {
  EVENTS
};

},{}],3:[function(require,module,exports){
'use strict';

class Rule {
  setOptions(opts) {
    if ('enabled' in opts) {
      this.enabled = Boolean(opts.enabled);
    }
    if ('types' in opts) {
      this.types = opts.types;
    }
    if ('selector' in opts) {
      this.selector = opts.selector;
    }
    this.onEvent = function (event) {
      const data = {
        topic: 'dom-events',
        element: event.target.nodeName,
        event: event.type
      };
      opts.callback(null, data);
    };
  }

  _matches(type, elem) {
    return (!this.types || this.types.includes(type)) &&
           (!this.selector ||
              (this.selector === 'document' && elem instanceof Document) ||
              (this.selector === 'window' && elem instanceof Window) ||
              (elem.matches && elem.matches(this.selector)));
  }

  _onEvent(event, handler) {
    if (this.enabled && this._matches(event.type, event.target)) {
      return this.onEvent(event, handler);
    }
    return undefined;
  }
}

class EventListenerHook {
  constructor(name) {
    this.name = name;

    this.targetInstance = this;
    this.rules = [new Rule()];

    this.handlerProxies = new WeakMap();

    this.oldAEL = EventTarget.prototype.addEventListener;
    this.oldREL = EventTarget.prototype.removeEventListener;

    const me = this;
    EventTarget.prototype.addEventListener = function (type, handler, opts) {
      return me.onAddListener(this, type, handler, opts);
    };
    EventTarget.prototype.removeEventListener = function (type, handler, opts) {
      return me.onRemoveListener(this, type, handler, opts);
    };
  }

  onAddListener(elem, type, handler, options) {
    if (!handler) { // No handler, so this call will fizzle anyway
      return undefined;
    }
    const me = this;
    const proxy = this.handlerProxies.get(handler) || function (event) {
      return me.targetInstance.onEvent(this, event, handler);
    };
    const returnValue = this.oldAEL.call(elem, type, proxy, options);
    this.handlerProxies.set(handler, proxy);
    return returnValue;
  }

  onRemoveListener(elem, type, handler, options) {
    if (handler && this.handlerProxies.has(handler)) {
      const proxy = this.handlerProxies.get(handler);
      this.oldREL.call(elem, type, proxy, options);
    } else {
      this.oldREL.call(elem, type, handler, options);
    }
  }

  onEvent(thisObj, event, originalHandler) {
    let stopEvent = false;
    for (const rule of this.rules) {
      if (rule._onEvent(event, originalHandler) === false) {
        stopEvent = true;
      }
    }
    if (!stopEvent) {
      if (originalHandler.handleEvent) {
        return originalHandler.handleEvent.call(thisObj, event);
      }
      return originalHandler.call(thisObj, event);
    }
    return undefined;
  }

  setOptions(opts) {
    this.rules[0].setOptions(opts);
    this.enabled = this.rules[0].enabled;
  }
}

module.exports = {
  EventListenerHook
};

},{}],4:[function(require,module,exports){
'use strict';

const hooks = [];
const oldGetItem = Storage.prototype.getItem;
const oldRemoveItem = Storage.prototype.removeItem;
const oldSetItem = Storage.prototype.setItem;

Storage.prototype.getItem = function (...args) {
  const keyName = args[0];
  const keyValue = oldGetItem.call(this, keyName);
  for (const hook of hooks) {
    hook.onStorage({
      key: keyName,
      action: 'get',
      value: keyValue
    });
  }
  return keyValue;
};

Storage.prototype.removeItem = function (...args) {
  const keyName = args[0];
  const keyValue = oldGetItem.call(this, keyName);
  const returnValue = oldRemoveItem.call(this, keyName);
  for (const hook of hooks) {
    hook.onStorage({
      key: keyName,
      action: 'remove',
      value: keyValue
    });
  }
  return returnValue;
};

Storage.prototype.setItem = function (...args) {
  const keyName = args[0];
  const keyValue = args[1];
  const returnValue = oldSetItem.call(this, keyName, keyValue);
  for (const hook of hooks) {
    hook.onStorage({
      key: keyName,
      action: 'set',
      value: keyValue
    });
  }
  return returnValue;
};

class StorageHook {
  constructor() {
    hooks.push(this);
  }

  setOptions(opts) {
    if ('enabled' in opts) {
      this.enabled = Boolean(opts.enabled);
    }
    this.onStorage = function (obj) {
      const data = {...obj, topic: 'storage'};
      opts.callback(null, data);
    };
  }
}

module.exports = {
  StorageHook
};

},{}],5:[function(require,module,exports){
(function (global){
'use strict';

const mailbox = require('pubsub-js');

global.mailbox = mailbox;

const {EVENTS} = require('./events.js');
const {EventListenerHook} = require('./hooks/event-listener-hook.js');
const {StorageHook} = require('./hooks/storage-hook');

const eventListenerOptions = {
  enabled: true,
  types: EVENTS,
  callback: publishToMailbox
};

const storageOptions = {
  enabled: true,
  callback: publishToMailbox
};

function publishToMailbox(err, data) {
  if (err) {
    console.log(err);
  } else {
    const time = new Date().getTime();
    const {topic} = data;
    data.timestamp = time;

    mailbox.publish(topic, data);
  }
}

const hooksAndOptions = [{
  Hook: EventListenerHook,
  options: eventListenerOptions
}, {
  Hook: StorageHook,
  options: storageOptions
}];

hooksAndOptions.forEach(x => {
  const hook = new x.Hook();
  hook.setOptions(x.options);
});

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./events.js":2,"./hooks/event-listener-hook.js":3,"./hooks/storage-hook":4,"pubsub-js":33}],6:[function(require,module,exports){
module.exports = require('./lib/axios');
},{"./lib/axios":8}],7:[function(require,module,exports){
(function (process){
'use strict';

var utils = require('./../utils');
var settle = require('./../core/settle');
var buildURL = require('./../helpers/buildURL');
var parseHeaders = require('./../helpers/parseHeaders');
var isURLSameOrigin = require('./../helpers/isURLSameOrigin');
var createError = require('../core/createError');
var btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || require('./../helpers/btoa');

module.exports = function xhrAdapter(config) {
  return new Promise(function dispatchXhrRequest(resolve, reject) {
    var requestData = config.data;
    var requestHeaders = config.headers;

    if (utils.isFormData(requestData)) {
      delete requestHeaders['Content-Type']; // Let the browser set it
    }

    var request = new XMLHttpRequest();
    var loadEvent = 'onreadystatechange';
    var xDomain = false;

    // For IE 8/9 CORS support
    // Only supports POST and GET calls and doesn't returns the response headers.
    // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.
    if (process.env.NODE_ENV !== 'test' &&
        typeof window !== 'undefined' &&
        window.XDomainRequest && !('withCredentials' in request) &&
        !isURLSameOrigin(config.url)) {
      request = new window.XDomainRequest();
      loadEvent = 'onload';
      xDomain = true;
      request.onprogress = function handleProgress() {};
      request.ontimeout = function handleTimeout() {};
    }

    // HTTP basic authentication
    if (config.auth) {
      var username = config.auth.username || '';
      var password = config.auth.password || '';
      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
    }

    request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);

    // Set the request timeout in MS
    request.timeout = config.timeout;

    // Listen for ready state
    request[loadEvent] = function handleLoad() {
      if (!request || (request.readyState !== 4 && !xDomain)) {
        return;
      }

      // The request errored out and we didn't get a response, this will be
      // handled by onerror instead
      // With one exception: request that using file: protocol, most browsers
      // will return status as 0 even though it's a successful request
      if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
        return;
      }

      // Prepare the response
      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
      var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
      var response = {
        data: responseData,
        // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)
        status: request.status === 1223 ? 204 : request.status,
        statusText: request.status === 1223 ? 'No Content' : request.statusText,
        headers: responseHeaders,
        config: config,
        request: request
      };

      settle(resolve, reject, response);

      // Clean up request
      request = null;
    };

    // Handle low level network errors
    request.onerror = function handleError() {
      // Real errors are hidden from us by the browser
      // onerror should only fire if it's a network error
      reject(createError('Network Error', config, null, request));

      // Clean up request
      request = null;
    };

    // Handle timeout
    request.ontimeout = function handleTimeout() {
      reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',
        request));

      // Clean up request
      request = null;
    };

    // Add xsrf header
    // This is only done if running in a standard browser environment.
    // Specifically not if we're in a web worker, or react-native.
    if (utils.isStandardBrowserEnv()) {
      var cookies = require('./../helpers/cookies');

      // Add xsrf header
      var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?
          cookies.read(config.xsrfCookieName) :
          undefined;

      if (xsrfValue) {
        requestHeaders[config.xsrfHeaderName] = xsrfValue;
      }
    }

    // Add headers to the request
    if ('setRequestHeader' in request) {
      utils.forEach(requestHeaders, function setRequestHeader(val, key) {
        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
          // Remove Content-Type if data is undefined
          delete requestHeaders[key];
        } else {
          // Otherwise add header to the request
          request.setRequestHeader(key, val);
        }
      });
    }

    // Add withCredentials to request if needed
    if (config.withCredentials) {
      request.withCredentials = true;
    }

    // Add responseType to request if needed
    if (config.responseType) {
      try {
        request.responseType = config.responseType;
      } catch (e) {
        // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
        // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
        if (config.responseType !== 'json') {
          throw e;
        }
      }
    }

    // Handle progress if needed
    if (typeof config.onDownloadProgress === 'function') {
      request.addEventListener('progress', config.onDownloadProgress);
    }

    // Not all browsers support upload events
    if (typeof config.onUploadProgress === 'function' && request.upload) {
      request.upload.addEventListener('progress', config.onUploadProgress);
    }

    if (config.cancelToken) {
      // Handle cancellation
      config.cancelToken.promise.then(function onCanceled(cancel) {
        if (!request) {
          return;
        }

        request.abort();
        reject(cancel);
        // Clean up request
        request = null;
      });
    }

    if (requestData === undefined) {
      requestData = null;
    }

    // Send the request
    request.send(requestData);
  });
};

}).call(this,require('_process'))
},{"../core/createError":14,"./../core/settle":17,"./../helpers/btoa":21,"./../helpers/buildURL":22,"./../helpers/cookies":24,"./../helpers/isURLSameOrigin":26,"./../helpers/parseHeaders":28,"./../utils":30,"_process":32}],8:[function(require,module,exports){
'use strict';

var utils = require('./utils');
var bind = require('./helpers/bind');
var Axios = require('./core/Axios');
var defaults = require('./defaults');

/**
 * Create an instance of Axios
 *
 * @param {Object} defaultConfig The default config for the instance
 * @return {Axios} A new instance of Axios
 */
function createInstance(defaultConfig) {
  var context = new Axios(defaultConfig);
  var instance = bind(Axios.prototype.request, context);

  // Copy axios.prototype to instance
  utils.extend(instance, Axios.prototype, context);

  // Copy context to instance
  utils.extend(instance, context);

  return instance;
}

// Create the default instance to be exported
var axios = createInstance(defaults);

// Expose Axios class to allow class inheritance
axios.Axios = Axios;

// Factory for creating new instances
axios.create = function create(instanceConfig) {
  return createInstance(utils.merge(defaults, instanceConfig));
};

// Expose Cancel & CancelToken
axios.Cancel = require('./cancel/Cancel');
axios.CancelToken = require('./cancel/CancelToken');
axios.isCancel = require('./cancel/isCancel');

// Expose all/spread
axios.all = function all(promises) {
  return Promise.all(promises);
};
axios.spread = require('./helpers/spread');

module.exports = axios;

// Allow use of default import syntax in TypeScript
module.exports.default = axios;

},{"./cancel/Cancel":9,"./cancel/CancelToken":10,"./cancel/isCancel":11,"./core/Axios":12,"./defaults":19,"./helpers/bind":20,"./helpers/spread":29,"./utils":30}],9:[function(require,module,exports){
'use strict';

/**
 * A `Cancel` is an object that is thrown when an operation is canceled.
 *
 * @class
 * @param {string=} message The message.
 */
function Cancel(message) {
  this.message = message;
}

Cancel.prototype.toString = function toString() {
  return 'Cancel' + (this.message ? ': ' + this.message : '');
};

Cancel.prototype.__CANCEL__ = true;

module.exports = Cancel;

},{}],10:[function(require,module,exports){
'use strict';

var Cancel = require('./Cancel');

/**
 * A `CancelToken` is an object that can be used to request cancellation of an operation.
 *
 * @class
 * @param {Function} executor The executor function.
 */
function CancelToken(executor) {
  if (typeof executor !== 'function') {
    throw new TypeError('executor must be a function.');
  }

  var resolvePromise;
  this.promise = new Promise(function promiseExecutor(resolve) {
    resolvePromise = resolve;
  });

  var token = this;
  executor(function cancel(message) {
    if (token.reason) {
      // Cancellation has already been requested
      return;
    }

    token.reason = new Cancel(message);
    resolvePromise(token.reason);
  });
}

/**
 * Throws a `Cancel` if cancellation has been requested.
 */
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
  if (this.reason) {
    throw this.reason;
  }
};

/**
 * Returns an object that contains a new `CancelToken` and a function that, when called,
 * cancels the `CancelToken`.
 */
CancelToken.source = function source() {
  var cancel;
  var token = new CancelToken(function executor(c) {
    cancel = c;
  });
  return {
    token: token,
    cancel: cancel
  };
};

module.exports = CancelToken;

},{"./Cancel":9}],11:[function(require,module,exports){
'use strict';

module.exports = function isCancel(value) {
  return !!(value && value.__CANCEL__);
};

},{}],12:[function(require,module,exports){
'use strict';

var defaults = require('./../defaults');
var utils = require('./../utils');
var InterceptorManager = require('./InterceptorManager');
var dispatchRequest = require('./dispatchRequest');

/**
 * Create a new instance of Axios
 *
 * @param {Object} instanceConfig The default config for the instance
 */
function Axios(instanceConfig) {
  this.defaults = instanceConfig;
  this.interceptors = {
    request: new InterceptorManager(),
    response: new InterceptorManager()
  };
}

/**
 * Dispatch a request
 *
 * @param {Object} config The config specific for this request (merged with this.defaults)
 */
Axios.prototype.request = function request(config) {
  /*eslint no-param-reassign:0*/
  // Allow for axios('example/url'[, config]) a la fetch API
  if (typeof config === 'string') {
    config = utils.merge({
      url: arguments[0]
    }, arguments[1]);
  }

  config = utils.merge(defaults, {method: 'get'}, this.defaults, config);
  config.method = config.method.toLowerCase();

  // Hook up interceptors middleware
  var chain = [dispatchRequest, undefined];
  var promise = Promise.resolve(config);

  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    chain.unshift(interceptor.fulfilled, interceptor.rejected);
  });

  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    chain.push(interceptor.fulfilled, interceptor.rejected);
  });

  while (chain.length) {
    promise = promise.then(chain.shift(), chain.shift());
  }

  return promise;
};

// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, config) {
    return this.request(utils.merge(config || {}, {
      method: method,
      url: url
    }));
  };
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, data, config) {
    return this.request(utils.merge(config || {}, {
      method: method,
      url: url,
      data: data
    }));
  };
});

module.exports = Axios;

},{"./../defaults":19,"./../utils":30,"./InterceptorManager":13,"./dispatchRequest":15}],13:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

function InterceptorManager() {
  this.handlers = [];
}

/**
 * Add a new interceptor to the stack
 *
 * @param {Function} fulfilled The function to handle `then` for a `Promise`
 * @param {Function} rejected The function to handle `reject` for a `Promise`
 *
 * @return {Number} An ID used to remove interceptor later
 */
InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  this.handlers.push({
    fulfilled: fulfilled,
    rejected: rejected
  });
  return this.handlers.length - 1;
};

/**
 * Remove an interceptor from the stack
 *
 * @param {Number} id The ID that was returned by `use`
 */
InterceptorManager.prototype.eject = function eject(id) {
  if (this.handlers[id]) {
    this.handlers[id] = null;
  }
};

/**
 * Iterate over all the registered interceptors
 *
 * This method is particularly useful for skipping over any
 * interceptors that may have become `null` calling `eject`.
 *
 * @param {Function} fn The function to call for each interceptor
 */
InterceptorManager.prototype.forEach = function forEach(fn) {
  utils.forEach(this.handlers, function forEachHandler(h) {
    if (h !== null) {
      fn(h);
    }
  });
};

module.exports = InterceptorManager;

},{"./../utils":30}],14:[function(require,module,exports){
'use strict';

var enhanceError = require('./enhanceError');

/**
 * Create an Error with the specified message, config, error code, request and response.
 *
 * @param {string} message The error message.
 * @param {Object} config The config.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The created error.
 */
module.exports = function createError(message, config, code, request, response) {
  var error = new Error(message);
  return enhanceError(error, config, code, request, response);
};

},{"./enhanceError":16}],15:[function(require,module,exports){
'use strict';

var utils = require('./../utils');
var transformData = require('./transformData');
var isCancel = require('../cancel/isCancel');
var defaults = require('../defaults');
var isAbsoluteURL = require('./../helpers/isAbsoluteURL');
var combineURLs = require('./../helpers/combineURLs');

/**
 * Throws a `Cancel` if cancellation has been requested.
 */
function throwIfCancellationRequested(config) {
  if (config.cancelToken) {
    config.cancelToken.throwIfRequested();
  }
}

/**
 * Dispatch a request to the server using the configured adapter.
 *
 * @param {object} config The config that is to be used for the request
 * @returns {Promise} The Promise to be fulfilled
 */
module.exports = function dispatchRequest(config) {
  throwIfCancellationRequested(config);

  // Support baseURL config
  if (config.baseURL && !isAbsoluteURL(config.url)) {
    config.url = combineURLs(config.baseURL, config.url);
  }

  // Ensure headers exist
  config.headers = config.headers || {};

  // Transform request data
  config.data = transformData(
    config.data,
    config.headers,
    config.transformRequest
  );

  // Flatten headers
  config.headers = utils.merge(
    config.headers.common || {},
    config.headers[config.method] || {},
    config.headers || {}
  );

  utils.forEach(
    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
    function cleanHeaderConfig(method) {
      delete config.headers[method];
    }
  );

  var adapter = config.adapter || defaults.adapter;

  return adapter(config).then(function onAdapterResolution(response) {
    throwIfCancellationRequested(config);

    // Transform response data
    response.data = transformData(
      response.data,
      response.headers,
      config.transformResponse
    );

    return response;
  }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
      throwIfCancellationRequested(config);

      // Transform response data
      if (reason && reason.response) {
        reason.response.data = transformData(
          reason.response.data,
          reason.response.headers,
          config.transformResponse
        );
      }
    }

    return Promise.reject(reason);
  });
};

},{"../cancel/isCancel":11,"../defaults":19,"./../helpers/combineURLs":23,"./../helpers/isAbsoluteURL":25,"./../utils":30,"./transformData":18}],16:[function(require,module,exports){
'use strict';

/**
 * Update an Error with the specified config, error code, and response.
 *
 * @param {Error} error The error to update.
 * @param {Object} config The config.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The error.
 */
module.exports = function enhanceError(error, config, code, request, response) {
  error.config = config;
  if (code) {
    error.code = code;
  }
  error.request = request;
  error.response = response;
  return error;
};

},{}],17:[function(require,module,exports){
'use strict';

var createError = require('./createError');

/**
 * Resolve or reject a Promise based on response status.
 *
 * @param {Function} resolve A function that resolves the promise.
 * @param {Function} reject A function that rejects the promise.
 * @param {object} response The response.
 */
module.exports = function settle(resolve, reject, response) {
  var validateStatus = response.config.validateStatus;
  // Note: status is not exposed by XDomainRequest
  if (!response.status || !validateStatus || validateStatus(response.status)) {
    resolve(response);
  } else {
    reject(createError(
      'Request failed with status code ' + response.status,
      response.config,
      null,
      response.request,
      response
    ));
  }
};

},{"./createError":14}],18:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

/**
 * Transform the data for a request or a response
 *
 * @param {Object|String} data The data to be transformed
 * @param {Array} headers The headers for the request or response
 * @param {Array|Function} fns A single function or Array of functions
 * @returns {*} The resulting transformed data
 */
module.exports = function transformData(data, headers, fns) {
  /*eslint no-param-reassign:0*/
  utils.forEach(fns, function transform(fn) {
    data = fn(data, headers);
  });

  return data;
};

},{"./../utils":30}],19:[function(require,module,exports){
(function (process){
'use strict';

var utils = require('./utils');
var normalizeHeaderName = require('./helpers/normalizeHeaderName');

var DEFAULT_CONTENT_TYPE = {
  'Content-Type': 'application/x-www-form-urlencoded'
};

function setContentTypeIfUnset(headers, value) {
  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
    headers['Content-Type'] = value;
  }
}

function getDefaultAdapter() {
  var adapter;
  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = require('./adapters/xhr');
  } else if (typeof process !== 'undefined') {
    // For node use HTTP adapter
    adapter = require('./adapters/http');
  }
  return adapter;
}

var defaults = {
  adapter: getDefaultAdapter(),

  transformRequest: [function transformRequest(data, headers) {
    normalizeHeaderName(headers, 'Content-Type');
    if (utils.isFormData(data) ||
      utils.isArrayBuffer(data) ||
      utils.isBuffer(data) ||
      utils.isStream(data) ||
      utils.isFile(data) ||
      utils.isBlob(data)
    ) {
      return data;
    }
    if (utils.isArrayBufferView(data)) {
      return data.buffer;
    }
    if (utils.isURLSearchParams(data)) {
      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
      return data.toString();
    }
    if (utils.isObject(data)) {
      setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
      return JSON.stringify(data);
    }
    return data;
  }],

  transformResponse: [function transformResponse(data) {
    /*eslint no-param-reassign:0*/
    if (typeof data === 'string') {
      try {
        data = JSON.parse(data);
      } catch (e) { /* Ignore */ }
    }
    return data;
  }],

  /**
   * A timeout in milliseconds to abort a request. If set to 0 (default) a
   * timeout is not created.
   */
  timeout: 0,

  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN',

  maxContentLength: -1,

  validateStatus: function validateStatus(status) {
    return status >= 200 && status < 300;
  }
};

defaults.headers = {
  common: {
    'Accept': 'application/json, text/plain, */*'
  }
};

utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
  defaults.headers[method] = {};
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});

module.exports = defaults;

}).call(this,require('_process'))
},{"./adapters/http":7,"./adapters/xhr":7,"./helpers/normalizeHeaderName":27,"./utils":30,"_process":32}],20:[function(require,module,exports){
'use strict';

module.exports = function bind(fn, thisArg) {
  return function wrap() {
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }
    return fn.apply(thisArg, args);
  };
};

},{}],21:[function(require,module,exports){
'use strict';

// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js

var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

function E() {
  this.message = 'String contains an invalid character';
}
E.prototype = new Error;
E.prototype.code = 5;
E.prototype.name = 'InvalidCharacterError';

function btoa(input) {
  var str = String(input);
  var output = '';
  for (
    // initialize result and counter
    var block, charCode, idx = 0, map = chars;
    // if the next str index does not exist:
    //   change the mapping table to "="
    //   check if d has no fractional digits
    str.charAt(idx | 0) || (map = '=', idx % 1);
    // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
    output += map.charAt(63 & block >> 8 - idx % 1 * 8)
  ) {
    charCode = str.charCodeAt(idx += 3 / 4);
    if (charCode > 0xFF) {
      throw new E();
    }
    block = block << 8 | charCode;
  }
  return output;
}

module.exports = btoa;

},{}],22:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

function encode(val) {
  return encodeURIComponent(val).
    replace(/%40/gi, '@').
    replace(/%3A/gi, ':').
    replace(/%24/g, '$').
    replace(/%2C/gi, ',').
    replace(/%20/g, '+').
    replace(/%5B/gi, '[').
    replace(/%5D/gi, ']');
}

/**
 * Build a URL by appending params to the end
 *
 * @param {string} url The base of the url (e.g., http://www.google.com)
 * @param {object} [params] The params to be appended
 * @returns {string} The formatted url
 */
module.exports = function buildURL(url, params, paramsSerializer) {
  /*eslint no-param-reassign:0*/
  if (!params) {
    return url;
  }

  var serializedParams;
  if (paramsSerializer) {
    serializedParams = paramsSerializer(params);
  } else if (utils.isURLSearchParams(params)) {
    serializedParams = params.toString();
  } else {
    var parts = [];

    utils.forEach(params, function serialize(val, key) {
      if (val === null || typeof val === 'undefined') {
        return;
      }

      if (utils.isArray(val)) {
        key = key + '[]';
      } else {
        val = [val];
      }

      utils.forEach(val, function parseValue(v) {
        if (utils.isDate(v)) {
          v = v.toISOString();
        } else if (utils.isObject(v)) {
          v = JSON.stringify(v);
        }
        parts.push(encode(key) + '=' + encode(v));
      });
    });

    serializedParams = parts.join('&');
  }

  if (serializedParams) {
    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
  }

  return url;
};

},{"./../utils":30}],23:[function(require,module,exports){
'use strict';

/**
 * Creates a new URL by combining the specified URLs
 *
 * @param {string} baseURL The base URL
 * @param {string} relativeURL The relative URL
 * @returns {string} The combined URL
 */
module.exports = function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
};

},{}],24:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs support document.cookie
  (function standardBrowserEnv() {
    return {
      write: function write(name, value, expires, path, domain, secure) {
        var cookie = [];
        cookie.push(name + '=' + encodeURIComponent(value));

        if (utils.isNumber(expires)) {
          cookie.push('expires=' + new Date(expires).toGMTString());
        }

        if (utils.isString(path)) {
          cookie.push('path=' + path);
        }

        if (utils.isString(domain)) {
          cookie.push('domain=' + domain);
        }

        if (secure === true) {
          cookie.push('secure');
        }

        document.cookie = cookie.join('; ');
      },

      read: function read(name) {
        var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
        return (match ? decodeURIComponent(match[3]) : null);
      },

      remove: function remove(name) {
        this.write(name, '', Date.now() - 86400000);
      }
    };
  })() :

  // Non standard browser env (web workers, react-native) lack needed support.
  (function nonStandardBrowserEnv() {
    return {
      write: function write() {},
      read: function read() { return null; },
      remove: function remove() {}
    };
  })()
);

},{"./../utils":30}],25:[function(require,module,exports){
'use strict';

/**
 * Determines whether the specified URL is absolute
 *
 * @param {string} url The URL to test
 * @returns {boolean} True if the specified URL is absolute, otherwise false
 */
module.exports = function isAbsoluteURL(url) {
  // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
  // by any combination of letters, digits, plus, period, or hyphen.
  return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
};

},{}],26:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs have full support of the APIs needed to test
  // whether the request URL is of the same origin as current location.
  (function standardBrowserEnv() {
    var msie = /(msie|trident)/i.test(navigator.userAgent);
    var urlParsingNode = document.createElement('a');
    var originURL;

    /**
    * Parse a URL to discover it's components
    *
    * @param {String} url The URL to be parsed
    * @returns {Object}
    */
    function resolveURL(url) {
      var href = url;

      if (msie) {
        // IE needs attribute set twice to normalize properties
        urlParsingNode.setAttribute('href', href);
        href = urlParsingNode.href;
      }

      urlParsingNode.setAttribute('href', href);

      // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
      return {
        href: urlParsingNode.href,
        protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
        host: urlParsingNode.host,
        search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
        hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
        hostname: urlParsingNode.hostname,
        port: urlParsingNode.port,
        pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
                  urlParsingNode.pathname :
                  '/' + urlParsingNode.pathname
      };
    }

    originURL = resolveURL(window.location.href);

    /**
    * Determine if a URL shares the same origin as the current location
    *
    * @param {String} requestURL The URL to test
    * @returns {boolean} True if URL shares the same origin, otherwise false
    */
    return function isURLSameOrigin(requestURL) {
      var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
      return (parsed.protocol === originURL.protocol &&
            parsed.host === originURL.host);
    };
  })() :

  // Non standard browser envs (web workers, react-native) lack needed support.
  (function nonStandardBrowserEnv() {
    return function isURLSameOrigin() {
      return true;
    };
  })()
);

},{"./../utils":30}],27:[function(require,module,exports){
'use strict';

var utils = require('../utils');

module.exports = function normalizeHeaderName(headers, normalizedName) {
  utils.forEach(headers, function processHeader(value, name) {
    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
      headers[normalizedName] = value;
      delete headers[name];
    }
  });
};

},{"../utils":30}],28:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

// Headers whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers
var ignoreDuplicateOf = [
  'age', 'authorization', 'content-length', 'content-type', 'etag',
  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
  'last-modified', 'location', 'max-forwards', 'proxy-authorization',
  'referer', 'retry-after', 'user-agent'
];

/**
 * Parse headers into an object
 *
 * ```
 * Date: Wed, 27 Aug 2014 08:58:49 GMT
 * Content-Type: application/json
 * Connection: keep-alive
 * Transfer-Encoding: chunked
 * ```
 *
 * @param {String} headers Headers needing to be parsed
 * @returns {Object} Headers parsed into an object
 */
module.exports = function parseHeaders(headers) {
  var parsed = {};
  var key;
  var val;
  var i;

  if (!headers) { return parsed; }

  utils.forEach(headers.split('\n'), function parser(line) {
    i = line.indexOf(':');
    key = utils.trim(line.substr(0, i)).toLowerCase();
    val = utils.trim(line.substr(i + 1));

    if (key) {
      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
        return;
      }
      if (key === 'set-cookie') {
        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
      } else {
        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
      }
    }
  });

  return parsed;
};

},{"./../utils":30}],29:[function(require,module,exports){
'use strict';

/**
 * Syntactic sugar for invoking a function and expanding an array for arguments.
 *
 * Common use case would be to use `Function.prototype.apply`.
 *
 *  ```js
 *  function f(x, y, z) {}
 *  var args = [1, 2, 3];
 *  f.apply(null, args);
 *  ```
 *
 * With `spread` this example can be re-written.
 *
 *  ```js
 *  spread(function(x, y, z) {})([1, 2, 3]);
 *  ```
 *
 * @param {Function} callback
 * @returns {Function}
 */
module.exports = function spread(callback) {
  return function wrap(arr) {
    return callback.apply(null, arr);
  };
};

},{}],30:[function(require,module,exports){
'use strict';

var bind = require('./helpers/bind');
var isBuffer = require('is-buffer');

/*global toString:true*/

// utils is a library of generic helper functions non-specific to axios

var toString = Object.prototype.toString;

/**
 * Determine if a value is an Array
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Array, otherwise false
 */
function isArray(val) {
  return toString.call(val) === '[object Array]';
}

/**
 * Determine if a value is an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an ArrayBuffer, otherwise false
 */
function isArrayBuffer(val) {
  return toString.call(val) === '[object ArrayBuffer]';
}

/**
 * Determine if a value is a FormData
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an FormData, otherwise false
 */
function isFormData(val) {
  return (typeof FormData !== 'undefined') && (val instanceof FormData);
}

/**
 * Determine if a value is a view on an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
 */
function isArrayBufferView(val) {
  var result;
  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
    result = ArrayBuffer.isView(val);
  } else {
    result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
  }
  return result;
}

/**
 * Determine if a value is a String
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a String, otherwise false
 */
function isString(val) {
  return typeof val === 'string';
}

/**
 * Determine if a value is a Number
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Number, otherwise false
 */
function isNumber(val) {
  return typeof val === 'number';
}

/**
 * Determine if a value is undefined
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if the value is undefined, otherwise false
 */
function isUndefined(val) {
  return typeof val === 'undefined';
}

/**
 * Determine if a value is an Object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Object, otherwise false
 */
function isObject(val) {
  return val !== null && typeof val === 'object';
}

/**
 * Determine if a value is a Date
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Date, otherwise false
 */
function isDate(val) {
  return toString.call(val) === '[object Date]';
}

/**
 * Determine if a value is a File
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a File, otherwise false
 */
function isFile(val) {
  return toString.call(val) === '[object File]';
}

/**
 * Determine if a value is a Blob
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Blob, otherwise false
 */
function isBlob(val) {
  return toString.call(val) === '[object Blob]';
}

/**
 * Determine if a value is a Function
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Function, otherwise false
 */
function isFunction(val) {
  return toString.call(val) === '[object Function]';
}

/**
 * Determine if a value is a Stream
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Stream, otherwise false
 */
function isStream(val) {
  return isObject(val) && isFunction(val.pipe);
}

/**
 * Determine if a value is a URLSearchParams object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a URLSearchParams object, otherwise false
 */
function isURLSearchParams(val) {
  return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
}

/**
 * Trim excess whitespace off the beginning and end of a string
 *
 * @param {String} str The String to trim
 * @returns {String} The String freed of excess whitespace
 */
function trim(str) {
  return str.replace(/^\s*/, '').replace(/\s*$/, '');
}

/**
 * Determine if we're running in a standard browser environment
 *
 * This allows axios to run in a web worker, and react-native.
 * Both environments support XMLHttpRequest, but not fully standard globals.
 *
 * web workers:
 *  typeof window -> undefined
 *  typeof document -> undefined
 *
 * react-native:
 *  navigator.product -> 'ReactNative'
 */
function isStandardBrowserEnv() {
  if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
    return false;
  }
  return (
    typeof window !== 'undefined' &&
    typeof document !== 'undefined'
  );
}

/**
 * Iterate over an Array or an Object invoking a function for each item.
 *
 * If `obj` is an Array callback will be called passing
 * the value, index, and complete array for each item.
 *
 * If 'obj' is an Object callback will be called passing
 * the value, key, and complete object for each property.
 *
 * @param {Object|Array} obj The object to iterate
 * @param {Function} fn The callback to invoke for each item
 */
function forEach(obj, fn) {
  // Don't bother if no value provided
  if (obj === null || typeof obj === 'undefined') {
    return;
  }

  // Force an array if not already something iterable
  if (typeof obj !== 'object') {
    /*eslint no-param-reassign:0*/
    obj = [obj];
  }

  if (isArray(obj)) {
    // Iterate over array values
    for (var i = 0, l = obj.length; i < l; i++) {
      fn.call(null, obj[i], i, obj);
    }
  } else {
    // Iterate over object keys
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        fn.call(null, obj[key], key, obj);
      }
    }
  }
}

/**
 * Accepts varargs expecting each argument to be an object, then
 * immutably merges the properties of each object and returns result.
 *
 * When multiple objects contain the same key the later object in
 * the arguments list will take precedence.
 *
 * Example:
 *
 * ```js
 * var result = merge({foo: 123}, {foo: 456});
 * console.log(result.foo); // outputs 456
 * ```
 *
 * @param {Object} obj1 Object to merge
 * @returns {Object} Result of all merge properties
 */
function merge(/* obj1, obj2, obj3, ... */) {
  var result = {};
  function assignValue(val, key) {
    if (typeof result[key] === 'object' && typeof val === 'object') {
      result[key] = merge(result[key], val);
    } else {
      result[key] = val;
    }
  }

  for (var i = 0, l = arguments.length; i < l; i++) {
    forEach(arguments[i], assignValue);
  }
  return result;
}

/**
 * Extends object a by mutably adding to it the properties of object b.
 *
 * @param {Object} a The object to be extended
 * @param {Object} b The object to copy properties from
 * @param {Object} thisArg The object to bind function to
 * @return {Object} The resulting value of object a
 */
function extend(a, b, thisArg) {
  forEach(b, function assignValue(val, key) {
    if (thisArg && typeof val === 'function') {
      a[key] = bind(val, thisArg);
    } else {
      a[key] = val;
    }
  });
  return a;
}

module.exports = {
  isArray: isArray,
  isArrayBuffer: isArrayBuffer,
  isBuffer: isBuffer,
  isFormData: isFormData,
  isArrayBufferView: isArrayBufferView,
  isString: isString,
  isNumber: isNumber,
  isObject: isObject,
  isUndefined: isUndefined,
  isDate: isDate,
  isFile: isFile,
  isBlob: isBlob,
  isFunction: isFunction,
  isStream: isStream,
  isURLSearchParams: isURLSearchParams,
  isStandardBrowserEnv: isStandardBrowserEnv,
  forEach: forEach,
  merge: merge,
  extend: extend,
  trim: trim
};

},{"./helpers/bind":20,"is-buffer":31}],31:[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],32:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }

}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }

}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };

},{}],33:[function(require,module,exports){
/**
 * Copyright (c) 2010,2011,2012,2013,2014 Morgan Roderick http://roderick.dk
 * License: MIT - http://mrgnrdrck.mit-license.org
 *
 * https://github.com/mroderick/PubSubJS
 */

(function (root, factory){
    'use strict';

    var PubSub = {};
    root.PubSub = PubSub;

    var define = root.define;

    factory(PubSub);

    // AMD support
    if (typeof define === 'function' && define.amd){
        define(function() { return PubSub; });

        // CommonJS and Node.js module support
    } else if (typeof exports === 'object'){
        if (module !== undefined && module.exports) {
            exports = module.exports = PubSub; // Node.js specific `module.exports`
        }
        exports.PubSub = PubSub; // CommonJS module 1.1.1 spec
        module.exports = exports = PubSub; // CommonJS
    }

}(( typeof window === 'object' && window ) || this, function (PubSub){
    'use strict';

    var messages = {},
        lastUid = -1;

    function hasKeys(obj){
        var key;

        for (key in obj){
            if ( obj.hasOwnProperty(key) ){
                return true;
            }
        }
        return false;
    }

    /**
     * Returns a function that throws the passed exception, for use as argument for setTimeout
     * @alias throwException
     * @function
     * @param { Object } ex An Error object
     */
    function throwException( ex ){
        return function reThrowException(){
            throw ex;
        };
    }

    function callSubscriberWithDelayedExceptions( subscriber, message, data ){
        try {
            subscriber( message, data );
        } catch( ex ){
            setTimeout( throwException( ex ), 0);
        }
    }

    function callSubscriberWithImmediateExceptions( subscriber, message, data ){
        subscriber( message, data );
    }

    function deliverMessage( originalMessage, matchedMessage, data, immediateExceptions ){
        var subscribers = messages[matchedMessage],
            callSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions,
            s;

        if ( !messages.hasOwnProperty( matchedMessage ) ) {
            return;
        }

        for (s in subscribers){
            if ( subscribers.hasOwnProperty(s)){
                callSubscriber( subscribers[s], originalMessage, data );
            }
        }
    }

    function createDeliveryFunction( message, data, immediateExceptions ){
        return function deliverNamespaced(){
            var topic = String( message ),
                position = topic.lastIndexOf( '.' );

            // deliver the message as it is now
            deliverMessage(message, message, data, immediateExceptions);

            // trim the hierarchy and deliver message to each level
            while( position !== -1 ){
                topic = topic.substr( 0, position );
                position = topic.lastIndexOf('.');
                deliverMessage( message, topic, data, immediateExceptions );
            }
        };
    }

    function messageHasSubscribers( message ){
        var topic = String( message ),
            found = Boolean(messages.hasOwnProperty( topic ) && hasKeys(messages[topic])),
            position = topic.lastIndexOf( '.' );

        while ( !found && position !== -1 ){
            topic = topic.substr( 0, position );
            position = topic.lastIndexOf( '.' );
            found = Boolean(messages.hasOwnProperty( topic ) && hasKeys(messages[topic]));
        }

        return found;
    }

    function publish( message, data, sync, immediateExceptions ){
        message = (typeof message === 'symbol') ? message.toString() : message;

        var deliver = createDeliveryFunction( message, data, immediateExceptions ),
            hasSubscribers = messageHasSubscribers( message );

        if ( !hasSubscribers ){
            return false;
        }

        if ( sync === true ){
            deliver();
        } else {
            setTimeout( deliver, 0 );
        }
        return true;
    }

    /**
     * Publishes the message, passing the data to it's subscribers
     * @function
     * @alias publish
     * @param { String } message The message to publish
     * @param {} data The data to pass to subscribers
     * @return { Boolean }
     */
    PubSub.publish = function( message, data ){
        return publish( message, data, false, PubSub.immediateExceptions );
    };

    /**
     * Publishes the the message synchronously, passing the data to it's subscribers
     * @function
     * @alias publishSync
     * @param { String } message The message to publish
     * @param {} data The data to pass to subscribers
     * @return { Boolean }
     */
    PubSub.publishSync = function( message, data ){
        return publish( message, data, true, PubSub.immediateExceptions );
    };

    /**
     * Subscribes the passed function to the passed message. Every returned token is unique and should be stored if you need to unsubscribe
     * @function
     * @alias subscribe
     * @param { String } message The message to subscribe to
     * @param { Function } func The function to call when a new message is published
     * @return { String }
     */
    PubSub.subscribe = function( message, func ){
        if ( typeof func !== 'function'){
            return false;
        }

        message = (typeof message === 'symbol') ? message.toString() : message;

        // message is not registered yet
        if ( !messages.hasOwnProperty( message ) ){
            messages[message] = {};
        }

        // forcing token as String, to allow for future expansions without breaking usage
        // and allow for easy use as key names for the 'messages' object
        var token = 'uid_' + String(++lastUid);
        messages[message][token] = func;

        // return token for unsubscribing
        return token;
    };

    /**
     * Subscribes the passed function to the passed message once
     * @function
     * @alias subscribeOnce
     * @param { String } message The message to subscribe to
     * @param { Function } func The function to call when a new message is published
     * @return { PubSub }
     */
    PubSub.subscribeOnce = function( message, func ){
        var token = PubSub.subscribe( message, function(){
            // before func apply, unsubscribe message
            PubSub.unsubscribe( token );
            func.apply( this, arguments );
        });
        return PubSub;
    };

    /**
     * Clears all subscriptions
     * @function
     * @public
     * @alias clearAllSubscriptions
     */
    PubSub.clearAllSubscriptions = function clearAllSubscriptions(){
        messages = {};
    };

    /**
     * Clear subscriptions by the topic
     * @function
     * @public
     * @alias clearAllSubscriptions
     */
    PubSub.clearSubscriptions = function clearSubscriptions(topic){
        var m;
        for (m in messages){
            if (messages.hasOwnProperty(m) && m.indexOf(topic) === 0){
                delete messages[m];
            }
        }
    };

    /**
     * Removes subscriptions
     *
     * - When passed a token, removes a specific subscription.
     *
	 * - When passed a function, removes all subscriptions for that function
     *
	 * - When passed a topic, removes all subscriptions for that topic (hierarchy)
     * @function
     * @public
     * @alias subscribeOnce
     * @param { String | Function } value A token, function or topic to unsubscribe from
     * @example // Unsubscribing with a token
     * var token = PubSub.subscribe('mytopic', myFunc);
     * PubSub.unsubscribe(token);
     * @example // Unsubscribing with a function
     * PubSub.unsubscribe(myFunc);
     * @example // Unsubscribing from a topic
     * PubSub.unsubscribe('mytopic');
     */
    PubSub.unsubscribe = function(value){
        var descendantTopicExists = function(topic) {
                var m;
                for ( m in messages ){
                    if ( messages.hasOwnProperty(m) && m.indexOf(topic) === 0 ){
                        // a descendant of the topic exists:
                        return true;
                    }
                }

                return false;
            },
            isTopic    = typeof value === 'string' && ( messages.hasOwnProperty(value) || descendantTopicExists(value) ),
            isToken    = !isTopic && typeof value === 'string',
            isFunction = typeof value === 'function',
            result = false,
            m, message, t;

        if (isTopic){
            PubSub.clearSubscriptions(value);
            return;
        }

        for ( m in messages ){
            if ( messages.hasOwnProperty( m ) ){
                message = messages[m];

                if ( isToken && message[value] ){
                    delete message[value];
                    result = value;
                    // tokens are unique, so we can just stop here
                    break;
                }

                if (isFunction) {
                    for ( t in message ){
                        if (message.hasOwnProperty(t) && message[t] === value){
                            delete message[t];
                            result = true;
                        }
                    }
                }
            }
        }

        return result;
    };
}));

},{}],34:[function(require,module,exports){
'use strict';

const RISK_INFO = 0;
const RISK_LOW = 1;
const RISK_MEDIUM = 2;
const RISK_HIGH = 3;

const CONFIDENCE_FALSE_POSITIVE = 0;
const CONFIDENCE_LOW = 1;
const CONFIDENCE_MEDIUM = 2;
const CONFIDENCE_HIGH = 3;
const CONFIDENCE_USER_CONFIRMED = 4;

module.exports = {
  RISK_INFO, RISK_LOW, RISK_MEDIUM, RISK_HIGH, CONFIDENCE_FALSE_POSITIVE,
  CONFIDENCE_LOW, CONFIDENCE_MEDIUM, CONFIDENCE_HIGH,
  CONFIDENCE_USER_CONFIRMED
};

},{}]},{},[1]);

redpajama_set_name: RedPajamaGithub


After a more than year-long political impasse, Congress appears close to a compromise plan to lower student loan interest rates, the New York Times reported Wednesday night.
The Senate compromise brings Congress close to a solution on the student loan interest rate log jam because the plan the upper chamber has cobbled together is very similar to a plan the House passed in May.
Many Senate Democrats had long resisted the idea of tying interest rates to market fluctuations. And they argued that the House Republican plan, and a similar plan in the Senate, would reduce the deficit on the backs of students and eventually lead to higher rates.
But after senators met Tuesday with President Barack Obama, who was worried about ending the impasse, Democrats caved.
Progressive Dems are sure to be disappointed by the accord. When the House passed its student loan interest rate bill a couple of months ago, Sen. Elizabeth Warren (D-Mass.) said the plan "takes a bad situation and makes it worse… Our students should not be a profit center for the government." The Congressional Budget Office has estimated that the Senate plan would save the government $715 million over 10 years.
"I am just trying to get the best deal for students," Harkin said Wednesday, according to Bloomberg.
Congress got itself into this mess in 2007, when it passed a law that gradually lowered interest rates from a fixed 6.8 percent to 3.4 percent over five years, then allowed the rate to shoot back to 6.8 percent in 2012. Last year, no one could agree on a compromise to prevent the rate increase, so lawmakers passed a stopgap measure to extend the 3.4 percent interest rate for a year. This year, when Congress again couldn't reach a compromise, interest rates spiked up to 6.8 percent on July 1. Since then, lawmakers and the White House have been scrambling for a solution.
Alexander said Wednesday he was optimistic the Senate deal would pass the House. "The House can hopefully accept it, send it to the president, and it [can] all be done by the end of the month," he told National Journal. A vote could come by next week.


This week Marvel Entertainment made announcement upon announcement in what effectively garnering interest for some major announcements at San Diego Comic Con. From a gender bent Thor to a Black Captain America and a Superior Iron Man - Marvel has been making waves this week. Today was no exception. Marvel has announced five new release dates for Marvel Studios productions, taking the current roster out to 2019. Thanks to the guys over at Screen Rant we have some speculation as to how this list is shaping up.
This is exciting news for nerds everywhere! Not only is this opening up slots for additional characters to get in the spotlight, but with some to the story changes rumored to be coming down the pipeline there is potential for some really good stories to be played out on the big screen. These announcements have far reaching ramifications to not only Comics, but movies and video games as well. The impact to the entertainment industry is nothing short of seismic. Some people have speculated that people are all Marvel'd out, but - at least for the foreseeable future - It looks like super heroes are here to stay. Check out the image below for a hint at some of the possible changes. Image Credit: Marvel Entertainment and Entertainment weekly I find myself wondering if this era in movie history will be referred to as "The Golden Age Of Nerddom." How do these changes sit with you? Are there any characters in particular make it to the big screen? Do you think these announcements are giving the folks over at DC Comics agida? Let us know what you think in the comments below!
Home Articles Marvel Is Really Ramping Things Up!


text:
Q: Haskell STM and retry When we run a STM expression which hits retry, the thread is blocked and the transaction is run once again if the entries are modified.
But I was wondering :

*

*If we read a STM variable which, in that specific branch leading to retry, is not actually used , would updating it try to perform the transaction again ?

*While the thread is blocked, is it really blocked ? or is it recycled in a thread pool to be used by other potentially waiting operations ?

A: *

*Yes. Reading STM variable will invoke stmReadTVar - see here. This will generate new entry in transaction record and it will be checked on commit. If you take a look here you will find that ReadTVarOp marked as an operation with side effect (has_side_effects = True) so I don't think compiler will eliminate it regardless will you use it result or not.

*As @WillSewell wrote Haskell uses green threads. You can even use STM in single-threaded runtime without worry that the actual OS thread will be blocked.

A: Re. 1: as I understand your question, yes that is correct; your entire STM transaction will have a consistent view of the world including branches composed with orElse (see: https://ghc.haskell.org/trac/ghc/ticket/8680). But I'm not sure what you mean by "but my transaction actually depends on the value of just 1 variable"; if you do a readTVar then changes to that var will be tracked.
Re. 2: you can think of green threads as lumps of saved computation state that are stored in a stack-like thing and popped off, run for a bit, and put back onto the stack when they can't make further progress for the time being ("blocked") or after they've run for long enough.  The degree to which this happens in parallel depends on the number of OS threads you tell the runtime to use (via +RTS -N). You can have a concurrent program that uses thousands of green threads but is only run with a single OS thread, and that's perfectly fine.

redpajama_set_name: RedPajamaStackExchange


Currently, my house is filled with sweet scents. Sniff.... ahhh.... Last night, I put in a new round of my wallflowers around the house. I just love these home fragrances from Bath and Body Works, and whenever I use them, I find myself a little happier in my surroundings.
....And from the looks of things, there are even more wonderful new seasonal fragrances for this coming fall at Bath n' Body. Ah, sweetness.