{"version":3,"sources":["webpack:///./app/scripts/components/OtherCandidate.js","webpack:///./app/scripts/components/Contest.tsx","webpack:///./app/scripts/election-utils.js","webpack:///./config/modern-polyfills.js","webpack:///./app/scripts/packs/countdown.js","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./app/scripts/kickstart.js","webpack:///./app/scripts/components/AsyncComponent.js","webpack:///./app/scripts/components/Address.js","webpack:///./app/scripts/components/Portal.js","webpack:///./app/scripts/utils/noop.js","webpack:///./app/scripts/components/Typeahead.js","webpack:///./app/scripts/locator.js","webpack:///./app/scripts/utils/legislative-districts.js","webpack:///./app/scripts/utils/load-json-script.js","webpack:///./app/scripts/packs/main.js","webpack:///./app/scripts/components/PartyPill.js","webpack:///./app/scripts/components/CandidateRow.js","webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/components/PureComponent.js","webpack:///./app/scripts/utils/get-json.js"],"names":["OtherCandidate","isViewable","candidateCount","onClick","classes","cx","class","xlinkHref","apnumber","converter","PreactHTMLConverter","Contest","Component","constructor","super","this","state","viewAllDemocraticCandidates","viewAllRepublicanCandidates","onViewableToggle","bind","party","setState","prevState","render","ballot","flag","notes","statewideRace","visibleCandidateCount","renderCandidate","democrat","filter","candidate","republican","console","log","contest","caption","office_name","office","office_desc","label","district","IsFlagged","IsNoted","IsDemocrat","length","IsRepublican","convert","scope","colspan","map","idx","value","defaultProps","require","today","moment","registerToVoteDeadline","earlyVotingDeadline","texasPrimaries","registerToVoteDiff","diff","earlyVotingDeadlineDiff","texasPrimariesDiff","registerToVoteSlot","document","querySelector","earlyVotingSlot","texasPrimariesSlot","registerToVoteNote","earlyVotingNote","texasPrimariesNote","textContent","className","pluralize","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","window","ttData","relatedContentContainer","getElementById","gutenTag","then","default","RelatedContent","title","ribbonContainer","Ribbon","AdLoader","init","asyncComponent","importComponent","PreactComponent","component","componentDidMount","m","props","Address","PureComponent","data","isLoaded","fetchAddress","componentDidUpdate","prevProps","fips","county","slug","toLowerCase","replace","getJSON","process","admin_title","name","href","web_site","phone_number","Portal","renderPortal","componentWillUnmount","defaultNode","body","removeChild","node","portal","createElement","appendChild","children","Typeahead","highlightedIndex","isOpen","handleOnBlur","handleOnClear","handleOnFocus","handleOnInput","debouncedHandleOnInput","debounce","debounceDuration","handleKeyDown","setInputRef","setMenuRef","setItemRef","listRefs","_","count","getFilteredItems","Boolean","maybeScrollItemIntoView","element","inputRef","menuRef","itemNode","menuNode","scrollIntoView","onlyScrollIfNeeded","items","shouldItemRender","sortItems","item","sort","a","b","highlightItemOnMouseEnter","selectItemOnClick","getItemValue","onSelect","blur","renderList","ref","onMouseDown","event","preventDefault","cloneElement","renderItem","onMouseEnter","el","renderAttribution","onClear","onBlur","inputProps","onFocus","target","onChange","keyEvents","key","call","renderInput","role","String","autocomplete","onInput","onKeyDown","type","aria-label","aria-hidden","noop","ArrowDown","itemsCount","newIndex","ArrowUp","Enter","keyCode","select","setSelectionRange","Escape","sessionToken","google","maps","places","AutocompleteSessionToken","autocompleteService","AutocompleteService","bounds","east","west","south","north","componentRestrictions","country","types","AsyncDistrictViewer","App","coordinates","lookupError","lookupPending","results","handleGeocode","debouncedHandleGeocode","placesService","PlacesService","input","Promise","reject","getPlacePredictions","predict","status","getPredictions","catch","placeId","getDetails","fields","result","lat","latitude","lng","longitude","geometry","location","toJSON","includeGeography","LOOKUP_URL","lookup","addressFeedback","for","placeholder","description","place_id","isHighlighted","src","us_house","point","sboe","tx_senate","tx_house","loadJsonScript","elementId","getAttribute","JSON","parse","just_statewide","office_type","Array","from","Set","number","toString","forEach","each_office","each_note","viewAllCandidates","CandidateRow","partyName","ballotName","candidate_name","isIncumbent","incumbent","isDropout","drop_out","PartyPill","excludeInitial","style","partyPrefix","slice","partyInitial","toUpperCase","capfirst","rowClass","excludePartyInitial","func","wait","immediate","timeout","args","context","timestamp","later","last","Date","now","setTimeout","apply","arguments","callNow","shallowEqual","shouldComponentUpdate","jsonResponse","res","ok","statusText","json","fetch"],"mappings":"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OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,gBAAiB,OACjB,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,UAAW,OACX,aAAc,OACd,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OA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","file":"main.d1c5529f15.mjs","sourcesContent":["import cx from 'classnames';\nimport { h } from 'preact';\nimport { apnumber } from 'journalize';\n\nfunction OtherCandidate({ isViewable, candidateCount, onClick }) {\n  const classes = cx('candidate race__candidate-row', {\n    'race__candidate-row--hidden': !isViewable,\n  });\n\n  return (\n    <tr class={classes}>\n      <td\n        class=\"candidate__cell candidate__party t-align-center\"\n        onClick={onClick}\n      >\n        <svg class=\"icon icon-angle-down\">\n          <use xlinkHref=\"#icon-angle-down\" />\n        </svg>\n      </td>\n      <th class=\"candidate__cell candidate__name\">\n        <button onClick={onClick}>Show {apnumber(candidateCount)} more </button>\n      </th>\n    </tr>\n  );\n}\n\nexport default OtherCandidate;\n","import { Component, h } from 'preact';\nimport { PreactHTMLConverter } from 'preact-html-converter';\nimport OtherCandidate from './OtherCandidate';\n\nimport { getStatewideDisplay} from '../election-utils';\n\nconst converter = PreactHTMLConverter();\n\nclass Contest extends Component {\n  constructor() {\n    super();\n\n    this.state = { \n      viewAllDemocraticCandidates: true,\n      viewAllRepublicanCandidates: true, \n    };\n    this.onViewableToggle = this.onViewableToggle.bind(this);\n  }\n\n  onViewableToggle(party) {\n    if (party === 'democrat') {\n      this.setState(prevState => ({\n        viewAllDemocraticCandidates: !prevState.viewAllDemocraticCandidates, // set viewAllCandidates to what is wasn't before\n      }));\n    }\n\n    if (party === 'republican') {\n      this.setState(prevState => ({\n        viewAllRepublicanCandidates: !prevState.viewAllRepublicanCandidates, // set viewAllCandidates to what is wasn't before\n      }));\n    }\n  };\n\n  render(\n    { ballot, flag, notes, statewideRace, visibleCandidateCount, renderCandidate}, \n    { viewAllDemocraticCandidates, viewAllRepublicanCandidates }\n  ) {\n\n    const democrat = ballot.filter(\n      candidate => candidate.party == 'Democratic'\n    );\n    const republican = ballot.filter(\n      candidate => candidate.party == 'Republican'\n    );\n\n    console.log(viewAllDemocraticCandidates)\n    console.log(viewAllRepublicanCandidates)\n\n   \n\n    const caption =  getStatewideDisplay(ballot)\n\n    const IsFlagged = (flag) ? true : false;\n    const IsNoted= (notes) ? true : false;\n\n    const IsDemocrat = (democrat.length > 0) ? true : false;\n    const IsRepublican = (republican.length > 0) ? true : false;\n\n    return (\n      <div class=\"seat\">\n         {statewideRace && (\n            <h3 class=\"seat__title\">{caption}</h3>\n          )}\n        \n        {IsFlagged == true && (\n          <div class=\"seat__flag\">\n            <p class=\"office__flag\">\n              <span class=\"gold-star\">★</span>Race to watch\n            </p>\n            <p class=\"seat__flag__text\">{converter.convert(flag)}</p></div>\n        )}\n        <div class=\"seat__races\">\n          {IsDemocrat == true && (\n            <div class=\"seat__race seat__race--Democrat\">\n              <div class=\"race\">\n                <h4 class=\"race__title\">Democrat</h4>\n                <table class=\"race__candidates\">\n                  <thead>\n                    <tr>\n                      {' '}\n                      <th\n                        scope=\"col\"\n                        class=\"race__candidate-header\"\n                        colspan=\"2\"\n                      >\n                        Candidates{' '}\n                      </th>{' '}\n                    </tr>\n                  </thead>\n                  <tbody>\n                    {democrat.map((candidate: any, idx: any) =>\n                      renderCandidate(candidate, idx, viewAllDemocraticCandidates)\n                    )}\n                    {democrat.length > visibleCandidateCount && (\n                      <OtherCandidate\n                        isViewable={!viewAllDemocraticCandidates}\n                        candidateCount={democrat.length - visibleCandidateCount}\n                        onClick={() => { this.onViewableToggle('democrat') }}\n                      /> )}\n                  </tbody>\n\n                  {/* Take out the ! before viewAllDemocraticCandidates to add toggle for more candidates back and change viewAllDemocraticCandidates to false */}\n                  {democrat.length > visibleCandidateCount && !viewAllDemocraticCandidates && (\n                    <tr\n                        class=\"candidate race__candidate-row\">\n                      <td\n                        class=\"candidate__cell candidate__party t-align-center\"\n                        onClick={() => { this.onViewableToggle('democrat') }}\n                      >\n                        <svg class=\"icon icon-angle-up\">\n                          <use xlinkHref=\"#icon-angle-up\" />\n                        </svg>\n                      </td>\n                      <th class=\"candidate__cell candidate__name\">\n                        <button onClick={() => { this.onViewableToggle('democrat') }}>\n                          Show fewer candidates{' '}\n                        </button>\n                      </th>\n                    </tr>\n                  )}\n                </table>\n              </div>\n            </div>\n          )}\n\n          {IsRepublican == true && (\n            <div class=\"seat__race seat__race--Republican\">\n              <div class=\"race\">\n                <h4 class=\"race__title\">Republican</h4>\n                <table class=\"race__candidates\">\n                  <thead>\n                    <tr>\n                      {' '}\n                      <th\n                       \n                        scope=\"col\"\n                        class=\"race__candidate-header\"\n                        colspan=\"2\"\n                      \n                      >\n                        Candidates{' '}\n                      </th>{' '}\n                    </tr>\n                  </thead>\n                  <tbody>\n                    {republican.map((candidate: any, idx: any) =>\n                      renderCandidate(candidate, idx, viewAllRepublicanCandidates)\n                    )}\n                    {republican.length > visibleCandidateCount && (\n                      <OtherCandidate\n                        isViewable={!viewAllRepublicanCandidates}\n                        candidateCount={republican.length - visibleCandidateCount}\n                        onClick={() => { this.onViewableToggle('republican') }}\n                      /> )}\n                  </tbody>\n                  {/* Take out the ! before viewAllRepublicanCandidates to add toggle for more candidates back and change viewAllRepublicanCandidates to false */}\n                  {republican.length > visibleCandidateCount && !viewAllRepublicanCandidates && (\n                    <tr\n                        class=\"candidate race__candidate-row\">\n                      <td\n                        class=\"candidate__cell candidate__party t-align-center\"\n                        onClick={() => { this.onViewableToggle('republican') }}\n                      \n                      >\n                        <svg class=\"icon icon-angle-up\">\n                          <use xlinkHref=\"#icon-angle-up\" />\n                        </svg>\n                      </td>\n                      <th class=\"candidate__cell candidate__name\">\n                        <button onClick={() => { this.onViewableToggle('republican') }}>\n                          Show fewer candidates{' '}\n                        </button>\n                      </th>\n                    </tr>\n                  )}\n                </table>\n              </div>\n            </div>\n          )}\n        </div>\n\n        {IsNoted == true && !statewideRace && (\n          <p class=\"note__text\">{converter.convert(notes)}</p>\n        )}\n\n        {IsNoted == true && statewideRace && (\n          <p class=\"note__text\">{converter.convert(notes.value)}</p>\n        )}\n      </div>\n    );\n  }\n}\n\nContest.defaultProps = {\n  statewideRace: false,\n  visibleCandidateCount: 4,\n};\n\nexport default Contest;\n","import { capfirst } from 'journalize';\n\nconst getDivisionDisplay = contest =>\n  `${capfirst(contest.division_type)} ${(contest.division_type !==\n    'statewide' &&\n    contest.district) ||\n    ''}`.trim();\n\nconst getContestDisplay = contest => {\n  if (contest.division_type === 'statewide') {\n    return contest.office;\n  }\n\n  return `${contest.office} ${getDivisionDisplay(contest)}`;\n};\n\nconst getStatewideDisplay = contest => {\n  if (\n    contest[0].office_name === 'President' ||\n    contest[0].office_name === 'U.S. Senate' ||\n    contest[0].office_name === 'Railroad Commissioner'\n  ) {\n    return contest[0].office;\n  } else if (\n    contest[0].office_name === 'Chief Justice, Supreme Court of Texas'\n  ) {\n    return `${contest[0].office} ${contest[0].office_desc}`;\n  } else {\n    return `${contest[0].office} ${contest[0].label} ${contest[0].district}`;\n  }\n};\n\nconst createContestSlug = contest => {\n  const parts = [contest.office_slug];\n\n  if (contest.division_type !== 'statewide') {\n    parts.push(`-${contest.district}`);\n  }\n\n  parts.push(`-${contest.party.slice(0, 3)}`);\n\n  return parts.join('');\n};\n\nexport function changePartyName(contest) {\n  var name = contest == 'Democratic' ? 'Democrat' : 'Republican';\n  return name;\n}\n\nexport {\n  createContestSlug,\n  getContestDisplay,\n  getDivisionDisplay,\n  getStatewideDisplay,\n};\n","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","import * as moment from 'moment';\nimport { pluralize } from 'journalize';\n\nlet today = moment();\n\n// change these if the dates change\n// the format moments of the date must match the format you tell moment\nlet registerToVoteDeadline = moment('2020-02-03', 'YYYY-MM-DD'),\n  earlyVotingDeadline = moment('2020-02-18', 'YYYY-MM-DD'),\n  texasPrimaries = moment('2020-03-03', 'YYYY-MM-DD');\n\n// we add one day because the day of each deadline also counts\nlet registerToVoteDiff = registerToVoteDeadline.diff(today, 'days') + 1,\n  earlyVotingDeadlineDiff = earlyVotingDeadline.diff(today, 'days') + 1,\n  texasPrimariesDiff = texasPrimaries.diff(today, 'days') + 1;\n\n// select days containers\nlet registerToVoteSlot = document.querySelector('#register-to-vote-slot'),\n  earlyVotingSlot = document.querySelector('#early-voting-slot'),\n  texasPrimariesSlot = document.querySelector('#texas-primaries-slot');\n\n// select notes containers\nlet registerToVoteNote = document.querySelector('#register-to-vote-note'),\n  earlyVotingNote = document.querySelector('#early-voting-note'),\n  texasPrimariesNote = document.querySelector('#texas-primaries-note');\n\n// if the deadlines have passed, set the text content to 0 days\nif (registerToVoteDiff <= 0) {\n  registerToVoteSlot.textContent = '0 days';\n  registerToVoteSlot.className += ' date-passed';\n  registerToVoteNote.className += ' date-passed';\n} else if (registerToVoteDiff == 1) {\n  registerToVoteSlot.textContent = 'Today';\n  registerToVoteNote.textContent = 'is the registration deadline';\n} else {\n  registerToVoteSlot.textContent = `${registerToVoteDiff} day${pluralize(\n    registerToVoteDiff\n  )}`;\n}\n\nif (earlyVotingDeadlineDiff <= 0) {\n  earlyVotingSlot.textContent = '0 days';\n  earlyVotingSlot.className += ' date-passed';\n  earlyVotingNote.className += ' date-passed';\n} else {\n  earlyVotingSlot.textContent = `${earlyVotingDeadlineDiff} day${pluralize(\n    earlyVotingDeadlineDiff\n  )}`;\n}\n\nif (texasPrimariesDiff <= 0) {\n  texasPrimariesSlot.textContent = '0 days';\n  texasPrimariesSlot.className += ' date-passed';\n  texasPrimariesNote.className += ' date-passed';\n} else {\n  texasPrimariesSlot.textContent = `${texasPrimariesDiff} day${pluralize(\n    texasPrimariesDiff\n  )}`;\n}\n","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","import { h, render } from 'preact';\n\n// just in case this gets removed\nwindow.ttData = window.ttData || {};\n\n// related content\nconst relatedContentContainer = document.getElementById(\n  'related-content-container'\n);\n\nif (relatedContentContainer && window.ttData.gutenTag) {\n  import(\n    /* webpackChunkName: \"RelatedContent\" */ './components/RelatedContent'\n  ).then(({ default: RelatedContent }) =>\n    render(\n      <RelatedContent title={'Read more'} gutenTag={window.ttData.gutenTag} />,\n      relatedContentContainer\n    )\n  );\n}\n\n// trending ribbon\nconst ribbonContainer = document.getElementById('ribbon-container');\n\nif (ribbonContainer) {\n  import(\n    /* webpackChunkName: \"Ribbon\" */ './components/Ribbon'\n  ).then(({ default: Ribbon }) => render(<Ribbon />, ribbonContainer));\n}\n\n// ads\nimport(/* webpackChunkName: \"ads\" */ './utils/ad-loader').then(\n  ({ default: AdLoader }) => {\n    const ads = new AdLoader();\n    ads.init();\n  }\n);\n","import { Component as PreactComponent, h } from 'preact';\n\nfunction resolve(m) {\n  return m && m.default ? m.default : m;\n}\n\nfunction asyncComponent(importComponent) {\n  return class extends PreactComponent {\n    constructor() {\n      super();\n\n      this.state = { component: null };\n    }\n\n    componentDidMount() {\n      importComponent().then(component =>\n        this.setState({ component: resolve(component) })\n      );\n    }\n\n    render() {\n      const { component: Component } = this.state;\n\n      return Component ? <Component {...this.props} /> : null;\n    }\n  };\n}\n\nexport default asyncComponent;\n","import { h } from 'preact';\n\nimport getJSON from '../utils/get-json';\n\nimport PureComponent from './PureComponent';\n\nclass Address extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = { data: null, isLoaded: false };\n  }\n\n  componentDidMount() {\n    this.fetchAddress();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.fips !== prevProps.fips) {\n      this.fetchAddress();\n    }\n  }\n\n  fetchAddress() {\n    const { county } = this.props;\n    const slug = county.toLowerCase().replace(/\\s+/g, '');\n\n    getJSON(`${process.env.PUBLIC_PATH}api/counties/${slug}.json`).then(data =>\n      this.setState({ data, isLoaded: true })\n    );\n  }\n\n  render() {\n    const { county } = this.props;\n    const { data, isLoaded } = this.state;\n\n    if (!isLoaded) return null;\n\n    return (\n      <p class=\"copy\">\n        Because you shared your location with us, we were able to determine you\n        are in <span class=\"font-weight-bold\">{county} County</span>. Your\n        primary election contact is{' '}\n        <span class=\"font-weight-bold\">\n          {data.admin_title} {data.name}\n        </span>\n        . To learn more about your local races,{' '}\n        <a href={data.web_site}>you can visit the county's website</a>, or call\n        the election office at{' '}\n        <span class=\"font-weight-bold\">{data.phone_number}</span>.\n      </p>\n    );\n  }\n}\n\nexport default Address;\n","import { Component, render } from 'preact';\n\nclass Portal extends Component {\n  componentDidMount() {\n    this.renderPortal();\n  }\n\n  componentWillUnmount() {\n    if (this.defaultNode) {\n      document.body.removeChild(this.defaultNode);\n    } else {\n      // Unmount the children rendered in custom node\n      render(null, this.props.node, this.portal);\n    }\n\n    this.defaultNode = null;\n    this.portal = null;\n  }\n\n  componentDidUpdate() {\n    this.renderPortal();\n  }\n\n  renderPortal() {\n    if (!this.props.node && !this.defaultNode) {\n      this.defaultNode = document.createElement('div');\n      document.body.appendChild(this.defaultNode);\n    }\n\n    const children = this.props.children;\n\n    this.portal = render(\n      (children && children[0]) || null,\n      this.props.node || this.defaultNode,\n      this.portal\n    );\n  }\n\n  render() {\n    return null;\n  }\n}\n\nexport default Portal;\n","export default () => {};\n","// packages\nimport { cloneElement, Component, h } from 'preact';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n// internal\nimport debounce from '../utils/debounce';\nimport noop from '../utils/noop';\n\nclass Typeahead extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      highlightedIndex: null,\n      isOpen: false,\n    };\n\n    this.handleOnBlur = this.handleOnBlur.bind(this);\n    this.handleOnClear = this.handleOnClear.bind(this);\n    this.handleOnFocus = this.handleOnFocus.bind(this);\n    this.handleOnInput = this.handleOnInput.bind(this);\n    this.debouncedHandleOnInput = debounce(\n      this.handleOnInput,\n      this.props.debounceDuration\n    );\n    this.handleKeyDown = this.handleKeyDown.bind(this);\n    this.setInputRef = this.setInputRef.bind(this);\n    this.setMenuRef = this.setMenuRef.bind(this);\n    this.setItemRef = this.setItemRef.bind(this);\n\n    this.listRefs = {};\n  }\n\n  static getDerivedStateFromProps(_, prevState) {\n    if (prevState.highlightedIndex == null) {\n      return { highlightedIndex: 0 };\n    }\n  }\n\n  componentDidUpdate() {\n    const { highlightedIndex } = this.state;\n    const count = this.getFilteredItems(this.props).length;\n\n    if (Boolean(highlightedIndex) && highlightedIndex >= count) {\n      this.setState({ highlightedIndex: 0 });\n    }\n\n    this.maybeScrollItemIntoView();\n  }\n\n  setInputRef(element) {\n    this.inputRef = element;\n  }\n\n  setMenuRef(element) {\n    this.menuRef = element;\n  }\n\n  setItemRef(element, idx) {\n    this.listRefs[`item-${idx}`] = element;\n  }\n\n  maybeScrollItemIntoView() {\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (isOpen && highlightedIndex != null) {\n      const itemNode = this.listRefs[`item-${this.state.highlightedIndex}`];\n      const menuNode = this.menuRef;\n\n      if (itemNode && menuNode) {\n        scrollIntoView(itemNode, menuNode, {\n          onlyScrollIfNeeded: true,\n        });\n      }\n    }\n  }\n\n  getFilteredItems(props) {\n    let { items } = props;\n\n    const { shouldItemRender, sortItems } = props;\n\n    if (shouldItemRender) {\n      items = items.filter(item => shouldItemRender(item, props.value));\n    }\n\n    if (sortItems) {\n      items = items.sort((a, b) => sortItems(a, b, props.value));\n    }\n\n    return items;\n  }\n\n  highlightItemOnMouseEnter(highlightedIndex) {\n    this.setState({ highlightedIndex });\n  }\n\n  selectItemOnClick(item) {\n    const { getItemValue, onSelect } = this.props;\n\n    const value = getItemValue(item);\n\n    this.setState(\n      {\n        highlightedIndex: null,\n        isOpen: false,\n      },\n      () => {\n        this.inputRef.blur();\n        onSelect(value, item);\n      }\n    );\n  }\n\n  renderList() {\n    const { highlightedIndex } = this.state;\n    const props = this.props;\n\n    if (!props.value) return null;\n\n    const items = this.getFilteredItems(props);\n\n    return (\n      <ul\n        class=\"listbox\"\n        ref={this.setMenuRef}\n        onMouseDown={event => event.preventDefault()}\n      >\n        {items.map((item, idx) => {\n          return cloneElement(\n            props.renderItem(item, idx === highlightedIndex),\n            {\n              onClick: () => this.selectItemOnClick(item),\n              onMouseEnter: () => this.highlightItemOnMouseEnter(idx),\n              ref: el => this.setItemRef(el, idx),\n            }\n          );\n        })}\n        {items.length > 0 && props.renderAttribution()}\n      </ul>\n    );\n  }\n\n  handleOnClear(event) {\n    this.setState({ isOpen: false });\n\n    this.props.onClear(event);\n  }\n\n  handleOnBlur() {\n    this.setState({ isOpen: false });\n\n    const { onBlur } = this.props.inputProps;\n    if (onBlur) onBlur(event);\n  }\n\n  handleOnFocus(event) {\n    const { value } = this.props;\n\n    if (value.length > 0) this.setState({ isOpen: true });\n\n    const { onFocus } = this.props.inputProps;\n    if (onFocus) onFocus(event);\n  }\n\n  handleOnInput(event) {\n    const { value } = event.target;\n\n    this.props.onChange(value, event);\n\n    if (value.length <= 0) {\n      this.setState({ highlightedIndex: null });\n    }\n  }\n\n  handleKeyDown(event) {\n    const { isOpen } = this.state;\n\n    if (isOpen && Typeahead.keyEvents[event.key]) {\n      Typeahead.keyEvents[event.key].call(this, event);\n    } else if (!isOpen) {\n      this.setState({ isOpen: true });\n    }\n  }\n\n  render() {\n    const { inputProps, onClear, renderInput, value } = this.props;\n    const { isOpen } = this.state;\n\n    return (\n      <div class=\"typeahead\">\n        <div class=\"typeahead__input-wrapper\">\n          {renderInput({\n            ...inputProps,\n            role: 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-expanded': String(isOpen),\n            autocomplete: 'off',\n            onBlur: this.handleOnBlur,\n            onFocus: this.handleOnFocus,\n            onInput: this.handleOnInput,\n            onKeyDown: this.handleKeyDown,\n            value,\n            ref: this.setInputRef,\n          })}\n          {onClear && value && (\n            <button\n              onClick={this.handleOnClear}\n              type=\"button\"\n              class=\"close\"\n              aria-label=\"Clear\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n          )}\n        </div>\n        {isOpen && this.renderList()}\n      </div>\n    );\n  }\n}\n\nTypeahead.defaultProps = {\n  debounceDuration: 150,\n  inputProps: {},\n  onChange: noop,\n  onClear: noop,\n  onSelect: noop,\n  renderInput: props => <input {...props} />,\n  value: '',\n};\n\nTypeahead.keyEvents = {\n  ArrowDown(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex < itemsCount - 1\n        ? highlightedIndex + 1\n        : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  ArrowUp(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex > 0 ? highlightedIndex - 1 : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  Enter(event) {\n    // not the right kind of Enter, abort\n    if (event.keyCode !== 13) return;\n\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (!isOpen) {\n      // the menu is not open\n      return;\n    } else if (highlightedIndex == null) {\n      // input has control, but there's nothing selected\n      this.setState({ isOpen: false }, () => this.inputRef.select());\n    } else {\n      // the input has control and we have an item\n      event.preventDefault();\n\n      const item = this.getFilteredItems(this.props)[highlightedIndex];\n      const value = this.props.getItemValue(item);\n\n      this.setState(\n        {\n          highlightedIndex: null,\n          isOpen: false,\n        },\n        () => {\n          this.inputRef.setSelectionRange(value.length, value.length);\n          this.props.onSelect(value, item);\n        }\n      );\n    }\n  },\n\n  Escape() {\n    this.setState({\n      highlightedIndex: null,\n      isOpen: false,\n    });\n  },\n};\n\nexport default Typeahead;\n","import cx from 'classnames';\nimport { h, Component } from 'preact';\nimport debounce from './utils/debounce';\n\nimport asyncComponent from './components/AsyncComponent';\nimport Address from './components/Address';\n\nimport Portal from './components/Portal';\nimport Typeahead from './components/Typeahead';\nimport { lookup } from './utils/legislative-districts';\n\nconst addressContainer = document.getElementById('address-container');\n\nconst sessionToken = new google.maps.places.AutocompleteSessionToken();\nconst autocompleteService = new google.maps.places.AutocompleteService();\n\nconst bounds = {\n  east: -93.514764,\n  west: -106.662177,\n  south: 25.843902,\n  north: 36.500199,\n};\n\nconst componentRestrictions = { country: 'us' };\n\nconst types = ['geocode'];\n\nconst getPredictions = input => {\n  return new Promise((resolve, reject) => {\n    autocompleteService.getPlacePredictions(\n      { bounds, componentRestrictions, input, sessionToken, types },\n      (predict, status) => {\n        if (status === 'OK') resolve(predict);\n\n        reject(new Error('No results found.'));\n      }\n    );\n  });\n};\n\n// always render what's provided, the geocoder decides\nconst shouldItemRender = () => true;\n\nconst AsyncDistrictViewer = asyncComponent(() =>\n  import(\n    /* webpackPrefetch: true, webpackChunkName: \"DistrictViewer\" */ './components/DistrictViewer'\n  )\n);\n\nclass App extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      coordinates: null,\n      data: null,\n      lookupError: false,\n      lookupPending: false,\n      results: [],\n      value: '',\n    };\n\n    this.handleGeocode = this.handleGeocode.bind(this);\n    this.debouncedHandleGeocode = debounce(this.handleGeocode, 300);\n    this.onChange = this.onChange.bind(this);\n    this.onClear = this.onClear.bind(this);\n    this.onSelect = this.onSelect.bind(this);\n  }\n\n  componentDidMount() {\n    this.placesService = new google.maps.places.PlacesService(this.inputRef);\n\n    // \"geometry\" : {\n    //   \"location\" : {\n    //      \"lat\" : 30.1834109,\n    //      \"lng\" : -94.39445189999999\n    //   }\n    // }\n\n    // const coordinates = { latitude: 30.1834109, longitude: -94.3944519 };\n\n    // lookup(coordinates).then(({ data }) =>\n    //   this.setState({ coordinates, data })\n    // );\n  }\n\n  onClear(value) {\n    this.setState({ value: '' });\n  }\n\n  onChange(value) {\n    this.setState({ value }, this.debouncedHandleGeocode);\n  }\n\n  handleGeocode() {\n    const { value: input } = this.state;\n\n    getPredictions(input)\n      .then(results => this.setState({ results }))\n      .catch(() => this.setState({ results: [] }));\n  }\n\n  onSelect({ name, placeId }) {\n    this.setState({ lookupError: false, lookupPending: true, value: name });\n\n    this.placesService.getDetails(\n      {\n        fields: ['geometry.location'],\n        placeId,\n        sessionToken,\n      },\n      result => {\n        const {\n          lat: latitude,\n          lng: longitude,\n        } = result.geometry.location.toJSON();\n\n        const coordinates = { latitude, longitude };\n\n        lookup(coordinates)\n          .then(({ data }) => {\n            this.setState({ coordinates, data, lookupPending: false });\n          })\n          .catch(() =>\n            this.setState({\n              data: null,\n              lookupError: true,\n              lookupPending: false,\n            })\n          );\n      }\n    );\n  }\n\n  render() {\n    const {\n      coordinates,\n      data,\n      lookupError,\n      lookupPending,\n      results,\n      value,\n    } = this.state;\n\n    let addressFeedback = null;\n\n    if (lookupPending) {\n      addressFeedback = (\n        <p class=\"copy\">\n          Finding your details...{' '}\n          <svg class=\"icon icon-spinner animate-pulse\">\n            <use xlinkHref=\"#icon-spinner\" />\n          </svg>\n        </p>\n      );\n    }\n\n    if (lookupError) {\n      addressFeedback = (\n        <p class=\"copy\">\n          Hmm... we were unable to find you in Texas. Please check your address\n          and try again!\n        </p>\n      );\n    }\n\n    if (coordinates && !lookupPending && !lookupError) {\n      addressFeedback = (\n        <p class=\"copy\">\n          We found your information! The ballot information has been\n          personalized for you.\n        </p>\n      );\n    }\n\n    return (\n      <div class=\"address-input\">\n        <svg class=\"icon icon-drawn-left-arrow\">\n          <use xlinkHref=\"#icon-drawn-left-arrow\"></use>\n        </svg>\n        <label class=\"address-input__label\" for=\"address-input\">\n          Enter your address to learn about your ballot\n        </label>\n        <Typeahead\n          inputProps={{\n            id: 'address-input',\n            class: 'address-input__input',\n            placeholder: '1010 Colorado St, Austin, TX, 78701',\n          }}\n          items={results}\n          getItemValue={item => ({\n            name: item.description,\n            placeId: item.place_id,\n          })}\n          value={value}\n          onChange={this.onChange}\n          onClear={this.onClear}\n          onSelect={this.onSelect}\n          renderItem={(item, isHighlighted) => (\n            <li\n              class={cx('listbox__item', {\n                'listbox__item--highlighted': isHighlighted,\n              })}\n              key={item.id}\n            >\n              {item.description}\n            </li>\n          )}\n          renderAttribution={() => (\n            <li class=\"listbox__item listbox__item--attribution\">\n              <img src=\"assets/images/powered-by-google.png\" />\n            </li>\n          )}\n          shouldItemRender={shouldItemRender}\n          renderInput={props => (\n            <input\n              {...props}\n              ref={el => {\n                props.ref(el);\n                this.inputRef = el;\n              }}\n            />\n          )}\n        />\n        <div id=\"address-feedback\"></div>\n\n        <Portal node={document.getElementById('address-feedback')}>\n          {addressFeedback}\n        </Portal>\n\n        <Portal node={document.getElementById('map-container')}>\n          {data && (\n            <div class=\"representative-districts\">\n              <AsyncDistrictViewer\n                key=\"us-house\"\n                name=\"U.S. House\"\n                slug=\"us-house\"\n                district={data.us_house.district}\n                point={coordinates}\n              />\n              <AsyncDistrictViewer\n                key=\"state-board-of-education\"\n                name=\"State Board of Education\"\n                slug=\"state-board-of-education\"\n                district={data.sboe.district}\n                point={coordinates}\n              />\n              <AsyncDistrictViewer\n                key=\"texas-senate\"\n                name=\"Texas Senate\"\n                slug=\"texas-senate\"\n                district={data.tx_senate.district}\n                point={coordinates}\n              />\n              <AsyncDistrictViewer\n                key=\"texas-house\"\n                name=\"Texas House\"\n                slug=\"texas-house\"\n                district={data.tx_house.district}\n                point={coordinates}\n              />\n            </div>\n          )}\n        </Portal>\n\n        <Portal node={document.getElementById('local-candidates-info')}>\n          {data && (\n            <span>\n              <Address\n                key={data.county.fips}\n                county={data.county.name}\n                fips={data.county.fips}\n              />\n            </span>\n          )}\n        </Portal>\n      </div>\n    );\n  }\n}\n\nexport default App;\n","import getJSON from './get-json';\n\nconst LOOKUP_URL = ({ latitude, longitude, includeGeography = false }) =>\n  `https://dv-dev.texastribune.org/legislative-lookup/?latitude=${latitude}&longitude=${longitude}`;\n\nexport function lookup({ latitude, longitude }) {\n  return getJSON(LOOKUP_URL({ latitude, longitude }));\n}\n","/**\n * Grabs the contents of a `jsonScript` created JSON inline string and returns\n * it as a JSON object. If the element does not exist, or if the script\n * element does not have the JSON MIME type, null is returned instead.\n *\n * @param  {String} elementId the ID of the JSON script element\n * @return {Object|null}\n */\nexport default function loadJsonScript(elementId) {\n  const element = document.getElementById(elementId);\n\n  if (element && element.getAttribute('type') === 'application/json') {\n    return JSON.parse(element.textContent);\n  } else {\n    return null;\n  }\n}\n","// import JS files\nimport '../kickstart';\nimport './countdown';\n\nimport { h, render } from 'preact';\nimport App from '../locator';\nimport Contest from '../components/Contest';\nimport CandidateRow from '../components/CandidateRow';\nimport loadJsonScript from '../utils/load-json-script';\n\nconst ballot = loadJsonScript('ballot_data');\n\nconst notes = loadJsonScript('notes_data');\n\nconst slugify = contest => {\n  return contest\n    .toString()\n    .toLowerCase()\n    .replace(/\\s+/g, '-') // Replace spaces with -\n    .replace(/[^\\w\\-]+/g, '') // Remove all non-word chars\n    .replace(/\\-\\-+/g, '-') // Replace multiple - with single -\n    .replace(/^-+/, '') // Trim - from start of text\n    .replace(/-+$/, ''); // Trim - from end of text\n};\n\nrender(<App />, document.getElementById('app'));\n\nconst just_statewide = ballot.filter(\n  office =>\n    (office.office_type == 'Federal' && office.office != 'U.S. House') ||\n    office.office_type == 'Statewide'\n);\n\nconst statewide_offices_slugged = Array.from(\n  new Set(just_statewide.map(number => number.office_name))\n).map(id => {\n  return {\n    name: id,\n    slug: slugify(id),\n  };\n});\n\nstatewide_offices_slugged.forEach(element => {\n  var each_office = just_statewide.filter(\n    item => item.office_name === element.name\n  );\n\n  var each_note = notes.filter(item => item.type === element.slug);\n\n  const visibleCandidateCount = 4;\n\n  render(\n    <Contest\n      ballot={each_office}\n      notes={each_note[0]}\n      statewideRace\n      visibleCandidateCount={visibleCandidateCount}\n      renderCandidate={(candidate, idx, viewAllCandidates) => (\n        <CandidateRow\n          partyName={candidate.party}\n          candidate={candidate}\n          ballotName={candidate.candidate_name}\n          isIncumbent={candidate.incumbent}\n          isDropout={candidate.drop_out}\n          isViewable={viewAllCandidates || idx < visibleCandidateCount}\n        />\n      )}\n    />,\n    document.getElementById('statewide__contests')\n  );\n});\n","import { capfirst } from 'journalize';\nimport cx from 'classnames';\nimport { h } from 'preact';\n\nfunction PartyPill({ excludeInitial, party, style }) {\n  const partyPrefix = party.slice(0, 3).toLowerCase();\n  const partyInitial = party[0].toUpperCase();\n\n  const classes = cx('circle-pill', `pill--${partyPrefix}`);\n\n  return (\n    <span class={classes} style={style} title={capfirst(party)}>\n      {!excludeInitial && partyInitial}\n    </span>\n  );\n}\n\nPartyPill.defaultProps = {\n  excludeInitial: false,\n};\n\nexport default PartyPill;\n","import { h } from 'preact';\n\nimport PartyPill from './PartyPill';\n\nfunction CandidateRow({\n  partyName,\n  ballotName,\n  isIncumbent,\n  isViewable,\n  isDropout,\n}) {\n  let rowClass = 'candidate race__candidate-row';\n\n  if (!isViewable) {\n    rowClass += ' race__candidate-row--hidden';\n  }\n\n  return (\n    <tr class={rowClass}>\n      <td class=\"candidate__cell candidate__party\">\n        <PartyPill party={partyName} />\n      </td>\n\n      <th scope=\"row\" class=\"candidate__cell candidate__name\">\n        {ballotName}{' '}\n        {isIncumbent == 'Yes' && (\n          <span class=\"pill pill--basic\" title=\"Currently holds this seat\">\n            Incumbent\n          </span>\n        )}\n        {isDropout == true && (\n          <span class=\"dropped_out\" title=\"Currently holds this seat\">\n            (dropped out)\n          </span>\n        )}\n      </th>\n    </tr>\n  );\n}\n\nCandidateRow.defaultProps = {\n  excludePartyInitial: false,\n  isViewable: true,\n  isDropout: false,\n};\n\nexport default CandidateRow;\n","export default function debounce(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n\n  var later = function() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      }\n    }\n  };\n\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n}\n","import { Component } from 'preact';\n\nfunction shallowEqual(a, b) {\n  for (let key in a) {\n    if (a[key] !== b[key]) {\n      return false;\n    }\n  }\n\n  for (let key in b) {\n    if (!(key in a)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nclass PureComponent extends Component {\n  shouldComponentUpdate(props, state) {\n    return !(\n      shallowEqual(props, this.props) && shallowEqual(state, this.state)\n    );\n  }\n}\n\nexport default PureComponent;\n","/**\n * A wrapper for the initial response from a fetch call that funnels to\n * res.json().\n *\n * @private\n * @param {Response} res\n * @returns {Promise}\n */\nfunction jsonResponse(res) {\n  if (!res.ok) throw new Error(`${res.status}: ${res.statusText}`);\n\n  return res.json();\n}\n\n/**\n * A light wrapper around fetch that assumes you're seeking a JSON response.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise}\n */\nexport default function getJSON(input, init) {\n  return fetch(input, init).then(jsonResponse);\n}\n"],"sourceRoot":""}