{"version":3,"sources":["components/text-input-modal/TextInputModal.js","components/cli-tutor-mode/CliTutorMode.js","icons/StrokeDecentralization.js","components/address/Address.js","peers/WorldMap/StaticMap.svg","components/popover/Popover.js","components/identicon/Identicon.js","components/cid/Cid.js","peers/WorldMap/WorldMap.js","peers/PeersTable/PeersTable.js","peers/AddConnection/AddConnection.js","peers/PeersPage.js","components/modal/Modal.js","components/tour/withTour.js","components/shell/Shell.js","components/overlay/Overlay.js","icons/StrokeCode.js","icons/StrokeDownload.js"],"names":["TextInputModal","props","onChange","event","val","target","value","onInputChange","setState","onSubmit","validate","state","onKeyPress","key","defaultValue","this","t","onCancel","className","mustBeDifferent","Icon","submitText","description","title","loading","error","required","inputClass","type","bg","onClick","disabled","isDisabled","style","width","margin","React","Component","defaultProps","withTranslation","CliTutorialModal","command","onLeave","downloadConfig","maxWidth","StrokeCode","lineHeight","cliCommandList","cliCmdKeys","UPDATE_IPFS_CONFIG","startsWith","cliCmdPrefixes","PIN_OBJECT","height","cmd","navigator","clipboard","writeText","then","connect","filesPage","isCliTutorModeEnabled","isCliTutorModalOpen","config","showIcon","doOpenCliTutorModal","show","url","window","URL","createObjectURL","Blob","link","document","createElement","display","href","download","body","appendChild","click","revokeObjectURL","StrokeDecentralization","viewBox","d","Address","buffer","ma","Multiaddr","protos","protoNames","concat","parts","toString","split","map","chunk","i","includes","length","Popover","children","top","right","bottom","left","align","handleMouseEnter","handleMouseLeave","classNames","aria-hidden","onMouseEnter","onMouseLeave","identiconPalette","colors","navy","aqua","gray","charcoal","red","yellow","teal","green","Identicon","size","cid","string","palette","cidStartAndEnd","chars","start","slice","join","end","Cid","forwardRef","ref","identicon","Object","assign","textDecoration","marginLeft","calculateWidth","windowWidth","calculateHeight","innerHeight","PeersCount","peers","GeoPath","projection","d3","scale","Math","PI","translate","precision","path","getDotsSize","numberOfDots","getDotsColor","MapPins","peersCoordinates","el","ReactFauxDOM","attr","forEach","peerIds","coordinates","append","datum","pointRadius","on","relatedTarget","node","toReact","PeerInfo","ids","allPeers","peerLocationsForSwarm","filter","peerId","isWindows","useMemo","appVersion","indexOf","sort","a","b","address","localeCompare","peer","index","number","code","flagCode","svg","latency","selectedPeers","doSetSelectedPeers","useState","innerWidth","setWidth","setHeight","selectedTimeout","setSelectedTimeout","useEffect","debouncedHandleResize","debounce","addEventListener","removeEventListener","handleMapPinMouseEnter","useCallback","element","clearTimeout","getBBox","x","y","handleMapPinMouseLeave","setTimeout","handlePopoverMouseEnter","background","staticMapSrc","backgroundSize","backgroundColor","PeersTable","flagRenderer","isPrivate","locationCellRenderer","rowData","createRef","location","isNearby","text","onCopy","copyFeedback","latencyCellRenderer","cellData","peerIdCellRenderer","p2pMultiaddr","protocolsCellRenderer","protocols","replaceAll","connectionCellRenderer","direction","renderDirection","connection","rowClassRenderer","shouldAddHoverEffect","sortBy","sortDirection","SortDirection","ASC","bind","sortedList","sortByProperty","disableHeight","headerClassName","rowClassName","rowInfo","headerHeight","rowHeight","rowCount","rowGetter","label","cellRenderer","dataKey","i18n","tag","current","parentNode","msg","innerText","replaceChild","ms","seconds","AddConnection","open","hasErrored","toggleModal","addConnection","maddr","doConnectSwarm","getDescription","Button","color","Overlay","isIPFS","peerMultiaddr","withTour","toursEnabled","handleJoyrideCallback","data-id","Helmet","CliTutorMode","ADD_NEW_PEER","Box","run","steps","peersTour","getSteps","styles","callback","continuous","scrollToFirstStep","locale","getJoyrideLocales","showProgress","ModalActions","justify","ModalBody","Modal","WrappedComponent","WithTour","data","doDisableTours","action","status","STATUS","FINISHED","Shell","hidden","renderBackdrop","onKeyDown","e","stopPropagation","nativeEvent","stopImmediatePropagation","onBackdropClick","cx","cy","r","StrokeDownload"],"mappings":"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","file":"static/js/11.c292deac.chunk.js","sourcesContent":["import React from 'react'\nimport PropTypes from 'prop-types'\nimport Button from '../button/Button'\nimport { Modal, ModalActions, ModalBody } from '../modal/Modal'\nimport ComponentLoader from '../../loader/ComponentLoader'\nimport { withTranslation } from 'react-i18next'\n\nclass TextInputModal extends React.Component {\n  static propTypes = {\n    onCancel: PropTypes.func.isRequired,\n    onSubmit: PropTypes.func.isRequired,\n    onChange: PropTypes.func,\n    onInputChange: PropTypes.func,\n    title: PropTypes.string.isRequired,\n    Icon: PropTypes.func.isRequired,\n    description: PropTypes.node,\n    submitText: PropTypes.string,\n    validate: PropTypes.func,\n    defaultValue: PropTypes.string,\n    mustBeDifferent: PropTypes.bool,\n    loading: PropTypes.bool\n  }\n\n  static defaultProps = {\n    className: '',\n    defaultValue: '',\n    submitText: 'Save',\n    mustBeDifferent: false\n  }\n\n  constructor (props) {\n    super(props)\n    this.state = { value: props.defaultValue }\n  }\n\n  onChange = (event) => {\n    let val = event.target.value\n\n    if (this.props.onChange) {\n      val = this.props.onChange(val)\n    }\n\n    this.props.onInputChange && this.props.onInputChange(val)\n\n    this.setState({ value: val })\n  }\n\n  onSubmit = () => {\n    if (!this.props.validate ||\n      (this.props.validate && this.props.validate(this.state.value))) {\n      this.props.onSubmit(this.state.value)\n    }\n  }\n\n  onKeyPress = (event) => {\n    if (event.key === 'Enter') {\n      this.onSubmit()\n    }\n  }\n\n  get inputClass () {\n    if (!this.props.validate ||\n      this.state.value === '' ||\n      (this.props.mustBeDifferent && this.state.value === this.props.defaultValue)) {\n      return ''\n    }\n\n    if (this.props.error) {\n      return 'b--red-muted focus-outline-red'\n    }\n\n    if (this.props.validate(this.state.value)) {\n      return 'b--green-muted focus-outline-green'\n    }\n\n    return 'b--red-muted focus-outline-red'\n  }\n\n  get isDisabled () {\n    if (this.state.value === '' ||\n      (this.props.mustBeDifferent && this.state.value === this.props.defaultValue)) {\n      return true\n    }\n\n    if (!this.props.validate) {\n      return false\n    }\n\n    return !this.props.validate(this.state.value)\n  }\n\n  render () {\n    const {\n      t,\n      onCancel,\n      onChange,\n      onInputChange,\n      mustBeDifferent,\n      onSubmit,\n      className,\n      Icon,\n      submitText,\n      validate,\n      defaultValue,\n      description,\n      title,\n      error,\n      loading,\n      ...props\n    } = this.props\n\n    return (\n      <Modal {...props} className={className} onCancel={onCancel}>\n        <ModalBody title={title} Icon={Icon}>\n          { description && typeof description === 'object' && description }\n\n          { description && typeof description === 'string' &&\n            <p className='charcoal w-90 tl center'>{description}</p>\n          }\n\n          <input\n            onChange={this.onChange}\n            onKeyPress={this.onKeyPress}\n            value={this.state.value}\n            required\n            className={`input-reset charcoal ba b--black-20 br1 pa2 mb2 db w-90 center focus-outline ${this.inputClass}`}\n            type='text' />\n        </ModalBody>\n\n        <ModalActions>\n          <Button className='ma2 tc' bg='bg-gray' onClick={onCancel}>{t('actions.cancel')}</Button>\n          <Button className='ma2 tc' bg='bg-teal' disabled={this.isDisabled} onClick={this.onSubmit}>{submitText}</Button>\n        </ModalActions>\n\n        { loading && (\n          <div className=\"flex items-center justify-center absolute top-0 left-0 right-0 bottom-0\">\n            <div className=\"absolute top-0 left-0 right-0 bottom-0 bg-light-gray o-80\"/>\n            <ComponentLoader style={{ width: '50%', margin: 'auto' }} />\n          </div>\n        ) }\n      </Modal>\n    )\n  }\n}\n\nexport default withTranslation('app')(TextInputModal)\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'redux-bundler-react'\n\n// Components\nimport { Modal, ModalBody, ModalActions } from '../modal/Modal'\nimport StrokeCode from '../../icons/StrokeCode'\nimport Button from '../button/Button'\nimport Overlay from '../overlay/Overlay'\nimport Shell from '../shell/Shell'\nimport StrokeDownload from '../../icons/StrokeDownload'\nimport { cliCmdKeys, cliCommandList, cliCmdPrefixes } from '../../bundles/files/consts'\n\nexport const CliTutorialModal = ({ command, t, onLeave, className, downloadConfig, ...props }) => {\n  const onClickCopyToClipboard = (cmd) => {\n    navigator.clipboard.writeText(cmd).then(() => {\n      onLeave()\n    })\n  }\n\n  return (\n    <Modal {...props} className={className} onCancel={onLeave} style={{ maxWidth: '40em' }}>\n      <ModalBody Icon={StrokeCode}>\n        <p className='charcoal w-80 center' style={{ lineHeight: '1.3' }}>\n          {t('app:cliModal.description')}\n        </p>\n        <p className='charcoal-muted w-90 center'>\n          { command && command === cliCommandList[cliCmdKeys.UPDATE_IPFS_CONFIG]() ? t('settings:cliModal.extraNotesJsonConfig') : ''}\n          { command && command.startsWith(cliCmdPrefixes.PIN_OBJECT) ? t('files:cliModal.extraNotesPinning') : ''}\n        </p>\n        <div>\n          <Shell className='tl' title=\"Shell\">\n            <code className='db'><b className='no-select'>$ </b>{command}</code>\n          </Shell>\n        </div>\n      </ModalBody>\n\n      <ModalActions>\n        <div>\n          <Button className='ma2 tc' bg='bg-gray' onClick={onLeave}>{t('app:actions.close')}</Button>\n        </div>\n        <div className='flex items-center'>\n          {\n            command && command === cliCommandList[cliCmdKeys.UPDATE_IPFS_CONFIG]()\n              ? <StrokeDownload onClick={downloadConfig} className='dib fill-link pointer' style={{ height: 38 }}\n              /> : <div />\n          }\n          <Button className='ma2 tc' onClick={() => onClickCopyToClipboard(command)}>\n            {t('app:actions.copy')}\n          </Button>\n        </div>\n      </ModalActions>\n    </Modal>\n  )\n}\n\nconst CliTutorMode = ({\n  t, filesPage, isCliTutorModeEnabled, onLeave, isCliTutorModalOpen, command, config, showIcon, doOpenCliTutorModal\n}) => {\n  const downloadConfig = (config) => {\n    const url = window.URL.createObjectURL(new Blob([config]))\n    const link = document.createElement('a')\n    link.style.display = 'none'\n    link.href = url\n    link.download = 'settings.json'\n    document.body.appendChild(link)\n    link.click()\n    window.URL.revokeObjectURL(url)\n  }\n\n  if (isCliTutorModeEnabled) {\n    if (filesPage) {\n      return <CliTutorialModal className='outline-0' onLeave={onLeave} t={t} command={command}/>\n    }\n    return (\n      <Fragment>\n        {\n          showIcon\n            ? <StrokeCode onClick={() => doOpenCliTutorModal(true)} className='dib fill-link pointer mh2' style={{ height: 44 }}/>\n            : <div/>\n        }\n        <Overlay show={isCliTutorModalOpen} onLeave={() => doOpenCliTutorModal(false)}>\n          <CliTutorialModal className='outline-0' onLeave={() => doOpenCliTutorModal(false)} t={t} command={command}\n            downloadConfig={() => downloadConfig(config)}/>\n        </Overlay>\n      </Fragment>\n    )\n  }\n\n  return null\n}\n\nCliTutorialModal.propTypes = {\n  onLeave: PropTypes.func.isRequired,\n  t: PropTypes.func.isRequired,\n  command: PropTypes.string.isRequired\n}\n\nCliTutorialModal.defaultProps = {\n  className: ''\n}\n\nexport default connect(\n  'doOpenCliTutorModal',\n  'selectIsCliTutorModalOpen',\n  'selectIsCliTutorModeEnabled',\n  CliTutorMode\n)\n","import React from 'react'\n\nconst StrokeDecentralization = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M90 39.9a4.75 4.75 0 0 0-5.4-3.9 4.66 4.66 0 0 0-2.18 1l-8.25-5.41a4.59 4.59 0 0 0 .11-2 4.81 4.81 0 0 0-.25-.94l5.3-4.33a1.22 1.22 0 0 0 .17.15 4.67 4.67 0 0 0 2.78.91 4.79 4.79 0 0 0 3.85-2 4.75 4.75 0 0 0-4.58-7.48 4.74 4.74 0 0 0-4 5.43c0 .13.07.26.1.39l-5.59 4.57a4.69 4.69 0 0 0-3.26-.69 4.85 4.85 0 0 0-.63.16L58.16 11.6c.06-.07.12-.12.17-.19a4.68 4.68 0 0 0 .85-3.53 4.76 4.76 0 1 0-4 5.43c.14 0 .26-.07.4-.1L65.77 27.5a4.73 4.73 0 0 0-.86 3.5c0 .15.07.29.1.43L50 41.13l-.17-.13a4.73 4.73 0 0 0-3.53-.84 4.75 4.75 0 0 0-.7 9.21l.4 25.88a4.73 4.73 0 0 0-2.14 1.53L19.4 67.92a6.35 6.35 0 0 0 0-.87 4.73 4.73 0 0 0-1.9-3.1 4.75 4.75 0 1 0-2.79 8.59 4.73 4.73 0 0 0 3.71-1.81L42.8 79.6a5 5 0 0 0 .05.86c0 .16.08.31.12.46l-10.3 6.75-.14-.13a4.73 4.73 0 0 0-3.53-.85 4.75 4.75 0 0 0 .73 9.44 4.84 4.84 0 0 0 .75-.06 4.73 4.73 0 0 0 3.94-5.43 3.43 3.43 0 0 0-.11-.46l10.3-6.75a4.64 4.64 0 0 0 3.67 1 4.75 4.75 0 0 0 3.61-2.82l12 1a4.73 4.73 0 1 0 .24-3l-12-1A4.73 4.73 0 0 0 49 75.22l-.4-25.93a4.72 4.72 0 0 0 3.13-5.22c0-.14-.08-.28-.11-.42l15-9.66c.06 0 .11.11.17.15a4.7 4.7 0 0 0 3.53.85 4.8 4.8 0 0 0 2.19-1l8.24 5.41a4.74 4.74 0 1 0 9.25.5zM16.88 69.41A2.75 2.75 0 0 1 12 68.22a2.75 2.75 0 0 1 2.28-3.14 3.25 3.25 0 0 1 .44 0 2.73 2.73 0 0 1 1.6.52 2.69 2.69 0 0 1 1.1 1.79 2.73 2.73 0 0 1-.54 2.02zm51.2 9.34a3.11 3.11 0 0 1 .43 0 2.74 2.74 0 0 1 1.61.52 2.69 2.69 0 0 1 1.1 1.73 2.75 2.75 0 1 1-3.14-2.28zM80.07 19A2.74 2.74 0 0 1 85 20.18a2.7 2.7 0 0 1-.49 2 2.75 2.75 0 0 1-3.84.61A2.74 2.74 0 0 1 79.58 21a2.7 2.7 0 0 1 .49-2zm-27.19-8.16a2.74 2.74 0 0 1 1.18-4.93 3.27 3.27 0 0 1 .44 0 2.75 2.75 0 1 1-1.62 5zM32 93a2.75 2.75 0 0 1-3.84.61 2.77 2.77 0 0 1-1.16-1.8 2.73 2.73 0 0 1 .5-2 2.69 2.69 0 0 1 1.79-1.09 2.09 2.09 0 0 1 .43 0 2.68 2.68 0 0 1 1.61.53A2.74 2.74 0 0 1 32 93zm18.29-13.7a2.74 2.74 0 1 1-3.18-2.3 3.13 3.13 0 0 1 .43 0 2.75 2.75 0 0 1 2.71 2.29zm-1-32.86a2.77 2.77 0 0 1-1.8 1.1 2.71 2.71 0 0 1-2-.5 2.74 2.74 0 0 1-1.1-1.79 2.71 2.71 0 0 1 .5-2 2.74 2.74 0 0 1 1.79-1.1 3.11 3.11 0 0 1 .43 0 2.74 2.74 0 0 1 1.61.52 2.69 2.69 0 0 1 1.1 1.8 2.75 2.75 0 0 1-.56 1.96zM70 33a2.75 2.75 0 1 1 2.29-3.14A2.75 2.75 0 0 1 70 33zm15.77 10.35a2.75 2.75 0 0 1-3.14-2.28 2.74 2.74 0 1 1 3.14 2.28z' />\n  </svg>\n)\n\nexport default StrokeDecentralization\n","import React from 'react'\nimport Multiaddr from 'multiaddr'\n\nconst Address = ({ value }) => {\n  if (!value) return null\n\n  // future-proofing interop for multiaddr > 8.x\n  value = value.buffer || value\n\n  const ma = Multiaddr(value)\n  const protos = ma.protoNames().concat(['ipfs', 'p2p'])\n  const parts = ma.toString().split('/')\n\n  return (\n    <div className='charcoal-muted monospace'>\n      {parts.map((chunk, i) => (\n        <span key={i}>\n          <span className={protos.includes(chunk) ? 'force-select' : 'force-select charcoal'}>{chunk}</span>\n          {i < parts.length - 1 ? '/' : ''}\n        </span>\n      ))}\n    </div>\n  )\n}\n\nexport default Address\n","export default __webpack_public_path__ + \"static/media/StaticMap.18043dc8.svg\";","import React from 'react'\nimport PropTypes from 'prop-types'\nimport classNames from 'classnames'\nimport './Popover.css'\n\nconst Popover = ({ show, children, top, right, bottom, left, align, handleMouseEnter, handleMouseLeave }) => {\n  return (\n    <div className={ classNames('popover absolute bg-white shadow-3', align && `popover--align-${align}`) }\n      aria-hidden={ show ? 'false' : 'true' } style={{\n        ...(top && { top }),\n        ...(right && { right }),\n        ...(bottom && { bottom }),\n        ...(left && { left })\n      }}\n      onMouseEnter={ handleMouseEnter }\n      onMouseLeave={ handleMouseLeave }\n    >\n      <div className=\"pa2\">\n        { children }\n      </div>\n    </div>\n  )\n}\n\nPopover.propTypes = {\n  show: PropTypes.bool,\n  top: PropTypes.string,\n  right: PropTypes.string,\n  bottom: PropTypes.string,\n  left: PropTypes.string,\n  align: PropTypes.string,\n  handleMouseEnter: PropTypes.func,\n  handleMouseLeave: PropTypes.func\n}\n\nPopover.defaultProps = {\n  show: false\n}\n\nexport default Popover\n","import React from 'react'\nimport ReactIdenticon from 'react-identicons'\nimport { colors } from 'ipfs-css/theme.json'\n\nconst identiconPalette = [colors.navy, colors.aqua, colors.gray, colors.charcoal, colors.red, colors.yellow, colors.teal, colors.green]\n\nconst Identicon = ({ size = 14, cid, className = 'v-btm' }) => <ReactIdenticon string={cid} size={size} palette={identiconPalette} className={className} />\n\nexport default Identicon\n","import React from 'react'\nimport Identicon from '../identicon/Identicon'\n\nexport function cidStartAndEnd (value) {\n  const chars = value.split('')\n  if (chars.length <= 9) return value\n  const start = chars.slice(0, 4).join('')\n  const end = chars.slice(chars.length - 4).join('')\n  return {\n    value,\n    start,\n    end\n  }\n}\n\nexport function shortCid (value) {\n  const { start, end } = cidStartAndEnd(value)\n  return `${start}…${end}`\n}\n\nconst Cid = React.forwardRef(({ value, title, style, identicon = false, ...props }, ref) => {\n  style = Object.assign({}, {\n    textDecoration: 'none',\n    marginLeft: identicon ? '5px' : null\n  }, style)\n  const { start, end } = cidStartAndEnd(value)\n  return (\n    <abbr title={title || value} style={style} ref={ref} {...props}>\n      { identicon && <Identicon cid={value} className='mr2' /> }\n      <span>\n        <span>{start}</span>\n        <span className='o-20'>…</span>\n        <span>{end}</span>\n      </span>\n    </abbr>\n  )\n})\n\nexport default Cid\n","import React, { useCallback, useState, useMemo, useEffect } from 'react'\nimport ReactFauxDOM from 'react-faux-dom'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\nimport * as d3 from 'd3'\nimport CountryFlag from 'react-country-flag'\nimport { debounce } from 'redux-bundler'\n\nimport staticMapSrc from './StaticMap.svg'\n\nimport Address from '../../components/address/Address'\nimport Popover from '../../components/popover/Popover'\n\n// Styles\nimport './WorldMap.css'\nimport Cid from '../../components/cid/Cid'\n\nconst calculateWidth = (windowWidth) => {\n  // the d3 generated svg width includes a lot of ocean, that we crop for now, as it looks weird.\n  const svgWidthOversizeFactor = 1.7\n  // remove a constant amount for the chrome that surronds the map.\n  const sidebarAndPadding = 350\n  const availableWidth = windowWidth - sidebarAndPadding\n  const width = availableWidth * svgWidthOversizeFactor\n  // if the map gets too big the dots get lost in the dot grid, also it just overloads the viewers brain.\n  if (width > 3000) {\n    return 3000\n  }\n  // if the map gets too small it becomes illegible. There will be some map cropping on mobile.\n  if (width < 700) {\n    return 700\n  }\n\n  return width\n}\n\nconst calculateHeight = (width) => {\n  if (width > 960) {\n    if (window.innerHeight < 940) {\n      return (window.innerHeight - 180) * 0.6\n    }\n    return width * 0.273\n  }\n\n  return width * 0.5\n}\n\nconst WorldMap = ({ t, className, selectedPeers, doSetSelectedPeers }) => {\n  const [width, setWidth] = useState(calculateWidth(window.innerWidth))\n  const [height, setHeight] = useState(calculateHeight(width))\n  const [selectedTimeout, setSelectedTimeout] = useState(null)\n\n  useEffect(() => {\n    const debouncedHandleResize = debounce(() => {\n      const width = calculateWidth(window.innerWidth)\n      setWidth(width)\n      setHeight(calculateHeight(width))\n    }, 100)\n\n    window.addEventListener('resize', debouncedHandleResize)\n\n    return () => window.removeEventListener('resize', debouncedHandleResize)\n  })\n\n  const handleMapPinMouseEnter = useCallback((peerIds, element) => {\n    if (!element) return\n\n    clearTimeout(selectedTimeout)\n\n    const { x, y, width, height } = element.getBBox()\n\n    doSetSelectedPeers({ peerIds, left: `${x + width / 2}px`, top: `${y - height / 2}px` })\n  }, [doSetSelectedPeers, selectedTimeout])\n\n  const handleMapPinMouseLeave = useCallback(() => {\n    setSelectedTimeout(\n      setTimeout(() => doSetSelectedPeers({}), 600)\n    )\n  }, [doSetSelectedPeers])\n\n  const handlePopoverMouseEnter = useCallback(() => clearTimeout(selectedTimeout), [selectedTimeout])\n\n  return (\n    <div className=\"flex flex-column\">\n      <div className={`relative ${className}`}>\n        <div className='mb1 flex flex-column items-center'>\n          <div className=\"relative no-events\" style={{ width, height, background: `transparent url(${staticMapSrc}) center no-repeat`, backgroundSize: 'auto 100%' }}>\n            <GeoPath width={width} height={height}>\n              { ({ path }) => (\n                <MapPins width={width} height={height} path={path} handleMouseEnter={ handleMapPinMouseEnter } handleMouseLeave= { handleMapPinMouseLeave } />\n              )}\n            </GeoPath>\n            { selectedPeers?.peerIds && (\n              <Popover show={ !!(selectedPeers.top && selectedPeers.left) } top={ selectedPeers.top } left={ selectedPeers.left } align='bottom'\n                handleMouseEnter={ handlePopoverMouseEnter } handleMouseLeave={ handleMapPinMouseLeave }>\n                <PeerInfo ids={ selectedPeers.peerIds } t={t}/>\n              </Popover>)\n            }\n          </div>\n        </div>\n        <div className='no-events absolute bottom-0 left-0 right-0'>\n          <div className='flex flex-auto flex-column items-center self-end pb5-ns no-select'>\n            <div className='f1 fw5 black'><PeersCount /></div>\n            <div className='f4 b ttu charcoal-muted'>{t('app:terms.peers')}</div>\n          </div>\n        </div>\n      </div>\n      <div className='relative flex justify-end pt2 pb4'>\n        <div className='f6 p2 no-select flex items-center'>\n          <span className='f6 charcoal-muted pr3'>{t('app:terms.peers')}: </span>\n          <i className='mapDotExplanation mr1' style={{ width: getDotsSize(1) * 2, height: getDotsSize(1) * 2, backgroundColor: getDotsColor(1) }}></i>1-10\n          <i className='mapDotExplanation ml3 mr1' style={{ width: getDotsSize(50) * 2, height: getDotsSize(50) * 2, backgroundColor: getDotsColor(50) }}></i> 10-100\n          <i className='mapDotExplanation ml3 mr1' style={{ width: getDotsSize(110) * 2, height: getDotsSize(110) * 2, backgroundColor: getDotsColor(110) }}></i>100+\n        </div>\n      </div>\n    </div>\n  )\n}\n\nconst PeersCount = connect('selectPeers', ({ peers }) => peers ? peers.length : 0)\n\nconst GeoPath = ({ width, height, children }) => {\n  // https://github.com/d3/d3-geo/blob/master/README.md#geoEquirectangular\n  const projection = d3.geoEquirectangular()\n    .scale(height / Math.PI)\n    .translate([width / 2, height / 2])\n    .precision(0.1)\n  // https://github.com/d3/d3-geo/blob/master/README.md#paths\n  const path = d3.geoPath().projection(projection)\n\n  return children({ path })\n}\n\nconst getDotsSize = (numberOfDots) => {\n  if (numberOfDots < 10) return 5\n  if (numberOfDots < 100) return 8\n  return 10\n}\n\nconst getDotsColor = (numberOfDots) => {\n  if (numberOfDots < 10) return 'rgba(150, 204, 255, 0.6)'\n  if (numberOfDots < 100) return 'rgba(53, 126, 221, 0.6)'\n  return 'rgba(53, 126, 221, 0.8)'\n}\n\n// Just the dots on the map, this gets called a lot.\nconst MapPins = connect('selectPeersCoordinates', ({ width, height, path, peersCoordinates, handleMouseEnter, handleMouseLeave }) => {\n  const el = d3.select(ReactFauxDOM.createElement('svg'))\n    .attr('width', width)\n    .attr('height', height)\n    .attr('viewBox', `0 0 ${width} ${height}`)\n\n  peersCoordinates.forEach(({ peerIds, coordinates }) => {\n    el.append('path')\n      .datum({\n        type: 'Point',\n        coordinates: coordinates\n      })\n      .attr('d', path.pointRadius(() => getDotsSize(peerIds.length)))\n      .attr('fill', () => getDotsColor(peerIds.length))\n      .attr('class', 'mapDot')\n      .on('mouseenter', () => handleMouseEnter(peerIds, d3.event.relatedTarget))\n      .on('mouseleave', () => handleMouseLeave())\n  })\n\n  return el.node().toReact()\n})\n\nconst MAX_PEERS = 5\n\nconst PeerInfo = connect('selectPeerLocationsForSwarm', ({ ids, peerLocationsForSwarm: allPeers, t }) => {\n  if (!allPeers) return null\n\n  const peers = allPeers.filter(({ peerId }) => ids.includes(peerId))\n\n  if (!peers.length) return null\n\n  const isWindows = useMemo(() => window.navigator.appVersion.indexOf('Win') !== -1, [])\n\n  return (\n    <div className=\"f6 flex flex-column justify-center\">\n      { peers.sort((a, b) => a.address.localeCompare(b.address)).map((peer, index) => {\n        if (index === MAX_PEERS && peers.length > MAX_PEERS) {\n          return (<div className=\"f7 pa1 self-end\" key=\"worldmap-more-label\">{t('plusPeers', { number: peers.length - MAX_PEERS })}</div>)\n        }\n\n        if (index > MAX_PEERS) return null\n\n        return (\n          <div className=\"pa2 f7 flex items-center monospace\" key={peer.peerId}>\n            <CountryFlag className='mr1' code={peer.flagCode} svg={isWindows}/>\n            <div className=\"flex flex-auto items-center\">\n              <Address value={ peer.address }/>\n              <span className=\"charcoal-muted\">/p2p/</span>\n              <Cid value={peer.peerId}/>\n            </div>\n            <span className=\"gray ml1\"> ({peer.latency || '???'}ms)</span>\n          </div>\n        )\n      }) }\n    </div>\n  )\n})\n\nexport default connect(\n  'selectSelectedPeers',\n  'doSetSelectedPeers',\n  withTranslation('peers')(WorldMap)\n)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport classNames from 'classnames'\nimport ms from 'milliseconds'\nimport { connect } from 'redux-bundler-react'\nimport { withTranslation } from 'react-i18next'\nimport { Table, Column, AutoSizer, SortDirection } from 'react-virtualized'\nimport CountryFlag from 'react-country-flag'\nimport { CopyToClipboard } from 'react-copy-to-clipboard'\nimport Cid from '../../components/cid/Cid'\nimport { sortByProperty } from '../../lib/sort'\n\nimport './PeersTable.css'\n\nexport class PeersTable extends React.Component {\n  static propTypes = {\n    peerLocationsForSwarm: PropTypes.array,\n    className: PropTypes.string,\n    t: PropTypes.func.isRequired\n  }\n\n  constructor (props) {\n    super(props)\n\n    this.state = {\n      sortBy: 'latency',\n      sortDirection: SortDirection.ASC\n    }\n\n    this.sort = this.sort.bind(this)\n  }\n\n  flagRenderer = (flagCode, isPrivate) => {\n    // Check if the OS is Windows to render the flags as SVGs\n    // Windows doesn't render the flags as emojis  ¯\\_(ツ)_/¯\n    const isWindows = window.navigator.appVersion.indexOf('Win') !== -1\n    return (\n      <span className='f4 pr2'>\n        {isPrivate ? '🤝' : flagCode ? <CountryFlag code={flagCode} svg={isWindows} /> : '🌐'}\n      </span>\n    )\n  }\n\n  locationCellRenderer = ({ rowData }) => {\n    const ref = React.createRef()\n    const location = rowData.isPrivate\n      ? this.props.t('localNetwork')\n      : rowData.location\n        ? rowData.isNearby\n          ? <span>{rowData.location} <span className='charcoal-muted'>({this.props.t('nearby')})</span></span>\n          : rowData.location\n        : <span className='charcoal-muted fw4'>{this.props.t('app:terms.unknown')}</span>\n    const value = rowData.location || this.props.t('app:terms.unknown')\n    return (\n      <CopyToClipboard text={value} onCopy={() => copyFeedback(ref, this.props.t)}>\n        <span title={value} className='copyable' ref={ref}>\n          { this.flagRenderer(rowData.flagCode, rowData.isPrivate) }\n          { location }\n        </span>\n      </CopyToClipboard>\n    )\n  }\n\n  latencyCellRenderer = ({ cellData, rowData }) => {\n    const style = { width: '60px' }\n    const latency = `${cellData}ms`\n    if (cellData == null) return (<span className='dib o-40 no-select' style={style}>-</span>)\n    return (<span className='dib no-select'>{latency}</span>)\n  }\n\n  peerIdCellRenderer = ({ cellData: peerId }) => {\n    const ref = React.createRef()\n    const p2pMultiaddr = `/p2p/${peerId}`\n    return (\n      <CopyToClipboard text={p2pMultiaddr} onCopy={() => copyFeedback(ref, this.props.t)}>\n        <Cid value={peerId} identicon ref={ref} className='copyable' />\n      </CopyToClipboard>\n    )\n  }\n\n  protocolsCellRenderer = ({ rowData, cellData }) => {\n    const ref = React.createRef()\n    const { protocols } = rowData\n    const title = protocols.split(', ').join('\\n')\n    return (\n      <CopyToClipboard text={protocols} onCopy={() => copyFeedback(ref, this.props.t)}>\n        <span\n          ref={ref}\n          className='copyable'\n          title={title}>\n          { protocols.replaceAll('[unnamed]', '🤔') }\n        </span>\n      </CopyToClipboard>\n    )\n  }\n\n  connectionCellRenderer = ({ rowData }) => {\n    const ref = React.createRef()\n    const { address, direction, peerId } = rowData\n    const p2pMultiaddr = `${address}/p2p/${peerId}`\n    const title = direction != null\n      ? `${address}\\n(${renderDirection(direction, this.props.t)})`\n      : address\n\n    return (\n      <CopyToClipboard text={p2pMultiaddr} onCopy={() => copyFeedback(ref, this.props.t)}>\n        <abbr\n          ref={ref}\n          className='copyable'\n          title={title}>\n          {rowData.connection}\n        </abbr>\n      </CopyToClipboard>\n    )\n  }\n\n  rowClassRenderer = ({ index }, peers = []) => {\n    const { selectedPeers } = this.props\n    const shouldAddHoverEffect = selectedPeers?.peerIds?.includes(peers[index]?.peerId)\n\n    return classNames('bb b--near-white peersTableItem', index === -1 && 'bg-near-white', shouldAddHoverEffect && 'bg-light-gray')\n  }\n\n  sort ({ sortBy, sortDirection }) {\n    this.setState({ sortBy, sortDirection })\n  }\n\n  render () {\n    const { className, peerLocationsForSwarm, t } = this.props\n    const { sortBy, sortDirection } = this.state\n\n    const sortedList = (peerLocationsForSwarm || []).sort(sortByProperty(sortBy, sortDirection === SortDirection.ASC ? 1 : -1))\n    const tableHeight = 400\n\n    return (\n      <div className={`bg-white-70 center ${className}`} style={{ height: `${tableHeight}px`, maxWidth: 1764 }}>\n        { peerLocationsForSwarm && <AutoSizer disableHeight>\n          {({ width }) => (\n            <Table\n              className='tl fw4 w-100 f6'\n              headerClassName='teal fw2 ttu tracked ph2 no-select'\n              rowClassName={(rowInfo) => this.rowClassRenderer(rowInfo, peerLocationsForSwarm)}\n              width={width}\n              height={tableHeight}\n              headerHeight={32}\n              rowHeight={36}\n              rowCount={peerLocationsForSwarm.length}\n              rowGetter={({ index }) => sortedList[index]}\n              sort={this.sort}\n              sortBy={sortBy}\n              sortDirection={sortDirection}>\n              <Column label={t('app:terms.location')} cellRenderer={this.locationCellRenderer} dataKey='location' width={450} className='f6 charcoal truncate pl2' />\n              <Column label={t('app:terms.latency')} cellRenderer={this.latencyCellRenderer} dataKey='latency' width={200} className='f6 charcoal pl2' />\n              <Column label={t('app:terms.peerId')} cellRenderer={this.peerIdCellRenderer} dataKey='peerId' width={250} className='charcoal monospace truncate f6 pl2' />\n              <Column label={t('app:terms.connection')} cellRenderer={this.connectionCellRenderer} dataKey='connection' width={250} className='f6 charcoal truncate pl2' />\n              <Column label={t('protocols')} cellRenderer={this.protocolsCellRenderer} dataKey='protocols' width={520} className='charcoal monospace truncate f7 pl2' />\n            </Table>\n          )}\n        </AutoSizer> }\n      </div>\n    )\n  }\n}\n\n// API returns integer atm, but that may change in the future\n// Current mapping based on https://github.com/libp2p/go-libp2p-core/blob/21efed75194d73e21e16fe3124fb9c4127a85308/network/network.go#L38-39\nconst renderDirection = (direction, i18n) => {\n  if (direction == null) return\n  switch (direction) {\n    case 1:\n      return i18n('connectionDirectionInbound')\n    case 2:\n      return i18n('connectionDirectionOutbound')\n    default:\n      return direction\n  }\n}\n\n// temporarily replaces contents of element with 'copied!'\nconst copyFeedback = (ref, t) => {\n  const tag = ref.current\n  const { parentNode } = tag\n  const msg = document.createElement('em')\n  msg.innerText = t('copyFeedback')\n  parentNode.replaceChild(msg, tag)\n  setTimeout(() => parentNode.replaceChild(tag, msg), ms.seconds(2))\n}\n\nexport default connect(\n  'selectPeerLocationsForSwarm',\n  'selectSelectedPeers',\n  withTranslation('peers')(PeersTable)\n)\n","import React from 'react'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'redux-bundler-react'\nimport isIPFS from 'is-ipfs'\n\nimport Icon from '../../icons/StrokeDecentralization'\nimport Button from '../../components/button/Button'\nimport Overlay from '../../components/overlay/Overlay'\nimport TextInputModal from '../../components/text-input-modal/TextInputModal'\n\nclass AddConnection extends React.Component {\n  state = {\n    open: false,\n    loading: false,\n    hasErrored: false\n  }\n\n  toggleModal = () => {\n    this.setState({\n      open: !this.state.open\n    })\n  }\n\n  addConnection = async (maddr) => {\n    this.setState({ loading: true })\n    const { type } = await this.props.doConnectSwarm(maddr)\n    this.setState({ loading: false, hasErrored: true })\n\n    if (type === 'SWARM_CONNECT_FAILED') return\n\n    this.toggleModal()\n  }\n\n  onInputChange = () => {\n    if (!this.state.hasErrored) return\n\n    this.setState({ hasErrored: false })\n  }\n\n  getDescription = () => {\n    const { t } = this.props\n    const codeClass = 'w-90 mb1 pa1 bg-snow f7 charcoal-muted truncate'\n\n    return (\n      <div className='mb3 flex flex-column items-center'>\n        <p className='gray w-80'>{t('insertPeerAddress')}</p>\n        <span className='w-80 mv2 f7 charcoal-muted'>{t('app:terms.example')}</span>\n        <code className={codeClass}>/ip4/76.176.168.65/tcp/4001/p2p/QmbBHw1Xx9pUpAbrVZUKTPL5Rsph5Q9GQhRvcWVBPFgGtC</code>\n      </div>\n    )\n  }\n\n  render () {\n    const { open, loading, hasErrored } = this.state\n    const { t } = this.props\n\n    return (\n      <div>\n        <Button onClick={this.toggleModal} className='f6 ph3 tc' bg='bg-navy' color='white'>\n          <span style={{ color: '#8CDDE6' }}>+</span> {t('addConnection')}\n        </Button>\n\n        <Overlay show={open} onLeave={this.toggleModal}>\n          <TextInputModal\n            validate={isIPFS.peerMultiaddr}\n            onSubmit={this.addConnection}\n            onCancel={this.toggleModal}\n            onInputChange={this.onInputChange}\n            submitText={t('app:actions.add')}\n            Icon={Icon}\n            title={t('addConnection')}\n            description={this.getDescription()}\n            loading={loading}\n            error={hasErrored}\n          />\n        </Overlay>\n      </div>\n    )\n  }\n}\n\nexport default connect('doConnectSwarm', withTranslation('peers')(AddConnection))\n","import React from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport ReactJoyride from 'react-joyride'\nimport withTour from '../components/tour/withTour'\nimport { peersTour } from '../lib/tours'\nimport { getJoyrideLocales } from '../helpers/i8n'\n\n// Components\nimport Box from '../components/box/Box'\nimport WorldMap from './WorldMap/WorldMap'\nimport PeersTable from './PeersTable/PeersTable'\nimport AddConnection from './AddConnection/AddConnection'\nimport CliTutorMode from '../components/cli-tutor-mode/CliTutorMode'\nimport { cliCmdKeys, cliCommandList } from '../bundles/files/consts'\n\nconst PeersPage = ({ t, toursEnabled, handleJoyrideCallback, isCliTutorModeEnabled }) => (\n  <div data-id='PeersPage' className='overflow-hidden'>\n    <Helmet>\n      <title>{t('title')} | IPFS</title>\n    </Helmet>\n\n    <div className='flex justify-end items-center mb3'>\n      <CliTutorMode showIcon={true} command={cliCommandList[cliCmdKeys.ADD_NEW_PEER]()} t={t}/>\n      <AddConnection />\n    </div>\n\n    <Box className='pt3 ph3 pb4'>\n      <WorldMap className='joyride-peers-map' />\n      <PeersTable className='joyride-peers-table' />\n    </Box>\n\n    <ReactJoyride\n      run={toursEnabled}\n      steps={peersTour.getSteps({ t })}\n      styles={peersTour.styles}\n      callback={handleJoyrideCallback}\n      continuous\n      scrollToFirstStep\n      locale={getJoyrideLocales(t)}\n      showProgress />\n  </div>\n)\n\nexport default connect(\n  'selectToursEnabled',\n  'selectIsCliTutorModeEnabled',\n  withTour(withTranslation('peers')(PeersPage))\n)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport CancelIcon from '../../icons/GlyphSmallCancel'\n\nexport const ModalActions = ({ justify, className, children, ...props }) => (\n  <div className={`flex justify-${justify} pa2 ${className}`} style={{ backgroundColor: '#f4f6f8' }} {...props}>\n    { children }\n  </div>\n)\n\nModalActions.propTypes = {\n  justify: PropTypes.string,\n  className: PropTypes.string\n}\n\nModalActions.defaultProps = {\n  justify: 'between',\n  className: ''\n}\n\nexport const ModalBody = ({ className, Icon, title, children, ...props }) => (\n  <div className={`ph4 pv3 tc ${className}`} {...props}>\n    { Icon && (\n      <div className='center bg-snow br-100 flex justify-center items-center' style={{ width: '80px', height: '80px' }}>\n        {<Icon className='fill-gray w3'/>}\n      </div>\n    )}\n\n    <p className='charcoal fw6 truncate'>{title}</p>\n\n    {children}\n  </div>\n)\n\nModalBody.propTypes = {\n  Icon: PropTypes.func,\n  title: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.node\n  ])\n}\n\nModalBody.defaultProps = {\n  className: ''\n}\n\nexport const Modal = ({ onCancel, children, className, ...props }) => {\n  return (\n    <div className={`${className} bg-white w-80 shadow-4 sans-serif relative`} style={{ maxWidth: '34em' }} {...props}>\n      { onCancel &&\n        <CancelIcon className='absolute pointer w2 h2 top-0 right-0 fill-gray' onClick={onCancel} />\n      }\n\n      {children}\n    </div>\n  )\n}\n\nModal.propTypes = {\n  onCancel: PropTypes.func\n}\n\nModal.defaultProps = {\n  onCancel: null,\n  className: ''\n}\n\nexport default Modal\n","import React from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { STATUS } from 'react-joyride'\n\nconst withTour = WrappedComponent => {\n  class WithTour extends React.Component {\n    handleJoyrideCallback = (data) => {\n      const { doDisableTours } = this.props\n      const { action, status } = data\n\n      if (action === 'close' || [STATUS.FINISHED].includes(status)) {\n        doDisableTours()\n      }\n    }\n\n    render () {\n      return <WrappedComponent handleJoyrideCallback={this.handleJoyrideCallback} {...this.props} />\n    }\n  }\n\n  return connect('doDisableTours', WithTour)\n}\n\nexport default withTour\n","import React from 'react'\nimport classNames from 'classnames'\n\nconst Shell = ({\n  title = 'Shell',\n  children,\n  className\n}) => {\n  return (\n    <div className={classNames('br1 overflow-hidden', className)}>\n      <div className='f7 mb0 sans-serif ttu tracked charcoal pv1 pl2 bg-black-20'>{ title }</div>\n      <div className='bg-black-70 snow pa2 f7 lh-copy monospace nowrap overflow-x-auto'>\n        {children}\n      </div>\n    </div>\n  )\n}\n\nexport default Shell\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Modal } from 'react-overlays'\n\nfunction Overlay ({ children, show, onLeave, className, hidden, ...props }) {\n  const handleKeyDown = (e) => {\n    if (e.key !== 'Escape') return\n\n    e.stopPropagation()\n    e.nativeEvent.stopImmediatePropagation()\n\n    onLeave()\n  }\n\n  const renderBackdrop = (props) => (\n    <div className='fixed top-0 left-0 right-0 bottom-0 bg-black o-50' hidden={hidden} {...props} />\n  )\n\n  return (\n    <Modal\n      {...props}\n      show={show}\n      className={`${className} fixed top-0 left-0 right-0 bottom-0 z-max flex items-center justify-around`}\n      renderBackdrop={renderBackdrop}\n      onKeyDown={handleKeyDown}\n      onBackdropClick={onLeave}>\n      {children}\n    </Modal>\n  )\n}\n\nOverlay.propTypes = {\n  show: PropTypes.bool.isRequired,\n  onLeave: PropTypes.func.isRequired\n}\n\nOverlay.defaultProps = {\n  className: ''\n}\n\nexport default Overlay\n","import React from 'react'\n\nconst StrokeCode = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M75 24H25.11c-4.19 0-8 4.11-8 8.61v35.26a8.29 8.29 0 0 0 8 8.13H75a8.11 8.11 0 0 0 7.87-8.13V32.61C82.91 28.55 79.54 24 75 24zm-49.89 3H75c2.74 0 4.87 3 4.87 5.61v1.32H20.09v-1.32c0-2.83 2.49-5.61 5.02-5.61zm-5 39.59V35.93h59.8v30.66zM75 73H25.11a5.28 5.28 0 0 1-4.95-4.41h59.67A5.09 5.09 0 0 1 75 73z' />\n    <circle cx={26.22} cy={30.54} r={1.33} />\n    <path d='M30.49 31.88a1.34 1.34 0 1 0-1.33-1.34 1.34 1.34 0 0 0 1.33 1.34zm4.28 0a1.34 1.34 0 1 0-1.34-1.34 1.34 1.34 0 0 0 1.34 1.34zm4.4 19.55l5-5a1.28 1.28 0 0 0-1.81-1.81l-5.87 5.88a1.3 1.3 0 0 0 0 1.84l5.87 5.88a1.28 1.28 0 0 0 1.81-1.81zm23.58-.92l-5.88-5.88a1.28 1.28 0 1 0-1.8 1.81l5 5-5 5a1.28 1.28 0 1 0 1.8 1.81l5.88-5.88a1.27 1.27 0 0 0 .38-.92 1.31 1.31 0 0 0-.38-.94zM51 42.85A1.38 1.38 0 0 0 49.44 44l-2.37 14.41a1.39 1.39 0 0 0 2.75.45l2.37-14.41a1.39 1.39 0 0 0-1.19-1.6z' />\n  </svg>\n)\n\nexport default StrokeCode\n","import React from 'react'\n\nconst StrokeDownload = props => (\n  <svg viewBox='0 0 100 100' {...props}>\n    <path d='M76.3 61.6H23.7c-3.1 0-5.6 2.5-5.6 5.6v7.5c0 3.1 2.5 5.6 5.6 5.6h52.7c3.1 0 5.6-2.5 5.6-5.6v-7.5c-.1-3.1-2.6-5.6-5.7-5.6zm2.4 13.1c0 1.3-1 2.3-2.3 2.3H23.7c-1.3 0-2.3-1-2.3-2.3v-7.5c0-1.3 1-2.3 2.3-2.3h52.7c1.3 0 2.3 1 2.3 2.3v7.5z' />\n    <path d='M64.9 68.8c-1.2 0-2.2 1-2.2 2.2 0 1.2 1 2.2 2.2 2.2 1.2 0 2.2-1 2.2-2.2 0-1.2-1-2.2-2.2-2.2zm0 3.3c-.6 0-1.1-.5-1.1-1.1s.5-1.1 1.1-1.1 1.1.5 1.1 1.1-.5 1.1-1.1 1.1zm7.7-3.3c-1.2 0-2.2 1-2.2 2.2 0 1.2 1 2.2 2.2 2.2s2.2-1 2.2-2.2c0-1.2-1-2.2-2.2-2.2zm0 3.3c-.6 0-1.1-.5-1.1-1.1s.5-1.1 1.1-1.1 1.1.5 1.1 1.1-.5 1.1-1.1 1.1zM50.8 57.2l11.8-11.8c.8-.8.2-2.1-.9-2h-5.9V20.9c0-.7-.5-1.2-1.2-1.2h-9.5c-.7 0-1.2.5-1.2 1.2v22.5H38c-1.1 0-1.6 1.3-.9 2l11.8 11.8c.7.5 1.5.5 1.9 0zM41 45.8h5.4V22.1h7.1v23.7H59l-9 8.9-9-8.9z' />\n  </svg>\n)\n\nexport default StrokeDownload\n"],"sourceRoot":""}