├── .gitignore ├── .watchmanconfig ├── README.md ├── babel.config.js ├── example ├── .gitignore ├── .watchmanconfig ├── App.js ├── app.json ├── babel.config.js ├── package-lock.json └── package.json ├── lib ├── ActionTypes.js ├── Actions.js ├── Colors.js ├── DefaultStore.js ├── ImageGallery.js ├── ImageGalleryAnimatedImage.js ├── ImageGalleryConstants.js ├── ImageGalleryHeaderBar.js ├── ImageGalleryImage.js ├── ImageGalleryItem.js ├── ImageGalleryList.js ├── ImageGalleryPlaceholder.js ├── ImageGalleryReducer.js ├── Layout.js ├── ShallowEquals.js ├── ViewPager.js ├── calculateImageDimensions.js ├── index.js └── openImageGallery.js ├── package-lock.json ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | .expo/* 3 | npm-debug.* 4 | *.jks 5 | *.p12 6 | *.key 7 | *.mobileprovision 8 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### @expo/react-native-image-gallery 2 | 3 | Requires @unimodules/react-native-platform to use in a bare React Native app. 4 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | "presets": ["babel-preset-expo"], 5 | "env": { 6 | "development": { 7 | "plugins": ["transform-react-jsx-source"] 8 | } 9 | } 10 | }; 11 | }; 12 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | .expo/* 3 | npm-debug.* 4 | *.jks 5 | *.p12 6 | *.key 7 | *.mobileprovision 8 | -------------------------------------------------------------------------------- /example/.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /example/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | Dimensions, 4 | Image, 5 | Platform, 6 | ScrollView, 7 | StyleSheet, 8 | Text, 9 | TouchableWithoutFeedback, 10 | View, 11 | SafeAreaView, 12 | StatusBar, 13 | } from 'react-native'; 14 | 15 | import Immutable from 'immutable'; 16 | import ImageGallery, { openImageGallery } from '@expo/react-native-image-gallery'; 17 | 18 | class ListItem extends React.Component { 19 | _openInImageGallery = () => { 20 | let { item } = this.props; 21 | 22 | this._view.measure((rx, ry, w, h, x, y) => { 23 | openImageGallery({ 24 | animationMeasurements: { w, h, x, y }, 25 | list, 26 | item, 27 | }); 28 | }); 29 | }; 30 | 31 | render() { 32 | let { item } = this.props; 33 | 34 | return ( 35 | 36 | { this._view = view }} 38 | source={{ uri: item.imageUrl }} 39 | style={styles.thumbnail} /> 40 | 41 | ); 42 | } 43 | 44 | } 45 | 46 | class ImageGrid extends React.Component { 47 | render() { 48 | return ( 49 | 50 | 51 | Example Image Gallery 52 | 53 | 54 | 55 | {list.map(item => )} 56 | 57 | 58 | ); 59 | } 60 | } 61 | 62 | export default class App extends React.Component { 63 | render() { 64 | return ( 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | ); 73 | } 74 | } 75 | 76 | const DEVICE_WIDTH = Dimensions.get('window').width; 77 | var THUMBNAILS_PER_ROW = 2; 78 | var THUMBNAIL_SPACING = 10; 79 | var THUMBNAIL_SIZE = ((DEVICE_WIDTH - (THUMBNAIL_SPACING * ((THUMBNAILS_PER_ROW * 2) + 2))) / THUMBNAILS_PER_ROW); 80 | 81 | const styles = StyleSheet.create({ 82 | container: { 83 | flex: 1, 84 | }, 85 | thumbnail: { 86 | margin: THUMBNAIL_SPACING, 87 | width: THUMBNAIL_SIZE, 88 | height: THUMBNAIL_SIZE, 89 | }, 90 | header: { 91 | padding: 20, 92 | borderBottomColor: '#eee', 93 | borderBottomWidth: 1, 94 | alignItems: 'center', 95 | }, 96 | heading: { 97 | fontSize: 18, 98 | }, 99 | imagegrid: { 100 | flex: 1, 101 | }, 102 | layout: { 103 | margin: THUMBNAIL_SPACING, 104 | flex: 1, 105 | flexDirection: 'row', 106 | flexWrap: 'wrap', 107 | justifyContent: 'space-between' 108 | }, 109 | }); 110 | 111 | const list = [ 112 | { 113 | description: 'Image 1', 114 | imageUrl: 'http://placehold.it/480x480&text=Image%201', 115 | width: 480, 116 | height: 480, 117 | }, 118 | { 119 | description: 'Image 2', 120 | imageUrl: 'http://placehold.it/640x640&text=Image%202', 121 | width: 640, 122 | height: 640, 123 | }, 124 | { 125 | description: 'Image 3', 126 | imageUrl: 'http://placehold.it/640x640&text=Image%203', 127 | width: 640, 128 | height: 640, 129 | } 130 | ]; 131 | -------------------------------------------------------------------------------- /example/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "image-gallery-example", 4 | "description": "An example project using https://github.com/expo/react-native-image-gallery", 5 | "slug": "image-gallery-example", 6 | "sdkVersion": "32.0.0", 7 | "version": "1.0.0", 8 | "orientation": "portrait", 9 | "primaryColor": "#cccccc", 10 | "icon": "https://s3.amazonaws.com/exp-brand-assets/ExponentEmptyManifest_192.png" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /example/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "image-gallery-example", 3 | "version": "1.0.0", 4 | "author": "support@expo.io", 5 | "main": "node_modules/expo/AppEntry.js", 6 | "dependencies": { 7 | "@expo/react-native-image-gallery": "../expo-react-native-image-gallery-v3.0.0.tgz", 8 | "expo": "^32.0.1", 9 | "react": "16.5.0", 10 | "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz", 11 | "react-navigation": "^3.0.9" 12 | }, 13 | "devDependencies": { 14 | "babel-preset-expo": "^5.0.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/ActionTypes.js: -------------------------------------------------------------------------------- 1 | import mirror from 'mirror-creator'; 2 | 3 | export default mirror([ 4 | 'PRELOAD_IMAGE_GALLERY', 5 | 'OPEN_IMAGE_GALLERY', 6 | 'CLOSE_IMAGE_GALLERY', 7 | 'FOCUS_IMAGE_GALLERY_ITEM', 8 | 'UPDATE_IMAGE_GALLERY_ANIMATION_MEASUREMENTS', 9 | 'UPDATE_IMAGE_GALLERY_LIFECYCLE', 10 | 'REPLACE_IMAGE_SEARCH_TEXT', 11 | ]); 12 | -------------------------------------------------------------------------------- /lib/Actions.js: -------------------------------------------------------------------------------- 1 | import ActionTypes from './ActionTypes'; 2 | 3 | export default class Actions { 4 | 5 | static preloadImageGallery({list}) { 6 | return { 7 | type: ActionTypes.PRELOAD_IMAGE_GALLERY, 8 | list, 9 | }; 10 | } 11 | 12 | static openImageGallery(payload) { 13 | return { 14 | type: ActionTypes.OPEN_IMAGE_GALLERY, 15 | ...payload, 16 | }; 17 | } 18 | 19 | static closeImageGallery() { 20 | return { 21 | type: ActionTypes.CLOSE_IMAGE_GALLERY, 22 | }; 23 | } 24 | 25 | static updateImageGalleryLifecycle(newState) { 26 | return { 27 | type: ActionTypes.UPDATE_IMAGE_GALLERY_LIFECYCLE, 28 | lifecycle: newState, 29 | }; 30 | } 31 | 32 | static focusImageGalleryItem(item) { 33 | return { 34 | type: ActionTypes.FOCUS_IMAGE_GALLERY_ITEM, 35 | item, 36 | }; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /lib/Colors.js: -------------------------------------------------------------------------------- 1 | export default { 2 | galleryBackground: '#e8e8ec', 3 | barBackground: '#fff', 4 | barBorder: '#B2B2B2', 5 | barTitle: '#484E5C', 6 | enabledButtonText: '#0F81AA', 7 | }; 8 | -------------------------------------------------------------------------------- /lib/DefaultStore.js: -------------------------------------------------------------------------------- 1 | import { combineReducers, createStore } from 'redux'; 2 | import imageGalleryReducer from './ImageGalleryReducer'; 3 | 4 | const store = createStore(combineReducers({ 5 | imageGallery: imageGalleryReducer, 6 | })); 7 | 8 | export default store; 9 | -------------------------------------------------------------------------------- /lib/ImageGallery.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { 4 | Animated, 5 | BackHandler, 6 | Easing, 7 | PanResponder, 8 | Platform, 9 | StatusBar, 10 | StyleSheet, 11 | View, 12 | } from 'react-native'; 13 | import { connect, Provider } from 'react-redux'; 14 | 15 | import Actions from './Actions'; 16 | import Colors from './Colors'; 17 | import ImageGalleryAnimatedImage from './ImageGalleryAnimatedImage'; 18 | import ImageGalleryHeaderBar from './ImageGalleryHeaderBar'; 19 | import ImageGalleryList from './ImageGalleryList'; 20 | import { 21 | OPENING_ANIMATION_IN_PROGRESS, 22 | OPEN_AND_IDLE, 23 | CLOSING_ANIMATION_IN_PROGRESS, 24 | CLOSED_AND_IDLE, 25 | DRAG_IN_PROGRESS, 26 | } from './ImageGalleryConstants'; 27 | import Layout from './Layout'; 28 | import { shallowEqualsIgnoreKeys } from './ShallowEquals'; 29 | import DefaultStore from './DefaultStore'; 30 | 31 | const TOP_OFFSET = Layout.headerHeight; 32 | const USE_NATIVE_DRIVER = true; 33 | 34 | @connect(data => ImageGallery.getDataProps(data)) 35 | class ImageGallery extends React.Component { 36 | static getDataProps(data) { 37 | let { imageGallery } = data; 38 | 39 | return { 40 | animationMeasurements: imageGallery.get('animationMeasurements'), 41 | userWantsOpen: imageGallery.get('userWantsOpen'), 42 | lifecycle: imageGallery.get('lifecycle'), 43 | item: imageGallery.get('item'), 44 | list: imageGallery.get('list'), 45 | }; 46 | } 47 | 48 | static childContextTypes = { 49 | store: PropTypes.object, 50 | }; 51 | 52 | getChildContext() { 53 | return { store: DefaultStore }; 54 | } 55 | 56 | shouldComponentUpdate(nextProps) { 57 | return !shallowEqualsIgnoreKeys(this.props, nextProps, [ 58 | 'animationMeasurements', 59 | 'item', 60 | ]); 61 | } 62 | 63 | static propTypes = { 64 | animationMeasurements: PropTypes.object, 65 | userWantsOpen: PropTypes.bool, 66 | item: PropTypes.object, 67 | list: PropTypes.object, 68 | }; 69 | 70 | constructor(props, context) { 71 | super(props, context); 72 | 73 | this.state = { 74 | zoomInOutValue: new Animated.Value(0), 75 | panValue: new Animated.Value(0), 76 | innerContentValue: new Animated.Value(0), 77 | }; 78 | } 79 | 80 | componentWillMount() { 81 | if (USE_NATIVE_DRIVER) { 82 | this.state.innerContentValue.__makeNative(); 83 | this.state.zoomInOutValue.__makeNative(); 84 | this.state.panValue.__makeNative(); 85 | } 86 | 87 | this._panResponder = PanResponder.create({ 88 | onMoveShouldSetPanResponder: this._onMoveShouldSetPanResponder, 89 | onPanResponderGrant: this._onPanResponderGrant, 90 | onPanResponderMove: this._onPanResponderMove, 91 | onPanResponderTerminationRequest: true, 92 | onPanResponderTerminate: this._onPanResponderEnd, 93 | onPanResponderRelease: this._onPanResponderEnd, 94 | }); 95 | } 96 | 97 | componentWillReceiveProps(nextProps) { 98 | if (this.props.lifecycle === OPENING_ANIMATION_IN_PROGRESS) { 99 | this._updateScrollPositionFromProps(nextProps); 100 | } 101 | } 102 | 103 | componentDidUpdate(prevProps) { 104 | if (this.props.lifecycle === OPENING_ANIMATION_IN_PROGRESS) { 105 | this._updateScrollPositionFromProps(this.props); 106 | } 107 | 108 | requestAnimationFrame(() => { 109 | if (!prevProps.userWantsOpen && this.props.userWantsOpen) { 110 | this._enableBackButtonOverride(); 111 | this._animateZoomIn(this.props); 112 | } else if (prevProps.userWantsOpen && !this.props.userWantsOpen) { 113 | if (this.props.lifecycle !== CLOSED_AND_IDLE) { 114 | this._animateAutomatedSlideOut(); 115 | } 116 | } 117 | }); 118 | } 119 | 120 | render() { 121 | let { userWantsOpen, list, lifecycle } = this.props; 122 | let { innerContentValue, zoomInOutValue } = this.state; 123 | let isVisible = lifecycle !== CLOSED_AND_IDLE; 124 | let isDragging = 125 | lifecycle === DRAG_IN_PROGRESS || 126 | lifecycle === CLOSING_ANIMATION_IN_PROGRESS; 127 | 128 | /* note(brentvatne): no idea why 7 is necessary here, shouldn't it just be 129 | * the tabBarHeight? */ 130 | const SOME_NUMBER_I_DONT_UNDERSTAND = 7; 131 | const topClippingOffset = isDragging 132 | ? 0 133 | : TOP_OFFSET - Layout.statusBarHeight; 134 | const bottomClippingOffset = isDragging 135 | ? -topClippingOffset 136 | : -topClippingOffset + 137 | Layout.tabBarHeight + 138 | SOME_NUMBER_I_DONT_UNDERSTAND - 139 | Layout.statusBarHeight; 140 | 141 | return ( 142 | 146 | 152 | 153 | 154 | { 157 | this._list = view; 158 | }} 159 | onPageSelected={this._onPageSelected} 160 | onPressItem={this._closeGallery} 161 | style={styles.list} 162 | renderDescription={this.props.renderDescription} 163 | /> 164 | 165 | 171 | 172 | 173 | {/* note(brentvatne): These two wrapper views are required to clip the 174 | animated image, to create the impression that it is going 175 | underneath the navbar */} 176 | 186 | 191 | 199 | 200 | 201 | 202 | {isVisible && } 203 | 204 | ); 205 | } 206 | 207 | // Scroll the gallery to the item whose image was tapped on. 208 | _updateScrollPositionFromProps(props) { 209 | let { list, item } = props; 210 | let index = list.get('items').indexOf(item); 211 | this._list.scrollToPage(index); 212 | } 213 | 214 | _animateZoomIn = (props = this.props) => { 215 | let { zoomInOutValue, innerContentValue } = this.state; 216 | let animationConfig = { 217 | toValue: 1, 218 | duration: 200, 219 | easing: Easing.inOut(Easing.linear), 220 | useNativeDriver: USE_NATIVE_DRIVER, 221 | }; 222 | 223 | setTimeout(() => { 224 | Animated.parallel([ 225 | Animated.timing(innerContentValue, animationConfig), 226 | Animated.timing(zoomInOutValue, animationConfig), 227 | ]).start(({ finished }) => { 228 | if (!finished) { 229 | return; 230 | } 231 | 232 | requestAnimationFrame(() => { 233 | this.props.dispatch( 234 | Actions.updateImageGalleryLifecycle(OPEN_AND_IDLE) 235 | ); 236 | }); 237 | }); 238 | }); 239 | }; 240 | 241 | _animateAutomatedSlideOut = () => { 242 | Animated.timing(this.state.innerContentValue, { 243 | toValue: 0, 244 | duration: 150, 245 | useNativeDriver: USE_NATIVE_DRIVER, 246 | }).start(); 247 | 248 | this._animateSlideOut(5, 1, 150); 249 | }; 250 | 251 | _animateSlideOut = (vy, dy, duration = 150) => { 252 | let { panValue, zoomInOutValue } = this.state; 253 | let boundary = Layout.window.height; 254 | 255 | let zoomAnimationConfig = { 256 | toValue: 0, 257 | duration, 258 | easing: Easing.inOut(Easing.linear), 259 | useNativeDriver: USE_NATIVE_DRIVER, 260 | }; 261 | 262 | let toValue; 263 | if (Math.abs(vy) <= 5) { 264 | // very very still so just use dy 265 | toValue = dy <= 0 ? -boundary : boundary; 266 | } else { 267 | // just moved by a reasonable amount, so just vy 268 | toValue = vy < 0 ? -boundary : boundary; 269 | } 270 | 271 | let panAnimationConfig = { 272 | toValue, 273 | velocity: vy, 274 | bounciness: 0, 275 | useNativeDriver: USE_NATIVE_DRIVER, 276 | }; 277 | 278 | Animated.spring(panValue, panAnimationConfig).start(); 279 | 280 | setTimeout(() => { 281 | Animated.timing( 282 | zoomInOutValue, 283 | zoomAnimationConfig 284 | ).start(({ finished }) => { 285 | this.props.dispatch( 286 | Actions.updateImageGalleryLifecycle(CLOSED_AND_IDLE) 287 | ); 288 | 289 | this._disableBackButtonOverride(); 290 | 291 | // Reset the now hidden gallery to its original position 292 | panValue.setValue(0); 293 | zoomInOutValue.setValue(0); 294 | }); 295 | }, duration); 296 | }; 297 | 298 | _closeGallery = () => { 299 | let { lifecycle } = this.props; 300 | 301 | if (lifecycle === OPEN_AND_IDLE) { 302 | this.props.dispatch(Actions.closeImageGallery()); 303 | } 304 | }; 305 | 306 | _isAnimatedImageVisible() { 307 | return ( 308 | [CLOSED_AND_IDLE, OPEN_AND_IDLE].indexOf(this.props.lifecycle) === -1 309 | ); 310 | } 311 | 312 | _onPageSelected = index => { 313 | let activeItem = this.props.list.get('items').get(index); 314 | this.props.dispatch(Actions.focusImageGalleryItem(activeItem)); 315 | }; 316 | 317 | _onMoveShouldSetPanResponder = (e, { moveY, dx, dy }) => { 318 | const topOfDescriptionBox = 319 | Layout.window.width + Layout.headerHeight; // Images are 1:1 aspect ratio, full screen width 320 | 321 | if (this.props.lifecycle !== OPEN_AND_IDLE) { 322 | return false; 323 | } 324 | 325 | let y0 = moveY - dy; 326 | if ( 327 | y0 >= Layout.headerHeight && 328 | moveY >= Layout.headerHeight && 329 | y0 <= topOfDescriptionBox && 330 | moveY <= topOfDescriptionBox && 331 | Math.abs(dy) > Math.abs(dx) * 2 332 | ) { 333 | return true; 334 | } 335 | }; 336 | 337 | _onPanResponderGrant = (e, gestureState) => { 338 | // There appears to be a bug with iOS PanResponder/ScrollView where the 339 | // PanResponder is able to try to take responder status away from a 340 | // scrolling ScrollView, and all it does is fire grant then that's it 341 | // -- no terminate or anything. So we have to do the initialization for 342 | // the gesture in onPanResponderMove -- if we were to do it here then 343 | // when the formerly mentioned edge-case occurs we would end up in a 344 | // start where the gesture was initialized but never canceled. 345 | this._responderGranted = true; 346 | }; 347 | 348 | _onPanResponderMove = (e, { dy }) => { 349 | if (this._responderGranted) { 350 | Animated.timing(this.state.innerContentValue, { 351 | toValue: 0, 352 | duration: 250, 353 | useNativeDriver: USE_NATIVE_DRIVER, 354 | }).start(); 355 | 356 | this.state.panValue.setOffset(this.state.panValue._value); 357 | this.state.panValue.setValue(0); 358 | this.props.dispatch( 359 | Actions.updateImageGalleryLifecycle(DRAG_IN_PROGRESS) 360 | ); 361 | this._responderGranted = false; 362 | } 363 | 364 | // This calculation is based off of some manual tweaking to get the opacity 365 | // looking right as you move further away from the center towards the top 366 | // or bottom 367 | let opacity = 1 - Math.abs(dy / parseFloat(Layout.window.height / 2)) / 2; 368 | 369 | // Update the underlay opacity 370 | this.state.zoomInOutValue.setValue(opacity); 371 | // Update the actual pan position 372 | this.state.panValue.setValue(dy); 373 | }; 374 | 375 | _onPanResponderEnd = (e, { moveX, moveY, dx, dy, vx, vy }) => { 376 | let { innerContentValue, panValue, zoomInOutValue } = this.state; 377 | panValue.flattenOffset(); 378 | 379 | const duration = 300; 380 | const throwThreshold = 150; 381 | 382 | // The iOS logic should be what we use on both platforms --but-- Android does not 383 | // calculate the vy in the same way! This is a bug 384 | let shouldAnimateOut = false; 385 | if ( 386 | Platform.OS === 'android' && 387 | (dy >= throwThreshold || dy <= -throwThreshold) 388 | ) { 389 | shouldAnimateOut = true; 390 | } else if ( 391 | Platform.OS === 'ios' && 392 | (vy >= 1 || vy <= -1 || (dy >= throwThreshold || dy <= -throwThreshold)) 393 | ) { 394 | shouldAnimateOut = true; 395 | } 396 | 397 | if (shouldAnimateOut) { 398 | this._animateSlideOut(vy, dy); 399 | } else { 400 | Animated.spring(panValue, { 401 | toValue: 0, 402 | speed: 30, 403 | bounciness: 8, 404 | useNativeDriver: USE_NATIVE_DRIVER, 405 | }).start(); 406 | Animated.parallel([ 407 | Animated.timing(innerContentValue, { 408 | toValue: 1, 409 | duration, 410 | useNativeDriver: USE_NATIVE_DRIVER, 411 | }), 412 | Animated.timing(zoomInOutValue, { 413 | toValue: 1, 414 | duration, 415 | useNativeDriver: USE_NATIVE_DRIVER, 416 | }), 417 | ]).start(({ finished }) => { 418 | if (finished) { 419 | this.props.dispatch( 420 | Actions.updateImageGalleryLifecycle(OPEN_AND_IDLE) 421 | ); 422 | } 423 | }); 424 | } 425 | }; 426 | 427 | _enableBackButtonOverride() { 428 | if (Platform.OS === 'android') { 429 | BackHandler.addEventListener('hardwareBackPress', this._handleBackPress); 430 | } 431 | } 432 | 433 | _handleBackPress = () => { 434 | this._closeGallery(); 435 | return true; 436 | }; 437 | 438 | _disableBackButtonOverride() { 439 | if (Platform.OS === 'android') { 440 | BackHandler.removeEventListener( 441 | 'hardwareBackPress', 442 | this._handleBackPress 443 | ); 444 | } 445 | } 446 | } 447 | 448 | export default class ImageGalleryContainer extends React.Component { 449 | render() { 450 | return ( 451 | 452 | 453 | 454 | ); 455 | } 456 | } 457 | 458 | let styles = StyleSheet.create({ 459 | fullSize: { 460 | position: 'absolute', 461 | top: 0, 462 | left: 0, 463 | bottom: 0, 464 | right: 0, 465 | }, 466 | container: { 467 | position: 'absolute', 468 | top: 0, 469 | left: 0, 470 | bottom: 0, 471 | right: 0, 472 | backgroundColor: 'transparent', 473 | }, 474 | underlay: { 475 | position: 'absolute', 476 | top: TOP_OFFSET, 477 | left: 0, 478 | right: 0, 479 | bottom: 0, 480 | backgroundColor: Colors.galleryBackground, 481 | }, 482 | headerBar: { 483 | backgroundColor: Colors.barBackground, 484 | borderBottomWidth: 1 * StyleSheet.hairlineWidth, 485 | borderBottomColor: Colors.barBorder, 486 | height: Layout.headerHeight, 487 | paddingTop: Layout.statusBarHeight, 488 | position: 'absolute', 489 | top: 0, 490 | left: 0, 491 | right: 0, 492 | justifyContent: 'center', 493 | alignItems: 'center', 494 | }, 495 | list: { 496 | position: 'absolute', 497 | top: Layout.headerHeight, 498 | bottom: 0, 499 | left: 0, 500 | right: 0, 501 | overflow: 'hidden', 502 | }, 503 | }); 504 | 505 | -------------------------------------------------------------------------------- /lib/ImageGalleryAnimatedImage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { Animated, Image, StyleSheet, Platform, View } from 'react-native'; 4 | import { connect } from 'react-redux'; 5 | 6 | import ImageGalleryPlaceholder from './ImageGalleryPlaceholder'; 7 | import Layout from './Layout'; 8 | import calculateImageDimensions from './calculateImageDimensions'; 9 | 10 | class ImageGalleryAnimatedImage extends React.PureComponent { 11 | static propTypes = { 12 | animationMeasurements: PropTypes.object, 13 | isDragging: PropTypes.bool, 14 | isImageGalleryOpen: PropTypes.bool, 15 | /* Is visible when zooming in, dragging, or animating out */ 16 | isVisible: PropTypes.bool, 17 | item: PropTypes.object, 18 | panValue: PropTypes.object, 19 | }; 20 | 21 | static getDataProps(data) { 22 | let { imageGallery } = data; 23 | 24 | return { 25 | item: imageGallery.get('item'), 26 | }; 27 | } 28 | 29 | render() { 30 | if (this.props.isDragging || this.props.isImageGalleryOpen) { 31 | return this._renderDraggingState(); 32 | } else { 33 | return this._renderAutoState(); 34 | } 35 | } 36 | 37 | _renderDraggingState() { 38 | let { item, isVisible, panValue } = this.props; 39 | 40 | let uri = item && item.get('image_url'); 41 | let source = uri ? { uri } : null; 42 | let translateY = panValue; 43 | let style = [ 44 | styles.image, 45 | { 46 | opacity: isVisible ? 1 : 0, 47 | top: Layout.headerHeight, 48 | transform: [{ translateY }], 49 | }, 50 | ]; 51 | 52 | if (uri) { 53 | let { 54 | constrainedWidth, 55 | constrainedHeight, 56 | marginHorizontal, 57 | marginVertical, 58 | } = calculateImageDimensions(item, Layout.window.width); 59 | 60 | return ( 61 | 62 | 77 | 78 | ); 79 | } else { 80 | return ; 81 | } 82 | } 83 | 84 | _renderAutoState() { 85 | let { animationMeasurements, item, isVisible, zoomInOutValue } = this.props; 86 | 87 | let uri = item && item.get('image_url'); 88 | let source = uri ? { uri } : null; 89 | 90 | if (!animationMeasurements || !source) { 91 | return ; 92 | } 93 | 94 | let { 95 | constrainedWidth, 96 | constrainedHeight, 97 | marginHorizontal, 98 | marginVertical, 99 | } = calculateImageDimensions(item, Layout.window.width); 100 | 101 | let { x, y, w, h } = animationMeasurements; 102 | let initialScaleX, initialScaleY, scaleX, scaleY, translateX, translateY; 103 | 104 | initialScaleX = parseFloat(w) / constrainedWidth; 105 | initialScaleY = parseFloat(h) / constrainedHeight; 106 | 107 | scaleX = zoomInOutValue.interpolate({ 108 | inputRange: [0, 1], 109 | outputRange: [initialScaleX, 1.0], 110 | }); 111 | 112 | scaleY = zoomInOutValue.interpolate({ 113 | inputRange: [0, 1], 114 | outputRange: [initialScaleY, 1.0], 115 | }); 116 | 117 | translateX = zoomInOutValue.interpolate({ 118 | inputRange: [0, 1], 119 | outputRange: [ 120 | (w - constrainedWidth) / 2 + x, 121 | (Layout.window.width - constrainedWidth) / 2, 122 | ], 123 | }); 124 | 125 | translateY = zoomInOutValue.interpolate({ 126 | inputRange: [0, 1], 127 | outputRange: [ 128 | (h - constrainedHeight) / 2 + y + Layout.statusBarHeight, 129 | Layout.headerHeight + marginVertical + Layout.statusBarHeight, 130 | ], 131 | }); 132 | 133 | return ( 134 | 145 | 155 | 156 | ); 157 | } 158 | } 159 | 160 | export default connect(data => ImageGalleryAnimatedImage.getDataProps(data))( 161 | ImageGalleryAnimatedImage 162 | ); 163 | 164 | let styles = StyleSheet.create({ 165 | image: { 166 | top: 0, 167 | left: 0, 168 | position: 'absolute', 169 | width: Layout.window.width, 170 | height: Layout.window.width, 171 | }, 172 | }); 173 | -------------------------------------------------------------------------------- /lib/ImageGalleryConstants.js: -------------------------------------------------------------------------------- 1 | export const OPENING_ANIMATION_IN_PROGRESS = 'opening-animation-in-progress'; 2 | export const OPEN_AND_IDLE = 'open-and-idle'; 3 | export const DRAG_IN_PROGRESS = 'drag-in-progess'; 4 | export const CLOSED_AND_IDLE = 'closed-and-idle'; 5 | export const CLOSING_ANIMATION_IN_PROGRESS = 'closing-animation-in-progress'; 6 | -------------------------------------------------------------------------------- /lib/ImageGalleryHeaderBar.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { 4 | Animated, 5 | Platform, 6 | StyleSheet, 7 | Text, 8 | TouchableOpacity, 9 | View, 10 | } from 'react-native'; 11 | import { connect } from 'react-redux'; 12 | 13 | import Colors from './Colors'; 14 | import Layout from './Layout'; 15 | import { shallowEquals } from './ShallowEquals'; 16 | 17 | @connect(data => ImageGalleryHeaderBar.getDataProps(data)) 18 | export default class ImageGalleryHeaderBar extends React.Component { 19 | static propTypes = { 20 | activeItemNumber: PropTypes.number, 21 | listLength: PropTypes.number, 22 | animatedOpacity: PropTypes.object.isRequired, 23 | onPressDone: PropTypes.func.isRequired, 24 | renderRight: PropTypes.func, 25 | }; 26 | 27 | static getDataProps(data) { 28 | let { imageGallery } = data; 29 | let list = imageGallery.get('list'); 30 | let item = imageGallery.get('item'); 31 | 32 | let activeItemNumber; 33 | let listLength; 34 | 35 | if (list && item) { 36 | activeItemNumber = list.get('items').indexOf(item) + 1; 37 | listLength = list.get('items').count(); 38 | } 39 | 40 | return { activeItemNumber, listLength }; 41 | } 42 | 43 | shouldComponentUpdate(nextProps) { 44 | return !shallowEquals(this.props, nextProps); 45 | } 46 | 47 | render() { 48 | let { 49 | animatedOpacity, 50 | activeItemNumber, 51 | listLength, 52 | onPressDone, 53 | style, 54 | } = this.props; 55 | 56 | let rightAction; 57 | if (this.props.renderRight) { 58 | rightAction = this.props.renderRight(onPressDone); 59 | } else { 60 | rightAction = ( 61 | 69 | Done 70 | 71 | ); 72 | } 73 | 74 | return ( 75 | 76 | 77 | {activeItemNumber} / {listLength} 78 | 79 | 80 | 81 | {rightAction} 82 | 83 | 84 | ); 85 | } 86 | } 87 | 88 | let styles = StyleSheet.create({ 89 | headeBarTitleText: { 90 | color: Colors.barTitle, 91 | }, 92 | headerBarButtonText: { 93 | color: Colors.enabledButtonText, 94 | }, 95 | headerBarRightAction: { 96 | position: 'absolute', 97 | top: Layout.statusBarHeight, 98 | bottom: 0, 99 | right: 15, 100 | alignItems: 'center', 101 | justifyContent: 'center', 102 | }, 103 | }); 104 | 105 | -------------------------------------------------------------------------------- /lib/ImageGalleryImage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { 4 | ActivityIndicator, 5 | Image, 6 | StyleSheet, 7 | View, 8 | } from 'react-native'; 9 | 10 | import ImageGalleryPlaceholder from './ImageGalleryPlaceholder'; 11 | import { shallowEquals } from './ShallowEquals'; 12 | import calculateImageDimensions from './calculateImageDimensions'; 13 | 14 | export default class ImageGalleryImage extends React.Component { 15 | static propTypes = { 16 | item: PropTypes.object, 17 | fadeInOnLoad: PropTypes.bool, 18 | width: PropTypes.number, 19 | isVisible: PropTypes.bool, 20 | }; 21 | 22 | constructor(props, context) { 23 | super(props, context); 24 | 25 | this.state = { hideThrobber: false }; 26 | } 27 | 28 | shouldComponentUpdate(nextProps, nextState) { 29 | return !shallowEquals(this.props, nextProps) || 30 | !shallowEquals(this.state, nextState); 31 | } 32 | 33 | render() { 34 | let { item, width, isVisible } = this.props; 35 | 36 | let imageStyle = { 37 | width, 38 | height: width, 39 | opacity: isVisible ? 1 : 0, 40 | borderRadius: 0.1, 41 | }; 42 | 43 | if (item.get('image_url')) { 44 | let imageUri = item.getIn(['asset', 'url']) || item.get('image_url'); 45 | 46 | let { 47 | constrainedWidth, 48 | constrainedHeight, 49 | marginHorizontal, 50 | marginVertical, 51 | } = calculateImageDimensions(item, width); 52 | 53 | let imageLayout = { 54 | height: constrainedHeight, 55 | width: constrainedWidth, 56 | marginVertical, 57 | marginHorizontal, 58 | }; 59 | 60 | let isAnimatedImage = item.getIn(['asset', 'type']) === 'animated_image'; 61 | 62 | let image; 63 | if ((isAnimatedImage && this.props.isFocused) || !isAnimatedImage) { 64 | image = ( 65 | 70 | ); 71 | } 72 | 73 | let coverImage; 74 | if (isAnimatedImage) { 75 | let coverUri = item.getIn(['asset', 'cover', 'url']); 76 | coverImage = ( 77 | 81 | ); 82 | } 83 | 84 | if (coverImage) { 85 | image = {image}; 86 | } 87 | 88 | return ( 89 | 90 | {this._maybeRenderThrobber()} 91 | {coverImage} 92 | {image} 93 | 94 | ); 95 | } else { 96 | return ; 97 | } 98 | } 99 | 100 | _onImageLoad = () => { 101 | this.setState({hideThrobber: true}); 102 | }; 103 | 104 | _maybeRenderThrobber() { 105 | let { isVisible } = this.props; 106 | let { hideThrobber } = this.state; 107 | 108 | if (hideThrobber || !isVisible) { 109 | return; 110 | } 111 | 112 | return ( 113 | 114 | 115 | 116 | ); 117 | } 118 | } 119 | 120 | let styles = StyleSheet.create({ 121 | throbberContainer: { 122 | alignItems: 'center', 123 | justifyContent: 'center', 124 | position: 'absolute', 125 | top: 0, 126 | left: 0, 127 | bottom: 0, 128 | right: 0, 129 | backgroundColor: '#e8e8ec', 130 | }, 131 | absoluteFill: { 132 | position: 'absolute', 133 | top: 0, 134 | bottom: 0, 135 | left: 0, 136 | right: 0, 137 | }, 138 | 139 | }); 140 | -------------------------------------------------------------------------------- /lib/ImageGalleryItem.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { 4 | Platform, 5 | StyleSheet, 6 | TouchableWithoutFeedback, 7 | Text, 8 | View, 9 | } from 'react-native'; 10 | 11 | import { connect } from 'react-redux'; 12 | 13 | import { 14 | OPENING_ANIMATION_IN_PROGRESS, 15 | OPEN_AND_IDLE, 16 | DRAG_IN_PROGRESS, 17 | } from './ImageGalleryConstants'; 18 | import Colors from './Colors'; 19 | import ImageGalleryImage from './ImageGalleryImage'; 20 | import { shallowEquals, shallowEqualsIgnoreKeys } from './ShallowEquals'; 21 | 22 | class ImageGalleryItem extends React.Component { 23 | 24 | static propTypes = { 25 | item: PropTypes.object, 26 | index: PropTypes.number, 27 | activeItem: PropTypes.object, 28 | activeItemIndex: PropTypes.number, 29 | initialItem: PropTypes.object, 30 | list: PropTypes.object, 31 | lifecycle: PropTypes.string, 32 | width: PropTypes.number, 33 | userWantsOpen: PropTypes.bool, 34 | renderDescription: PropTypes.func, 35 | }; 36 | 37 | static getDataProps(data) { 38 | let { imageGallery } = data; 39 | 40 | return { 41 | activeItemIndex: imageGallery.get('itemIndex'), 42 | activeItem: imageGallery.get('item'), 43 | initialItem: imageGallery.get('initialItem'), 44 | userWantsOpen: imageGallery.get('userWantsOpen'), 45 | lifecycle: imageGallery.get('lifecycle'), 46 | }; 47 | } 48 | 49 | constructor(props, context) { 50 | super(props, context); 51 | 52 | this.state = { 53 | shouldRender: false, 54 | }; 55 | } 56 | 57 | shouldComponentUpdate(nextProps, nextState) { 58 | let keysToIgnore = ['list']; 59 | 60 | if (nextProps.lifecycle === DRAG_IN_PROGRESS) { 61 | if (nextProps.activeItem !== this.props.item) { 62 | return false; 63 | } 64 | } 65 | 66 | if (nextProps.lifecycle === OPEN_AND_IDLE) { 67 | if (this.props.index === nextProps.activeItemIndex) { 68 | return true; 69 | } 70 | } 71 | 72 | return !shallowEqualsIgnoreKeys(this.props, nextProps, keysToIgnore) || 73 | !shallowEquals(this.state, nextState); 74 | } 75 | 76 | componentWillMount() { 77 | if (this._shouldRender(this.props)) { 78 | this.setState({shouldRender: true}); 79 | } 80 | } 81 | 82 | componentWillReceiveProps(nextProps) { 83 | if (!this.state.shouldRender && this._shouldRender(nextProps)) { 84 | this.setState({shouldRender: true}); 85 | } 86 | } 87 | 88 | /* Extremely basic logic for determining what should render and when */ 89 | _shouldRender(nextProps) { 90 | if (nextProps.activeItemIndex === this.props.index) { 91 | return true; 92 | } 93 | 94 | if (nextProps.lifecycle === OPEN_AND_IDLE) { 95 | if (nextProps.activeItemIndex - 1 === this.props.index || 96 | nextProps.activeItemIndex + 1 === this.props.index) { 97 | return true; 98 | } 99 | } 100 | 101 | return false; 102 | } 103 | 104 | render() { 105 | let { item, index, list, width, lifecycle, renderDescription } = this.props; 106 | let description; 107 | 108 | if (renderDescription) { 109 | description = renderDescription(item.get('description')); 110 | } else { 111 | description = ( 112 | 113 | {item.get('description')} 114 | 115 | ); 116 | } 117 | 118 | if (this.state.shouldRender) { 119 | return ( 120 | 121 | 122 | 123 | {lifecycle !== OPENING_ANIMATION_IN_PROGRESS || Platform.OS === 'ios' ? 124 | this._renderImage() : null} 125 | 126 | 127 | 128 | {description} 129 | 130 | ); 131 | } else { 132 | return ( 133 | 134 | 135 | 136 | 137 | ); 138 | } 139 | } 140 | 141 | _renderImage() { 142 | let { 143 | activeItemIndex, 144 | index, 145 | initialItem, 146 | item, 147 | lifecycle, 148 | width, 149 | } = this.props; 150 | 151 | return ( 152 | 159 | ); 160 | } 161 | } 162 | 163 | export default connect( 164 | data => ImageGalleryItem.getDataProps(data), 165 | )(ImageGalleryItem); 166 | 167 | let styles = StyleSheet.create({ 168 | itemContainer: { 169 | flex: 1, 170 | backgroundColor: Colors.galleryBackground, 171 | }, 172 | imageContainer: { 173 | borderBottomWidth: 1, 174 | borderBottomColor: '#deddde', 175 | }, 176 | listItemContainerStyle: { 177 | flex: 1, 178 | backgroundColor: '#fff', 179 | }, 180 | }); 181 | -------------------------------------------------------------------------------- /lib/ImageGalleryList.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { View } from 'react-native'; 4 | 5 | import ImageGalleryItem from './ImageGalleryItem'; 6 | import Layout from './Layout'; 7 | import ViewPager from './ViewPager'; 8 | 9 | export default class ImageGalleryList extends React.PureComponent { 10 | static propTypes = { 11 | list: PropTypes.object, 12 | onPageSelected: PropTypes.func.isRequired, 13 | renderDescription: PropTypes.func, 14 | }; 15 | 16 | render() { 17 | let { list } = this.props; 18 | 19 | return ( 20 | { 24 | this._pager = view; 25 | }} 26 | onPageSelected={this.props.onPageSelected}> 27 | {/* Ideally we would do this inside of a ListView.. But that is not 28 | currently supported by ViewPager -- it does not conform to the 29 | ScrollView interface that ListView expects from 30 | renderScrollComponent */} 31 | {list && list.get('items').map(this._renderItem)} 32 | 33 | ); 34 | } 35 | 36 | _renderItem = (item, i) => { 37 | let { list } = this.props; 38 | 39 | // note(brentvatne): I'm not sure why but items can get into this state 40 | // without having an id! Weird. So let's use the array index if they don't 41 | // have an id. 42 | let id; 43 | if (!item || !item.get || !item.get('id') || !item.get('id').toString) { 44 | id = i.toString(); 45 | } else { 46 | id = item.get('id').toString(); 47 | } 48 | 49 | return ( 50 | 51 | 59 | 60 | ); 61 | }; 62 | 63 | scrollToPage(index) { 64 | this._pager.scrollToPage(index); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /lib/ImageGalleryPlaceholder.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { 3 | Animated, 4 | StyleSheet, 5 | View, 6 | } from 'react-native'; 7 | 8 | import Colors from './Colors'; 9 | 10 | export default class ImagePlaceholder extends React.Component { 11 | 12 | render() { 13 | return ( 14 | 17 | 18 | 19 | ); 20 | } 21 | } 22 | 23 | let styles = StyleSheet.create({ 24 | imageContainer: { 25 | borderBottomWidth: 1, 26 | borderBottomColor: '#deddde', 27 | }, 28 | imageBase: { 29 | backgroundColor: Colors.galleryBackground, 30 | alignItems: 'center', 31 | justifyContent: 'center', 32 | }, 33 | placeholderImage: { 34 | width: 85, 35 | height: 85, 36 | }, 37 | }); 38 | -------------------------------------------------------------------------------- /lib/ImageGalleryReducer.js: -------------------------------------------------------------------------------- 1 | import Immutable from 'immutable'; 2 | import ActionTypes from './ActionTypes'; 3 | 4 | import { 5 | OPENING_ANIMATION_IN_PROGRESS, 6 | CLOSED_AND_IDLE, 7 | CLOSING_ANIMATION_IN_PROGRESS, 8 | } from './ImageGalleryConstants'; 9 | 10 | const { Map } = Immutable; 11 | 12 | function emptyState() { 13 | return Map({lifecycle: CLOSED_AND_IDLE}); 14 | } 15 | 16 | class ImageGalleryReducer { 17 | static reduce(state = emptyState(), action) { 18 | if (!ImageGalleryReducer[action.type]) { 19 | return state; 20 | } 21 | return ImageGalleryReducer[action.type](state, action); 22 | } 23 | 24 | static [ActionTypes.OPEN_IMAGE_GALLERY](state, action) { 25 | let { list, item, animationMeasurements } = action; 26 | let itemIndex = list.get('items').indexOf(item); 27 | 28 | if (state.get('lifecycle') !== CLOSED_AND_IDLE) { 29 | return state; 30 | } 31 | 32 | return state.withMutations(map => { 33 | return map.set('list', list) 34 | .set('item', item) 35 | .set('initialItem', item) 36 | .set('itemIndex', itemIndex) 37 | .set('lifecycle', OPENING_ANIMATION_IN_PROGRESS) 38 | .set('animationMeasurements', animationMeasurements) 39 | .set('userWantsOpen', true); 40 | }); 41 | } 42 | 43 | static [ActionTypes.PRELOAD_IMAGE_GALLERY](state, action) { 44 | let { list } = action; 45 | let item = list.get(0); 46 | 47 | return state.withMutations(map => { 48 | return map.set('list', list) 49 | .set('item', item) 50 | .set('initialItem', item) 51 | .set('itemIndex', 0) 52 | .set('lifecycle', CLOSED_AND_IDLE) 53 | .set('userWantsOpen', false); 54 | }); 55 | } 56 | 57 | static [ActionTypes.UPDATE_IMAGE_GALLERY_LIFECYCLE](state, action) { 58 | return state.withMutations(map => { 59 | return map.set('lifecycle', action.lifecycle) 60 | .set('userWantsOpen', action.lifecycle === CLOSED_AND_IDLE ? false : state.get('userWantsOpen')); 61 | }); 62 | } 63 | 64 | static [ActionTypes.CLOSE_IMAGE_GALLERY](state, action) { 65 | if (state.get('lifecycle') === CLOSED_AND_IDLE) { 66 | console.warn('Fired CLOSED_IMAGE_GALLERY with the gallery already closed!'); 67 | return state; 68 | } 69 | 70 | return state.withMutations(map => { 71 | return map.remove('userWantsOpen') 72 | .set('lifecycle', CLOSING_ANIMATION_IN_PROGRESS); 73 | }); 74 | } 75 | 76 | static [ActionTypes.FOCUS_IMAGE_GALLERY_ITEM](state, action) { 77 | let itemIndex = state.get('list').get('items').indexOf(action.item); 78 | 79 | return state.withMutations(map => { 80 | return map.set('item', action.item) 81 | .set('itemIndex', itemIndex); 82 | }); 83 | } 84 | 85 | static [ActionTypes.UPDATE_IMAGE_GALLERY_ANIMATION_MEASUREMENTS](state, action) { 86 | return state.set('animationMeasurements', action.animationMeasurements); 87 | } 88 | 89 | static [ActionTypes.RESET](state, action) { 90 | return emptyState(); 91 | } 92 | } 93 | 94 | export default ImageGalleryReducer.reduce; 95 | -------------------------------------------------------------------------------- /lib/Layout.js: -------------------------------------------------------------------------------- 1 | import { 2 | Dimensions, 3 | NativeModules, 4 | PixelRatio, 5 | Platform, 6 | StyleSheet, 7 | } from 'react-native'; 8 | 9 | import { Header } from 'react-navigation'; 10 | import Constants from 'expo-constants'; 11 | 12 | const X_WIDTH = 375; 13 | const X_HEIGHT = 812; 14 | const { height: D_HEIGHT, width: D_WIDTH } = Dimensions.get('window'); 15 | const isIPhoneX = 16 | Platform.OS === 'ios' && (D_HEIGHT === X_HEIGHT && D_WIDTH === X_WIDTH); 17 | 18 | let windowDimensions = Dimensions.get('window'); 19 | let isSmallDevice = windowDimensions.width <= 320; 20 | 21 | const notchHeight = isIPhoneX ? 20 : 0; 22 | 23 | let Layout = { 24 | isSmallDevice, 25 | pixel: 1 / PixelRatio.get(), 26 | narrowSeparator: StyleSheet.hairlineWidth, 27 | separator: 1, 28 | tabBarHeight: 49, 29 | navigationBarDisplacement: 0, 30 | notchHeight, 31 | footerHeight: 49, 32 | marginHorizontal: isSmallDevice ? 10 : 15, 33 | statusBarHeight: Constants.statusBarHeight, 34 | timestampWidth: 35, 35 | window: windowDimensions, 36 | navigationBarHeight: 44, 37 | softButtonHeight: 48, 38 | navigationBarDisplacement: 25, 39 | }; 40 | 41 | Layout.headerHeight = 42 | Platform.OS === 'android' 43 | ? Header.HEIGHT + Constants.statusBarHeight 44 | : Header.HEIGHT + notchHeight; 45 | 46 | export default Layout; 47 | -------------------------------------------------------------------------------- /lib/ShallowEquals.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Based off of shallowEqual utility in react-redux 3 | */ 4 | export function shallowEqualsIgnoreKeys(objA, objB, keysToIgnore) { 5 | if (objA === objB) { 6 | return true; 7 | } 8 | 9 | const keysA = Object.keys(objA); 10 | const keysB = Object.keys(objB); 11 | 12 | if (keysA.length !== keysB.length) { 13 | return false; 14 | } 15 | 16 | // Test for A's keys different from B. 17 | const hasOwn = Object.prototype.hasOwnProperty; 18 | for (let i = 0; i < keysA.length; i++) { 19 | if ((keysToIgnore.indexOf(keysA[i]) === -1) && 20 | (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]])) { 21 | return false; 22 | } 23 | } 24 | 25 | return true; 26 | } 27 | 28 | export function shallowEqualsIgnoreKey(objA, objB, keyToIgnore) { 29 | return shallowEqualsIgnoreKeys(objA, objB, [keyToIgnore]); 30 | } 31 | 32 | export function shallowEquals(objA, objB) { 33 | return shallowEqualsIgnoreKeys(objA, objB, []); 34 | } 35 | 36 | export default { 37 | shallowEquals, 38 | shallowEqualsIgnoreKey, 39 | shallowEqualsIgnoreKeys, 40 | }; 41 | -------------------------------------------------------------------------------- /lib/ViewPager.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { 4 | Dimensions, 5 | Platform, 6 | ScrollView, 7 | ViewPagerAndroid, 8 | View, 9 | } from 'react-native'; 10 | 11 | import Layout from './Layout'; 12 | 13 | export default class ViewPager extends React.Component { 14 | static propTypes = { 15 | onPageSelected: PropTypes.func.isRequired, 16 | }; 17 | 18 | render() { 19 | if (Platform.OS === 'ios') { 20 | return ( 21 | { 28 | this._scrollView = view; 29 | }} 30 | removeClippedSubviews 31 | alwaysBounceHorizontal={false} 32 | bounces={false} 33 | showsHorizontalScrollIndicator={false} 34 | {...this.props} 35 | /> 36 | ); 37 | } else { 38 | return ( 39 | { 42 | this._pager = view; 43 | }} 44 | onPageSelected={this._onPageSelected} 45 | /> 46 | ); 47 | } 48 | } 49 | 50 | scrollToPage(index) { 51 | if (Platform.OS === 'ios') { 52 | let scrollPositionX = index * Layout.window.width; 53 | this._scrollView.scrollTo({ y: 0, x: scrollPositionX, animated: false }); 54 | } else { 55 | this._pager.setPageWithoutAnimation(index); 56 | } 57 | } 58 | 59 | _onScrollEnd = ({ nativeEvent: { contentOffset: { x } } }) => { 60 | let index = parseInt(x / Layout.window.width, 10); 61 | this.props.onPageSelected(index); 62 | }; 63 | 64 | _onPageSelected = ({ nativeEvent: { position } }) => { 65 | this.props.onPageSelected(position); 66 | }; 67 | } 68 | -------------------------------------------------------------------------------- /lib/calculateImageDimensions.js: -------------------------------------------------------------------------------- 1 | export default function calculateImageDimensions(item, maxLength) { 2 | let originalWidth = item.getIn(['asset', 'width']); 3 | let originalHeight = item.getIn(['asset', 'height']); 4 | 5 | if (originalWidth == null || originalHeight == null) { 6 | return { 7 | constrainedHeight: maxLength, 8 | constrainedWidth: maxLength, 9 | marginHorizontal: 0, 10 | marginVertical: 0, 11 | }; 12 | } else if (originalWidth > originalHeight) { 13 | let height = (originalHeight / originalWidth) * maxLength; 14 | return { 15 | constrainedHeight: height, 16 | constrainedWidth: maxLength, 17 | marginHorizontal: 0, 18 | marginVertical: (maxLength - height) / 2, 19 | }; 20 | } else { 21 | let width = (originalWidth / originalHeight) * maxLength; 22 | return { 23 | constrainedWidth: width, 24 | constrainedHeight: maxLength, 25 | marginHorizontal: (maxLength - width) / 2, 26 | marginVertical: 0, 27 | }; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | import ImageGallery from './ImageGallery'; 2 | 3 | export default ImageGallery; 4 | export { default as openImageGallery } from './openImageGallery'; 5 | -------------------------------------------------------------------------------- /lib/openImageGallery.js: -------------------------------------------------------------------------------- 1 | import Actions from './Actions'; 2 | import DefaultStore from './DefaultStore'; 3 | import Immutable from 'immutable'; 4 | import { Asset } from 'expo-asset'; 5 | 6 | function transformToInternalStructure(images) { 7 | let internalImageFormat = images.map((info, i) => { 8 | let image; 9 | 10 | if (info.image) { 11 | let assetInfo = Asset.fromModule(info.image); 12 | image = { 13 | ...info, 14 | imageUrl: assetInfo.uri, 15 | width: assetInfo.width, 16 | height: assetInfo.height, 17 | }; 18 | } else { 19 | image = info; 20 | } 21 | 22 | return { 23 | id: image.imageUrl, 24 | image_url: image.imageUrl, 25 | description: image.description, 26 | width: image.width, 27 | height: image.height, 28 | asset: { 29 | type: 'static', 30 | width: image.width, 31 | height: image.height, 32 | cover: { 33 | uri: image.imageUrl, 34 | }, 35 | }, 36 | }; 37 | }); 38 | 39 | return Immutable.fromJS({ 40 | items: internalImageFormat, 41 | list_id: new Date().toISOString(), 42 | }); 43 | } 44 | 45 | export default function openImageGallery(options) { 46 | let selectedItemIndex = options.list.indexOf(options.item); 47 | let list = transformToInternalStructure(options.list); 48 | let item = list.get('items').get(selectedItemIndex); 49 | 50 | DefaultStore.dispatch( 51 | Actions.openImageGallery({ 52 | ...options, 53 | list, 54 | item, 55 | }), 56 | ); 57 | } 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-navigation-image-gallery", 3 | "version": "3.1.0", 4 | "description": "Image gallery for React Navigation", 5 | "author": "support@expo.io", 6 | "files": [ 7 | "lib" 8 | ], 9 | "main": "lib/index.js", 10 | "directories": { 11 | "example": "example", 12 | "lib": "lib" 13 | }, 14 | "homepage": "https://github.com/expo/react-native-image-gallery#readme", 15 | "keywords": [ 16 | "expo", 17 | "photos", 18 | "images", 19 | "gallery" 20 | ], 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/expo/react-native-image-gallery/issues" 24 | }, 25 | "dependencies": { 26 | "immutable": "^3.8.1", 27 | "mirror-creator": "^1.1.0", 28 | "prop-types": "^15.6.2", 29 | "react-redux": "^4.4.5", 30 | "react-timer-mixin": "^0.13.4", 31 | "redux": "^3.5.2" 32 | }, 33 | "peerDependencies": { 34 | "react-native": "*", 35 | "react-navigation": "*" 36 | }, 37 | "devDependencies": { 38 | "babel-preset-expo": "^5.0.0", 39 | "babel-preset-react-native": "^4.0.1" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/generator@^7.2.2": 13 | version "7.3.0" 14 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.0.tgz#f663838cd7b542366de3aa608a657b8ccb2a99eb" 15 | integrity sha512-dZTwMvTgWfhmibq4V9X+LMf6Bgl7zAodRn9PvcPdhlzFMbvUutx74dbEv7Atz3ToeEpevYEJtAwfxq/bDCzHWg== 16 | dependencies: 17 | "@babel/types" "^7.3.0" 18 | jsesc "^2.5.1" 19 | lodash "^4.17.10" 20 | source-map "^0.5.0" 21 | trim-right "^1.0.1" 22 | 23 | "@babel/helper-annotate-as-pure@^7.0.0": 24 | version "7.0.0" 25 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" 26 | integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== 27 | dependencies: 28 | "@babel/types" "^7.0.0" 29 | 30 | "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": 31 | version "7.1.0" 32 | resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" 33 | integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== 34 | dependencies: 35 | "@babel/helper-explode-assignable-expression" "^7.1.0" 36 | "@babel/types" "^7.0.0" 37 | 38 | "@babel/helper-builder-react-jsx@^7.3.0": 39 | version "7.3.0" 40 | resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" 41 | integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== 42 | dependencies: 43 | "@babel/types" "^7.3.0" 44 | esutils "^2.0.0" 45 | 46 | "@babel/helper-call-delegate@^7.1.0": 47 | version "7.1.0" 48 | resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" 49 | integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== 50 | dependencies: 51 | "@babel/helper-hoist-variables" "^7.0.0" 52 | "@babel/traverse" "^7.1.0" 53 | "@babel/types" "^7.0.0" 54 | 55 | "@babel/helper-create-class-features-plugin@^7.3.0": 56 | version "7.3.0" 57 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.0.tgz#2b01a81b3adc2b1287f9ee193688ef8dc71e718f" 58 | integrity sha512-DUsQNS2CGLZZ7I3W3fvh0YpPDd6BuWJlDl+qmZZpABZHza2ErE3LxtEzLJFHFC1ZwtlAXvHhbFYbtM5o5B0WBw== 59 | dependencies: 60 | "@babel/helper-function-name" "^7.1.0" 61 | "@babel/helper-member-expression-to-functions" "^7.0.0" 62 | "@babel/helper-optimise-call-expression" "^7.0.0" 63 | "@babel/helper-plugin-utils" "^7.0.0" 64 | "@babel/helper-replace-supers" "^7.2.3" 65 | 66 | "@babel/helper-define-map@^7.1.0": 67 | version "7.1.0" 68 | resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" 69 | integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== 70 | dependencies: 71 | "@babel/helper-function-name" "^7.1.0" 72 | "@babel/types" "^7.0.0" 73 | lodash "^4.17.10" 74 | 75 | "@babel/helper-explode-assignable-expression@^7.1.0": 76 | version "7.1.0" 77 | resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" 78 | integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== 79 | dependencies: 80 | "@babel/traverse" "^7.1.0" 81 | "@babel/types" "^7.0.0" 82 | 83 | "@babel/helper-function-name@^7.1.0": 84 | version "7.1.0" 85 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" 86 | integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== 87 | dependencies: 88 | "@babel/helper-get-function-arity" "^7.0.0" 89 | "@babel/template" "^7.1.0" 90 | "@babel/types" "^7.0.0" 91 | 92 | "@babel/helper-get-function-arity@^7.0.0": 93 | version "7.0.0" 94 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" 95 | integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== 96 | dependencies: 97 | "@babel/types" "^7.0.0" 98 | 99 | "@babel/helper-hoist-variables@^7.0.0": 100 | version "7.0.0" 101 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" 102 | integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== 103 | dependencies: 104 | "@babel/types" "^7.0.0" 105 | 106 | "@babel/helper-member-expression-to-functions@^7.0.0": 107 | version "7.0.0" 108 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" 109 | integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== 110 | dependencies: 111 | "@babel/types" "^7.0.0" 112 | 113 | "@babel/helper-module-imports@^7.0.0": 114 | version "7.0.0" 115 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" 116 | integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== 117 | dependencies: 118 | "@babel/types" "^7.0.0" 119 | 120 | "@babel/helper-module-transforms@^7.1.0": 121 | version "7.2.2" 122 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" 123 | integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== 124 | dependencies: 125 | "@babel/helper-module-imports" "^7.0.0" 126 | "@babel/helper-simple-access" "^7.1.0" 127 | "@babel/helper-split-export-declaration" "^7.0.0" 128 | "@babel/template" "^7.2.2" 129 | "@babel/types" "^7.2.2" 130 | lodash "^4.17.10" 131 | 132 | "@babel/helper-optimise-call-expression@^7.0.0": 133 | version "7.0.0" 134 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" 135 | integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== 136 | dependencies: 137 | "@babel/types" "^7.0.0" 138 | 139 | "@babel/helper-plugin-utils@^7.0.0": 140 | version "7.0.0" 141 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" 142 | integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== 143 | 144 | "@babel/helper-regex@^7.0.0": 145 | version "7.0.0" 146 | resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" 147 | integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== 148 | dependencies: 149 | lodash "^4.17.10" 150 | 151 | "@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.2.3": 152 | version "7.2.3" 153 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" 154 | integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== 155 | dependencies: 156 | "@babel/helper-member-expression-to-functions" "^7.0.0" 157 | "@babel/helper-optimise-call-expression" "^7.0.0" 158 | "@babel/traverse" "^7.2.3" 159 | "@babel/types" "^7.0.0" 160 | 161 | "@babel/helper-simple-access@^7.1.0": 162 | version "7.1.0" 163 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" 164 | integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== 165 | dependencies: 166 | "@babel/template" "^7.1.0" 167 | "@babel/types" "^7.0.0" 168 | 169 | "@babel/helper-split-export-declaration@^7.0.0": 170 | version "7.0.0" 171 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" 172 | integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== 173 | dependencies: 174 | "@babel/types" "^7.0.0" 175 | 176 | "@babel/highlight@^7.0.0": 177 | version "7.0.0" 178 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 179 | integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== 180 | dependencies: 181 | chalk "^2.0.0" 182 | esutils "^2.0.2" 183 | js-tokens "^4.0.0" 184 | 185 | "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": 186 | version "7.3.1" 187 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.1.tgz#8f4ffd45f779e6132780835ffa7a215fa0b2d181" 188 | integrity sha512-ATz6yX/L8LEnC3dtLQnIx4ydcPxhLcoy9Vl6re00zb2w5lG6itY6Vhnr1KFRPq/FHNsgl/gh2mjNN20f9iJTTA== 189 | 190 | "@babel/plugin-proposal-class-properties@^7.0.0": 191 | version "7.3.0" 192 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd" 193 | integrity sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg== 194 | dependencies: 195 | "@babel/helper-create-class-features-plugin" "^7.3.0" 196 | "@babel/helper-plugin-utils" "^7.0.0" 197 | 198 | "@babel/plugin-proposal-decorators@^7.1.0": 199 | version "7.3.0" 200 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz#637ba075fa780b1f75d08186e8fb4357d03a72a7" 201 | integrity sha512-3W/oCUmsO43FmZIqermmq6TKaRSYhmh/vybPfVFwQWdSb8xwki38uAIvknCRzuyHRuYfCYmJzL9or1v0AffPjg== 202 | dependencies: 203 | "@babel/helper-create-class-features-plugin" "^7.3.0" 204 | "@babel/helper-plugin-utils" "^7.0.0" 205 | "@babel/plugin-syntax-decorators" "^7.2.0" 206 | 207 | "@babel/plugin-proposal-export-default-from@^7.0.0": 208 | version "7.2.0" 209 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.2.0.tgz#737b0da44b9254b6152fe29bb99c64e5691f6f68" 210 | integrity sha512-NVfNe7F6nsasG1FnvcFxh2FN0l04ZNe75qTOAVOILWPam0tw9a63RtT/Dab8dPjedZa4fTQaQ83yMMywF9OSug== 211 | dependencies: 212 | "@babel/helper-plugin-utils" "^7.0.0" 213 | "@babel/plugin-syntax-export-default-from" "^7.2.0" 214 | 215 | "@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": 216 | version "7.2.0" 217 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.2.0.tgz#c3fda766187b2f2162657354407247a758ee9cf9" 218 | integrity sha512-QXj/YjFuFJd68oDvoc1e8aqLr2wz7Kofzvp6Ekd/o7MWZl+nZ0/cpStxND+hlZ7DpRWAp7OmuyT2areZ2V3YUA== 219 | dependencies: 220 | "@babel/helper-plugin-utils" "^7.0.0" 221 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" 222 | 223 | "@babel/plugin-proposal-object-rest-spread@^7.0.0": 224 | version "7.3.1" 225 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.1.tgz#f69fb6a1ea6a4e1c503994a91d9cf76f3c4b36e8" 226 | integrity sha512-Nmmv1+3LqxJu/V5jU9vJmxR/KIRWFk2qLHmbB56yRRRFhlaSuOVXscX3gUmhaKgUhzA3otOHVubbIEVYsZ0eZg== 227 | dependencies: 228 | "@babel/helper-plugin-utils" "^7.0.0" 229 | "@babel/plugin-syntax-object-rest-spread" "^7.2.0" 230 | 231 | "@babel/plugin-proposal-optional-catch-binding@^7.0.0": 232 | version "7.2.0" 233 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" 234 | integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== 235 | dependencies: 236 | "@babel/helper-plugin-utils" "^7.0.0" 237 | "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" 238 | 239 | "@babel/plugin-proposal-optional-chaining@^7.0.0": 240 | version "7.2.0" 241 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" 242 | integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== 243 | dependencies: 244 | "@babel/helper-plugin-utils" "^7.0.0" 245 | "@babel/plugin-syntax-optional-chaining" "^7.2.0" 246 | 247 | "@babel/plugin-syntax-decorators@^7.2.0": 248 | version "7.2.0" 249 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" 250 | integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== 251 | dependencies: 252 | "@babel/helper-plugin-utils" "^7.0.0" 253 | 254 | "@babel/plugin-syntax-dynamic-import@^7.0.0": 255 | version "7.2.0" 256 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" 257 | integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== 258 | dependencies: 259 | "@babel/helper-plugin-utils" "^7.0.0" 260 | 261 | "@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.2.0": 262 | version "7.2.0" 263 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz#edd83b7adc2e0d059e2467ca96c650ab6d2f3820" 264 | integrity sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw== 265 | dependencies: 266 | "@babel/helper-plugin-utils" "^7.0.0" 267 | 268 | "@babel/plugin-syntax-flow@^7.2.0": 269 | version "7.2.0" 270 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" 271 | integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== 272 | dependencies: 273 | "@babel/helper-plugin-utils" "^7.0.0" 274 | 275 | "@babel/plugin-syntax-jsx@^7.2.0": 276 | version "7.2.0" 277 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" 278 | integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== 279 | dependencies: 280 | "@babel/helper-plugin-utils" "^7.0.0" 281 | 282 | "@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": 283 | version "7.2.0" 284 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" 285 | integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== 286 | dependencies: 287 | "@babel/helper-plugin-utils" "^7.0.0" 288 | 289 | "@babel/plugin-syntax-object-rest-spread@^7.2.0": 290 | version "7.2.0" 291 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" 292 | integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== 293 | dependencies: 294 | "@babel/helper-plugin-utils" "^7.0.0" 295 | 296 | "@babel/plugin-syntax-optional-catch-binding@^7.2.0": 297 | version "7.2.0" 298 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" 299 | integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== 300 | dependencies: 301 | "@babel/helper-plugin-utils" "^7.0.0" 302 | 303 | "@babel/plugin-syntax-optional-chaining@^7.2.0": 304 | version "7.2.0" 305 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" 306 | integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== 307 | dependencies: 308 | "@babel/helper-plugin-utils" "^7.0.0" 309 | 310 | "@babel/plugin-syntax-typescript@^7.2.0": 311 | version "7.2.0" 312 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz#55d240536bd314dcbbec70fd949c5cabaed1de29" 313 | integrity sha512-WhKr6yu6yGpGcNMVgIBuI9MkredpVc7Y3YR4UzEZmDztHoL6wV56YBHLhWnjO1EvId1B32HrD3DRFc+zSoKI1g== 314 | dependencies: 315 | "@babel/helper-plugin-utils" "^7.0.0" 316 | 317 | "@babel/plugin-transform-arrow-functions@^7.0.0": 318 | version "7.2.0" 319 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" 320 | integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== 321 | dependencies: 322 | "@babel/helper-plugin-utils" "^7.0.0" 323 | 324 | "@babel/plugin-transform-block-scoping@^7.0.0": 325 | version "7.2.0" 326 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" 327 | integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== 328 | dependencies: 329 | "@babel/helper-plugin-utils" "^7.0.0" 330 | lodash "^4.17.10" 331 | 332 | "@babel/plugin-transform-classes@^7.0.0": 333 | version "7.2.2" 334 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" 335 | integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== 336 | dependencies: 337 | "@babel/helper-annotate-as-pure" "^7.0.0" 338 | "@babel/helper-define-map" "^7.1.0" 339 | "@babel/helper-function-name" "^7.1.0" 340 | "@babel/helper-optimise-call-expression" "^7.0.0" 341 | "@babel/helper-plugin-utils" "^7.0.0" 342 | "@babel/helper-replace-supers" "^7.1.0" 343 | "@babel/helper-split-export-declaration" "^7.0.0" 344 | globals "^11.1.0" 345 | 346 | "@babel/plugin-transform-computed-properties@^7.0.0": 347 | version "7.2.0" 348 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" 349 | integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== 350 | dependencies: 351 | "@babel/helper-plugin-utils" "^7.0.0" 352 | 353 | "@babel/plugin-transform-destructuring@^7.0.0": 354 | version "7.2.0" 355 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" 356 | integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== 357 | dependencies: 358 | "@babel/helper-plugin-utils" "^7.0.0" 359 | 360 | "@babel/plugin-transform-exponentiation-operator@^7.0.0": 361 | version "7.2.0" 362 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" 363 | integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== 364 | dependencies: 365 | "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" 366 | "@babel/helper-plugin-utils" "^7.0.0" 367 | 368 | "@babel/plugin-transform-flow-strip-types@^7.0.0": 369 | version "7.2.3" 370 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz#e3ac2a594948454e7431c7db33e1d02d51b5cd69" 371 | integrity sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ== 372 | dependencies: 373 | "@babel/helper-plugin-utils" "^7.0.0" 374 | "@babel/plugin-syntax-flow" "^7.2.0" 375 | 376 | "@babel/plugin-transform-for-of@^7.0.0": 377 | version "7.2.0" 378 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" 379 | integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== 380 | dependencies: 381 | "@babel/helper-plugin-utils" "^7.0.0" 382 | 383 | "@babel/plugin-transform-function-name@^7.0.0": 384 | version "7.2.0" 385 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" 386 | integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== 387 | dependencies: 388 | "@babel/helper-function-name" "^7.1.0" 389 | "@babel/helper-plugin-utils" "^7.0.0" 390 | 391 | "@babel/plugin-transform-literals@^7.0.0": 392 | version "7.2.0" 393 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" 394 | integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== 395 | dependencies: 396 | "@babel/helper-plugin-utils" "^7.0.0" 397 | 398 | "@babel/plugin-transform-modules-commonjs@^7.0.0": 399 | version "7.2.0" 400 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" 401 | integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== 402 | dependencies: 403 | "@babel/helper-module-transforms" "^7.1.0" 404 | "@babel/helper-plugin-utils" "^7.0.0" 405 | "@babel/helper-simple-access" "^7.1.0" 406 | 407 | "@babel/plugin-transform-object-assign@^7.0.0": 408 | version "7.2.0" 409 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" 410 | integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== 411 | dependencies: 412 | "@babel/helper-plugin-utils" "^7.0.0" 413 | 414 | "@babel/plugin-transform-parameters@^7.0.0": 415 | version "7.2.0" 416 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" 417 | integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== 418 | dependencies: 419 | "@babel/helper-call-delegate" "^7.1.0" 420 | "@babel/helper-get-function-arity" "^7.0.0" 421 | "@babel/helper-plugin-utils" "^7.0.0" 422 | 423 | "@babel/plugin-transform-react-display-name@^7.0.0": 424 | version "7.2.0" 425 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" 426 | integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== 427 | dependencies: 428 | "@babel/helper-plugin-utils" "^7.0.0" 429 | 430 | "@babel/plugin-transform-react-jsx-source@^7.0.0": 431 | version "7.2.0" 432 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" 433 | integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== 434 | dependencies: 435 | "@babel/helper-plugin-utils" "^7.0.0" 436 | "@babel/plugin-syntax-jsx" "^7.2.0" 437 | 438 | "@babel/plugin-transform-react-jsx@^7.0.0": 439 | version "7.3.0" 440 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" 441 | integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== 442 | dependencies: 443 | "@babel/helper-builder-react-jsx" "^7.3.0" 444 | "@babel/helper-plugin-utils" "^7.0.0" 445 | "@babel/plugin-syntax-jsx" "^7.2.0" 446 | 447 | "@babel/plugin-transform-regenerator@^7.0.0": 448 | version "7.0.0" 449 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" 450 | integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== 451 | dependencies: 452 | regenerator-transform "^0.13.3" 453 | 454 | "@babel/plugin-transform-runtime@^7.0.0": 455 | version "7.2.0" 456 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" 457 | integrity sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw== 458 | dependencies: 459 | "@babel/helper-module-imports" "^7.0.0" 460 | "@babel/helper-plugin-utils" "^7.0.0" 461 | resolve "^1.8.1" 462 | semver "^5.5.1" 463 | 464 | "@babel/plugin-transform-shorthand-properties@^7.0.0": 465 | version "7.2.0" 466 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" 467 | integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== 468 | dependencies: 469 | "@babel/helper-plugin-utils" "^7.0.0" 470 | 471 | "@babel/plugin-transform-spread@^7.0.0": 472 | version "7.2.2" 473 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" 474 | integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== 475 | dependencies: 476 | "@babel/helper-plugin-utils" "^7.0.0" 477 | 478 | "@babel/plugin-transform-sticky-regex@^7.0.0": 479 | version "7.2.0" 480 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" 481 | integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== 482 | dependencies: 483 | "@babel/helper-plugin-utils" "^7.0.0" 484 | "@babel/helper-regex" "^7.0.0" 485 | 486 | "@babel/plugin-transform-template-literals@^7.0.0": 487 | version "7.2.0" 488 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" 489 | integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== 490 | dependencies: 491 | "@babel/helper-annotate-as-pure" "^7.0.0" 492 | "@babel/helper-plugin-utils" "^7.0.0" 493 | 494 | "@babel/plugin-transform-typescript@^7.0.0": 495 | version "7.2.0" 496 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.2.0.tgz#bce7c06300434de6a860ae8acf6a442ef74a99d1" 497 | integrity sha512-EnI7i2/gJ7ZNr2MuyvN2Hu+BHJENlxWte5XygPvfj/MbvtOkWor9zcnHpMMQL2YYaaCcqtIvJUyJ7QVfoGs7ew== 498 | dependencies: 499 | "@babel/helper-plugin-utils" "^7.0.0" 500 | "@babel/plugin-syntax-typescript" "^7.2.0" 501 | 502 | "@babel/plugin-transform-unicode-regex@^7.0.0": 503 | version "7.2.0" 504 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" 505 | integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== 506 | dependencies: 507 | "@babel/helper-plugin-utils" "^7.0.0" 508 | "@babel/helper-regex" "^7.0.0" 509 | regexpu-core "^4.1.3" 510 | 511 | "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.2.2": 512 | version "7.2.2" 513 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" 514 | integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== 515 | dependencies: 516 | "@babel/code-frame" "^7.0.0" 517 | "@babel/parser" "^7.2.2" 518 | "@babel/types" "^7.2.2" 519 | 520 | "@babel/traverse@^7.1.0", "@babel/traverse@^7.2.3": 521 | version "7.2.3" 522 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" 523 | integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== 524 | dependencies: 525 | "@babel/code-frame" "^7.0.0" 526 | "@babel/generator" "^7.2.2" 527 | "@babel/helper-function-name" "^7.1.0" 528 | "@babel/helper-split-export-declaration" "^7.0.0" 529 | "@babel/parser" "^7.2.3" 530 | "@babel/types" "^7.2.2" 531 | debug "^4.1.0" 532 | globals "^11.1.0" 533 | lodash "^4.17.10" 534 | 535 | "@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0": 536 | version "7.3.0" 537 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0" 538 | integrity sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw== 539 | dependencies: 540 | esutils "^2.0.2" 541 | lodash "^4.17.10" 542 | to-fast-properties "^2.0.0" 543 | 544 | ansi-regex@^2.0.0: 545 | version "2.1.1" 546 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 547 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 548 | 549 | ansi-styles@^2.2.1: 550 | version "2.2.1" 551 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 552 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 553 | 554 | ansi-styles@^3.2.1: 555 | version "3.2.1" 556 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 557 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 558 | dependencies: 559 | color-convert "^1.9.0" 560 | 561 | asap@~2.0.3: 562 | version "2.0.6" 563 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 564 | integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= 565 | 566 | babel-code-frame@^6.26.0: 567 | version "6.26.0" 568 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 569 | integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= 570 | dependencies: 571 | chalk "^1.1.3" 572 | esutils "^2.0.2" 573 | js-tokens "^3.0.2" 574 | 575 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 576 | version "6.24.1" 577 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 578 | integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= 579 | dependencies: 580 | babel-helper-explode-assignable-expression "^6.24.1" 581 | babel-runtime "^6.22.0" 582 | babel-types "^6.24.1" 583 | 584 | babel-helper-builder-react-jsx@^6.24.1: 585 | version "6.26.0" 586 | resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" 587 | integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA= 588 | dependencies: 589 | babel-runtime "^6.26.0" 590 | babel-types "^6.26.0" 591 | esutils "^2.0.2" 592 | 593 | babel-helper-call-delegate@^6.24.1: 594 | version "6.24.1" 595 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 596 | integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= 597 | dependencies: 598 | babel-helper-hoist-variables "^6.24.1" 599 | babel-runtime "^6.22.0" 600 | babel-traverse "^6.24.1" 601 | babel-types "^6.24.1" 602 | 603 | babel-helper-define-map@^6.24.1: 604 | version "6.26.0" 605 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" 606 | integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= 607 | dependencies: 608 | babel-helper-function-name "^6.24.1" 609 | babel-runtime "^6.26.0" 610 | babel-types "^6.26.0" 611 | lodash "^4.17.4" 612 | 613 | babel-helper-explode-assignable-expression@^6.24.1: 614 | version "6.24.1" 615 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 616 | integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= 617 | dependencies: 618 | babel-runtime "^6.22.0" 619 | babel-traverse "^6.24.1" 620 | babel-types "^6.24.1" 621 | 622 | babel-helper-function-name@^6.24.1: 623 | version "6.24.1" 624 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 625 | integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= 626 | dependencies: 627 | babel-helper-get-function-arity "^6.24.1" 628 | babel-runtime "^6.22.0" 629 | babel-template "^6.24.1" 630 | babel-traverse "^6.24.1" 631 | babel-types "^6.24.1" 632 | 633 | babel-helper-get-function-arity@^6.24.1: 634 | version "6.24.1" 635 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 636 | integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= 637 | dependencies: 638 | babel-runtime "^6.22.0" 639 | babel-types "^6.24.1" 640 | 641 | babel-helper-hoist-variables@^6.24.1: 642 | version "6.24.1" 643 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 644 | integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= 645 | dependencies: 646 | babel-runtime "^6.22.0" 647 | babel-types "^6.24.1" 648 | 649 | babel-helper-optimise-call-expression@^6.24.1: 650 | version "6.24.1" 651 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 652 | integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= 653 | dependencies: 654 | babel-runtime "^6.22.0" 655 | babel-types "^6.24.1" 656 | 657 | babel-helper-replace-supers@^6.24.1: 658 | version "6.24.1" 659 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 660 | integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= 661 | dependencies: 662 | babel-helper-optimise-call-expression "^6.24.1" 663 | babel-messages "^6.23.0" 664 | babel-runtime "^6.22.0" 665 | babel-template "^6.24.1" 666 | babel-traverse "^6.24.1" 667 | babel-types "^6.24.1" 668 | 669 | babel-messages@^6.23.0: 670 | version "6.23.0" 671 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 672 | integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= 673 | dependencies: 674 | babel-runtime "^6.22.0" 675 | 676 | babel-plugin-check-es2015-constants@^6.5.0: 677 | version "6.22.0" 678 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 679 | integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= 680 | dependencies: 681 | babel-runtime "^6.22.0" 682 | 683 | babel-plugin-module-resolver@^3.1.1: 684 | version "3.1.3" 685 | resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.3.tgz#5a1c148bf528d20907ed508b70ae3c4762e78c8d" 686 | integrity sha512-QRfA8b2H7l9uSElLwS0rHoPhjPhgpncKUvrn42tJpdCoJ3IS6J+m4mp5FtnRoXHry3ZYJ2SMLLG/REikQA6tjg== 687 | dependencies: 688 | find-babel-config "^1.1.0" 689 | glob "^7.1.2" 690 | pkg-up "^2.0.0" 691 | reselect "^3.0.1" 692 | resolve "^1.4.0" 693 | 694 | babel-plugin-react-transform@^3.0.0: 695 | version "3.0.0" 696 | resolved "https://registry.yarnpkg.com/babel-plugin-react-transform/-/babel-plugin-react-transform-3.0.0.tgz#402f25137b7bb66e9b54ead75557dfbc7ecaaa74" 697 | integrity sha512-4vJGddwPiHAOgshzZdGwYy4zRjjIr5SMY7gkOaCyIASjgpcsyLTlZNuB5rHOFoaTvGlhfo8/g4pobXPyHqm/3w== 698 | dependencies: 699 | lodash "^4.6.1" 700 | 701 | babel-plugin-syntax-async-functions@^6.5.0: 702 | version "6.13.0" 703 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 704 | integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= 705 | 706 | babel-plugin-syntax-class-properties@^6.5.0, babel-plugin-syntax-class-properties@^6.8.0: 707 | version "6.13.0" 708 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" 709 | integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= 710 | 711 | babel-plugin-syntax-dynamic-import@^6.18.0: 712 | version "6.18.0" 713 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" 714 | integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= 715 | 716 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 717 | version "6.13.0" 718 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 719 | integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= 720 | 721 | babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.5.0: 722 | version "6.18.0" 723 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" 724 | integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0= 725 | 726 | babel-plugin-syntax-jsx@^6.5.0, babel-plugin-syntax-jsx@^6.8.0: 727 | version "6.18.0" 728 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" 729 | integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= 730 | 731 | babel-plugin-syntax-object-rest-spread@^6.8.0: 732 | version "6.13.0" 733 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 734 | integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= 735 | 736 | babel-plugin-syntax-trailing-function-commas@^6.5.0: 737 | version "6.22.0" 738 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 739 | integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= 740 | 741 | babel-plugin-transform-class-properties@^6.5.0: 742 | version "6.24.1" 743 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" 744 | integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= 745 | dependencies: 746 | babel-helper-function-name "^6.24.1" 747 | babel-plugin-syntax-class-properties "^6.8.0" 748 | babel-runtime "^6.22.0" 749 | babel-template "^6.24.1" 750 | 751 | babel-plugin-transform-es2015-arrow-functions@^6.5.0: 752 | version "6.22.0" 753 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 754 | integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= 755 | dependencies: 756 | babel-runtime "^6.22.0" 757 | 758 | babel-plugin-transform-es2015-block-scoping@^6.5.0: 759 | version "6.26.0" 760 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" 761 | integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= 762 | dependencies: 763 | babel-runtime "^6.26.0" 764 | babel-template "^6.26.0" 765 | babel-traverse "^6.26.0" 766 | babel-types "^6.26.0" 767 | lodash "^4.17.4" 768 | 769 | babel-plugin-transform-es2015-classes@^6.5.0: 770 | version "6.24.1" 771 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 772 | integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= 773 | dependencies: 774 | babel-helper-define-map "^6.24.1" 775 | babel-helper-function-name "^6.24.1" 776 | babel-helper-optimise-call-expression "^6.24.1" 777 | babel-helper-replace-supers "^6.24.1" 778 | babel-messages "^6.23.0" 779 | babel-runtime "^6.22.0" 780 | babel-template "^6.24.1" 781 | babel-traverse "^6.24.1" 782 | babel-types "^6.24.1" 783 | 784 | babel-plugin-transform-es2015-computed-properties@^6.5.0: 785 | version "6.24.1" 786 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 787 | integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= 788 | dependencies: 789 | babel-runtime "^6.22.0" 790 | babel-template "^6.24.1" 791 | 792 | babel-plugin-transform-es2015-destructuring@^6.5.0: 793 | version "6.23.0" 794 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 795 | integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= 796 | dependencies: 797 | babel-runtime "^6.22.0" 798 | 799 | babel-plugin-transform-es2015-for-of@^6.5.0: 800 | version "6.23.0" 801 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 802 | integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= 803 | dependencies: 804 | babel-runtime "^6.22.0" 805 | 806 | babel-plugin-transform-es2015-function-name@^6.5.0: 807 | version "6.24.1" 808 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 809 | integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= 810 | dependencies: 811 | babel-helper-function-name "^6.24.1" 812 | babel-runtime "^6.22.0" 813 | babel-types "^6.24.1" 814 | 815 | babel-plugin-transform-es2015-literals@^6.5.0: 816 | version "6.22.0" 817 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 818 | integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= 819 | dependencies: 820 | babel-runtime "^6.22.0" 821 | 822 | babel-plugin-transform-es2015-modules-commonjs@^6.5.0: 823 | version "6.26.2" 824 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" 825 | integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== 826 | dependencies: 827 | babel-plugin-transform-strict-mode "^6.24.1" 828 | babel-runtime "^6.26.0" 829 | babel-template "^6.26.0" 830 | babel-types "^6.26.0" 831 | 832 | babel-plugin-transform-es2015-parameters@^6.5.0: 833 | version "6.24.1" 834 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 835 | integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= 836 | dependencies: 837 | babel-helper-call-delegate "^6.24.1" 838 | babel-helper-get-function-arity "^6.24.1" 839 | babel-runtime "^6.22.0" 840 | babel-template "^6.24.1" 841 | babel-traverse "^6.24.1" 842 | babel-types "^6.24.1" 843 | 844 | babel-plugin-transform-es2015-shorthand-properties@^6.5.0: 845 | version "6.24.1" 846 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 847 | integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= 848 | dependencies: 849 | babel-runtime "^6.22.0" 850 | babel-types "^6.24.1" 851 | 852 | babel-plugin-transform-es2015-spread@^6.5.0: 853 | version "6.22.0" 854 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 855 | integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= 856 | dependencies: 857 | babel-runtime "^6.22.0" 858 | 859 | babel-plugin-transform-es2015-template-literals@^6.5.0: 860 | version "6.22.0" 861 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 862 | integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= 863 | dependencies: 864 | babel-runtime "^6.22.0" 865 | 866 | babel-plugin-transform-exponentiation-operator@^6.5.0: 867 | version "6.24.1" 868 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 869 | integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= 870 | dependencies: 871 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 872 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 873 | babel-runtime "^6.22.0" 874 | 875 | babel-plugin-transform-flow-strip-types@^6.5.0: 876 | version "6.22.0" 877 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" 878 | integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988= 879 | dependencies: 880 | babel-plugin-syntax-flow "^6.18.0" 881 | babel-runtime "^6.22.0" 882 | 883 | babel-plugin-transform-object-assign@^6.5.0: 884 | version "6.22.0" 885 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba" 886 | integrity sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo= 887 | dependencies: 888 | babel-runtime "^6.22.0" 889 | 890 | babel-plugin-transform-object-rest-spread@^6.5.0: 891 | version "6.26.0" 892 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" 893 | integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= 894 | dependencies: 895 | babel-plugin-syntax-object-rest-spread "^6.8.0" 896 | babel-runtime "^6.26.0" 897 | 898 | babel-plugin-transform-react-display-name@^6.5.0: 899 | version "6.25.0" 900 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" 901 | integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE= 902 | dependencies: 903 | babel-runtime "^6.22.0" 904 | 905 | babel-plugin-transform-react-jsx-source@^6.5.0: 906 | version "6.22.0" 907 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" 908 | integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY= 909 | dependencies: 910 | babel-plugin-syntax-jsx "^6.8.0" 911 | babel-runtime "^6.22.0" 912 | 913 | babel-plugin-transform-react-jsx@^6.5.0: 914 | version "6.24.1" 915 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" 916 | integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM= 917 | dependencies: 918 | babel-helper-builder-react-jsx "^6.24.1" 919 | babel-plugin-syntax-jsx "^6.8.0" 920 | babel-runtime "^6.22.0" 921 | 922 | babel-plugin-transform-regenerator@^6.5.0: 923 | version "6.26.0" 924 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" 925 | integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= 926 | dependencies: 927 | regenerator-transform "^0.10.0" 928 | 929 | babel-plugin-transform-strict-mode@^6.24.1: 930 | version "6.24.1" 931 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 932 | integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= 933 | dependencies: 934 | babel-runtime "^6.22.0" 935 | babel-types "^6.24.1" 936 | 937 | babel-preset-expo@^5.0.0: 938 | version "5.0.0" 939 | resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-5.0.0.tgz#d1569579c7326391d589b031ed688061f959e378" 940 | integrity sha512-pDtkAIafvQLAZ5dQ/6I9okkiZLw9IBR8ItRzAyUO4j2rUMB9ey6yZTTE77AKWq5HhxhY53Hic8Zl0vSDMTXI0A== 941 | dependencies: 942 | "@babel/plugin-proposal-decorators" "^7.1.0" 943 | babel-plugin-module-resolver "^3.1.1" 944 | metro-react-native-babel-preset "^0.49.0" 945 | 946 | babel-preset-react-native@^4.0.1: 947 | version "4.0.1" 948 | resolved "https://registry.yarnpkg.com/babel-preset-react-native/-/babel-preset-react-native-4.0.1.tgz#14ff07bdb6c8df9408082c0c18b2ce8e3392e76a" 949 | integrity sha512-uhFXnl1WbEWNG4W8QB/jeQaVXkd0a0AD+wh4D2VqtdRnEyvscahqyHExnwKLU9N0sXRYwDyed4JfbiBtiOSGgA== 950 | dependencies: 951 | babel-plugin-check-es2015-constants "^6.5.0" 952 | babel-plugin-react-transform "^3.0.0" 953 | babel-plugin-syntax-async-functions "^6.5.0" 954 | babel-plugin-syntax-class-properties "^6.5.0" 955 | babel-plugin-syntax-dynamic-import "^6.18.0" 956 | babel-plugin-syntax-flow "^6.5.0" 957 | babel-plugin-syntax-jsx "^6.5.0" 958 | babel-plugin-syntax-trailing-function-commas "^6.5.0" 959 | babel-plugin-transform-class-properties "^6.5.0" 960 | babel-plugin-transform-es2015-arrow-functions "^6.5.0" 961 | babel-plugin-transform-es2015-block-scoping "^6.5.0" 962 | babel-plugin-transform-es2015-classes "^6.5.0" 963 | babel-plugin-transform-es2015-computed-properties "^6.5.0" 964 | babel-plugin-transform-es2015-destructuring "^6.5.0" 965 | babel-plugin-transform-es2015-for-of "^6.5.0" 966 | babel-plugin-transform-es2015-function-name "^6.5.0" 967 | babel-plugin-transform-es2015-literals "^6.5.0" 968 | babel-plugin-transform-es2015-modules-commonjs "^6.5.0" 969 | babel-plugin-transform-es2015-parameters "^6.5.0" 970 | babel-plugin-transform-es2015-shorthand-properties "^6.5.0" 971 | babel-plugin-transform-es2015-spread "^6.5.0" 972 | babel-plugin-transform-es2015-template-literals "^6.5.0" 973 | babel-plugin-transform-exponentiation-operator "^6.5.0" 974 | babel-plugin-transform-flow-strip-types "^6.5.0" 975 | babel-plugin-transform-object-assign "^6.5.0" 976 | babel-plugin-transform-object-rest-spread "^6.5.0" 977 | babel-plugin-transform-react-display-name "^6.5.0" 978 | babel-plugin-transform-react-jsx "^6.5.0" 979 | babel-plugin-transform-react-jsx-source "^6.5.0" 980 | babel-plugin-transform-regenerator "^6.5.0" 981 | babel-template "^6.24.1" 982 | react-transform-hmr "^1.0.4" 983 | 984 | babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: 985 | version "6.26.0" 986 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 987 | integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= 988 | dependencies: 989 | core-js "^2.4.0" 990 | regenerator-runtime "^0.11.0" 991 | 992 | babel-template@^6.24.1, babel-template@^6.26.0: 993 | version "6.26.0" 994 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 995 | integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= 996 | dependencies: 997 | babel-runtime "^6.26.0" 998 | babel-traverse "^6.26.0" 999 | babel-types "^6.26.0" 1000 | babylon "^6.18.0" 1001 | lodash "^4.17.4" 1002 | 1003 | babel-traverse@^6.24.1, babel-traverse@^6.26.0: 1004 | version "6.26.0" 1005 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 1006 | integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= 1007 | dependencies: 1008 | babel-code-frame "^6.26.0" 1009 | babel-messages "^6.23.0" 1010 | babel-runtime "^6.26.0" 1011 | babel-types "^6.26.0" 1012 | babylon "^6.18.0" 1013 | debug "^2.6.8" 1014 | globals "^9.18.0" 1015 | invariant "^2.2.2" 1016 | lodash "^4.17.4" 1017 | 1018 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: 1019 | version "6.26.0" 1020 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 1021 | integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= 1022 | dependencies: 1023 | babel-runtime "^6.26.0" 1024 | esutils "^2.0.2" 1025 | lodash "^4.17.4" 1026 | to-fast-properties "^1.0.3" 1027 | 1028 | babylon@^6.18.0: 1029 | version "6.18.0" 1030 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 1031 | integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== 1032 | 1033 | balanced-match@^1.0.0: 1034 | version "1.0.0" 1035 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 1036 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 1037 | 1038 | brace-expansion@^1.1.7: 1039 | version "1.1.11" 1040 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 1041 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 1042 | dependencies: 1043 | balanced-match "^1.0.0" 1044 | concat-map "0.0.1" 1045 | 1046 | chalk@^1.1.3: 1047 | version "1.1.3" 1048 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 1049 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 1050 | dependencies: 1051 | ansi-styles "^2.2.1" 1052 | escape-string-regexp "^1.0.2" 1053 | has-ansi "^2.0.0" 1054 | strip-ansi "^3.0.0" 1055 | supports-color "^2.0.0" 1056 | 1057 | chalk@^2.0.0: 1058 | version "2.4.2" 1059 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 1060 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 1061 | dependencies: 1062 | ansi-styles "^3.2.1" 1063 | escape-string-regexp "^1.0.5" 1064 | supports-color "^5.3.0" 1065 | 1066 | color-convert@^1.9.0: 1067 | version "1.9.3" 1068 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 1069 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 1070 | dependencies: 1071 | color-name "1.1.3" 1072 | 1073 | color-name@1.1.3: 1074 | version "1.1.3" 1075 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 1076 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 1077 | 1078 | concat-map@0.0.1: 1079 | version "0.0.1" 1080 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1081 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 1082 | 1083 | core-js@^1.0.0: 1084 | version "1.2.7" 1085 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 1086 | integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= 1087 | 1088 | core-js@^2.4.0: 1089 | version "2.6.3" 1090 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.3.tgz#4b70938bdffdaf64931e66e2db158f0892289c49" 1091 | integrity sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ== 1092 | 1093 | create-react-class@^15.5.1: 1094 | version "15.6.3" 1095 | resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" 1096 | integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== 1097 | dependencies: 1098 | fbjs "^0.8.9" 1099 | loose-envify "^1.3.1" 1100 | object-assign "^4.1.1" 1101 | 1102 | debug@^2.6.8: 1103 | version "2.6.9" 1104 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 1105 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 1106 | dependencies: 1107 | ms "2.0.0" 1108 | 1109 | debug@^4.1.0: 1110 | version "4.1.1" 1111 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 1112 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 1113 | dependencies: 1114 | ms "^2.1.1" 1115 | 1116 | dom-walk@^0.1.0: 1117 | version "0.1.1" 1118 | resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" 1119 | integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= 1120 | 1121 | encoding@^0.1.11: 1122 | version "0.1.12" 1123 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 1124 | integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= 1125 | dependencies: 1126 | iconv-lite "~0.4.13" 1127 | 1128 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 1129 | version "1.0.5" 1130 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1131 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 1132 | 1133 | esutils@^2.0.0, esutils@^2.0.2: 1134 | version "2.0.2" 1135 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1136 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 1137 | 1138 | fbjs@^0.8.9: 1139 | version "0.8.17" 1140 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" 1141 | integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= 1142 | dependencies: 1143 | core-js "^1.0.0" 1144 | isomorphic-fetch "^2.1.1" 1145 | loose-envify "^1.0.0" 1146 | object-assign "^4.1.0" 1147 | promise "^7.1.1" 1148 | setimmediate "^1.0.5" 1149 | ua-parser-js "^0.7.18" 1150 | 1151 | find-babel-config@^1.1.0: 1152 | version "1.1.0" 1153 | resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" 1154 | integrity sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U= 1155 | dependencies: 1156 | json5 "^0.5.1" 1157 | path-exists "^3.0.0" 1158 | 1159 | find-up@^2.1.0: 1160 | version "2.1.0" 1161 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 1162 | integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 1163 | dependencies: 1164 | locate-path "^2.0.0" 1165 | 1166 | fs.realpath@^1.0.0: 1167 | version "1.0.0" 1168 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1169 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1170 | 1171 | glob@^7.1.2: 1172 | version "7.1.3" 1173 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 1174 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 1175 | dependencies: 1176 | fs.realpath "^1.0.0" 1177 | inflight "^1.0.4" 1178 | inherits "2" 1179 | minimatch "^3.0.4" 1180 | once "^1.3.0" 1181 | path-is-absolute "^1.0.0" 1182 | 1183 | global@^4.3.0: 1184 | version "4.3.2" 1185 | resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" 1186 | integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= 1187 | dependencies: 1188 | min-document "^2.19.0" 1189 | process "~0.5.1" 1190 | 1191 | globals@^11.1.0: 1192 | version "11.10.0" 1193 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" 1194 | integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== 1195 | 1196 | globals@^9.18.0: 1197 | version "9.18.0" 1198 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 1199 | integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== 1200 | 1201 | has-ansi@^2.0.0: 1202 | version "2.0.0" 1203 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1204 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 1205 | dependencies: 1206 | ansi-regex "^2.0.0" 1207 | 1208 | has-flag@^3.0.0: 1209 | version "3.0.0" 1210 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1211 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1212 | 1213 | hoist-non-react-statics@^2.5.0: 1214 | version "2.5.5" 1215 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" 1216 | integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== 1217 | 1218 | iconv-lite@~0.4.13: 1219 | version "0.4.24" 1220 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1221 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1222 | dependencies: 1223 | safer-buffer ">= 2.1.2 < 3" 1224 | 1225 | immutable@^3.8.1: 1226 | version "3.8.2" 1227 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 1228 | integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= 1229 | 1230 | inflight@^1.0.4: 1231 | version "1.0.6" 1232 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1233 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1234 | dependencies: 1235 | once "^1.3.0" 1236 | wrappy "1" 1237 | 1238 | inherits@2: 1239 | version "2.0.3" 1240 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1241 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1242 | 1243 | invariant@^2.0.0, invariant@^2.2.2: 1244 | version "2.2.4" 1245 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 1246 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 1247 | dependencies: 1248 | loose-envify "^1.0.0" 1249 | 1250 | is-stream@^1.0.1: 1251 | version "1.1.0" 1252 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1253 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1254 | 1255 | isomorphic-fetch@^2.1.1: 1256 | version "2.2.1" 1257 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1258 | integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= 1259 | dependencies: 1260 | node-fetch "^1.0.1" 1261 | whatwg-fetch ">=0.10.0" 1262 | 1263 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1264 | version "4.0.0" 1265 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1266 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1267 | 1268 | js-tokens@^3.0.2: 1269 | version "3.0.2" 1270 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1271 | integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 1272 | 1273 | jsesc@^2.5.1: 1274 | version "2.5.2" 1275 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1276 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1277 | 1278 | jsesc@~0.5.0: 1279 | version "0.5.0" 1280 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1281 | integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= 1282 | 1283 | json5@^0.5.1: 1284 | version "0.5.1" 1285 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1286 | integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= 1287 | 1288 | locate-path@^2.0.0: 1289 | version "2.0.0" 1290 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1291 | integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 1292 | dependencies: 1293 | p-locate "^2.0.0" 1294 | path-exists "^3.0.0" 1295 | 1296 | lodash-es@^4.2.1: 1297 | version "4.17.11" 1298 | resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" 1299 | integrity sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q== 1300 | 1301 | lodash@^4.17.10, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.6.1: 1302 | version "4.17.19" 1303 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 1304 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 1305 | 1306 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: 1307 | version "1.4.0" 1308 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1309 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1310 | dependencies: 1311 | js-tokens "^3.0.0 || ^4.0.0" 1312 | 1313 | metro-babel7-plugin-react-transform@0.49.2: 1314 | version "0.49.2" 1315 | resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.49.2.tgz#d4c43faa6f2b91cc1b244a36a5d708ae8d39dbb2" 1316 | integrity sha512-LpJT8UvqF/tvVqEwiLUTMjRPhEGdI8e2dr3424XaRANba3j0nqmrbKdJQsPE8TrcqMWR4RHmfsXk0ti5QrEvJg== 1317 | dependencies: 1318 | "@babel/helper-module-imports" "^7.0.0" 1319 | 1320 | metro-react-native-babel-preset@^0.49.0: 1321 | version "0.49.2" 1322 | resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.49.2.tgz#8d53610e044e0c9a53a03d307e1c51f9e8577abc" 1323 | integrity sha512-N0+4ramShYCHSAVEPUNWIZuKZskWj8/RDSoinhadHpdpHORMbMxLkexSOVHLluB+XFQ+DENLEx5oVPYwOlENBA== 1324 | dependencies: 1325 | "@babel/plugin-proposal-class-properties" "^7.0.0" 1326 | "@babel/plugin-proposal-export-default-from" "^7.0.0" 1327 | "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" 1328 | "@babel/plugin-proposal-object-rest-spread" "^7.0.0" 1329 | "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" 1330 | "@babel/plugin-proposal-optional-chaining" "^7.0.0" 1331 | "@babel/plugin-syntax-dynamic-import" "^7.0.0" 1332 | "@babel/plugin-syntax-export-default-from" "^7.0.0" 1333 | "@babel/plugin-transform-arrow-functions" "^7.0.0" 1334 | "@babel/plugin-transform-block-scoping" "^7.0.0" 1335 | "@babel/plugin-transform-classes" "^7.0.0" 1336 | "@babel/plugin-transform-computed-properties" "^7.0.0" 1337 | "@babel/plugin-transform-destructuring" "^7.0.0" 1338 | "@babel/plugin-transform-exponentiation-operator" "^7.0.0" 1339 | "@babel/plugin-transform-flow-strip-types" "^7.0.0" 1340 | "@babel/plugin-transform-for-of" "^7.0.0" 1341 | "@babel/plugin-transform-function-name" "^7.0.0" 1342 | "@babel/plugin-transform-literals" "^7.0.0" 1343 | "@babel/plugin-transform-modules-commonjs" "^7.0.0" 1344 | "@babel/plugin-transform-object-assign" "^7.0.0" 1345 | "@babel/plugin-transform-parameters" "^7.0.0" 1346 | "@babel/plugin-transform-react-display-name" "^7.0.0" 1347 | "@babel/plugin-transform-react-jsx" "^7.0.0" 1348 | "@babel/plugin-transform-react-jsx-source" "^7.0.0" 1349 | "@babel/plugin-transform-regenerator" "^7.0.0" 1350 | "@babel/plugin-transform-runtime" "^7.0.0" 1351 | "@babel/plugin-transform-shorthand-properties" "^7.0.0" 1352 | "@babel/plugin-transform-spread" "^7.0.0" 1353 | "@babel/plugin-transform-sticky-regex" "^7.0.0" 1354 | "@babel/plugin-transform-template-literals" "^7.0.0" 1355 | "@babel/plugin-transform-typescript" "^7.0.0" 1356 | "@babel/plugin-transform-unicode-regex" "^7.0.0" 1357 | "@babel/template" "^7.0.0" 1358 | metro-babel7-plugin-react-transform "0.49.2" 1359 | react-transform-hmr "^1.0.4" 1360 | 1361 | min-document@^2.19.0: 1362 | version "2.19.0" 1363 | resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" 1364 | integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= 1365 | dependencies: 1366 | dom-walk "^0.1.0" 1367 | 1368 | minimatch@^3.0.4: 1369 | version "3.0.4" 1370 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1371 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1372 | dependencies: 1373 | brace-expansion "^1.1.7" 1374 | 1375 | mirror-creator@^1.1.0: 1376 | version "1.1.0" 1377 | resolved "https://registry.yarnpkg.com/mirror-creator/-/mirror-creator-1.1.0.tgz#170cc74d0ff244449177204716cbbe555d68d69a" 1378 | integrity sha1-FwzHTQ/yRESRdyBHFsu+VV1o1po= 1379 | 1380 | ms@2.0.0: 1381 | version "2.0.0" 1382 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1383 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1384 | 1385 | ms@^2.1.1: 1386 | version "2.1.1" 1387 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1388 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1389 | 1390 | node-fetch@^1.0.1: 1391 | version "1.7.3" 1392 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1393 | integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== 1394 | dependencies: 1395 | encoding "^0.1.11" 1396 | is-stream "^1.0.1" 1397 | 1398 | object-assign@^4.1.0, object-assign@^4.1.1: 1399 | version "4.1.1" 1400 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1401 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1402 | 1403 | once@^1.3.0: 1404 | version "1.4.0" 1405 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1406 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1407 | dependencies: 1408 | wrappy "1" 1409 | 1410 | p-limit@^1.1.0: 1411 | version "1.3.0" 1412 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1413 | integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== 1414 | dependencies: 1415 | p-try "^1.0.0" 1416 | 1417 | p-locate@^2.0.0: 1418 | version "2.0.0" 1419 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1420 | integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 1421 | dependencies: 1422 | p-limit "^1.1.0" 1423 | 1424 | p-try@^1.0.0: 1425 | version "1.0.0" 1426 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1427 | integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= 1428 | 1429 | path-exists@^3.0.0: 1430 | version "3.0.0" 1431 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1432 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1433 | 1434 | path-is-absolute@^1.0.0: 1435 | version "1.0.1" 1436 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1437 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1438 | 1439 | path-parse@^1.0.6: 1440 | version "1.0.6" 1441 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1442 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1443 | 1444 | pkg-up@^2.0.0: 1445 | version "2.0.0" 1446 | resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" 1447 | integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= 1448 | dependencies: 1449 | find-up "^2.1.0" 1450 | 1451 | private@^0.1.6: 1452 | version "0.1.8" 1453 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 1454 | integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 1455 | 1456 | process@~0.5.1: 1457 | version "0.5.2" 1458 | resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" 1459 | integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= 1460 | 1461 | promise@^7.1.1: 1462 | version "7.3.1" 1463 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1464 | integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== 1465 | dependencies: 1466 | asap "~2.0.3" 1467 | 1468 | prop-types@^15.5.4, prop-types@^15.6.2: 1469 | version "15.6.2" 1470 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" 1471 | integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== 1472 | dependencies: 1473 | loose-envify "^1.3.1" 1474 | object-assign "^4.1.1" 1475 | 1476 | react-deep-force-update@^1.0.0: 1477 | version "1.1.2" 1478 | resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" 1479 | integrity sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA== 1480 | 1481 | react-proxy@^1.1.7: 1482 | version "1.1.8" 1483 | resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" 1484 | integrity sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo= 1485 | dependencies: 1486 | lodash "^4.6.1" 1487 | react-deep-force-update "^1.0.0" 1488 | 1489 | react-redux@^4.4.5: 1490 | version "4.4.9" 1491 | resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-4.4.9.tgz#8ca6d4670925a454ce67086c2305e9630670909a" 1492 | integrity sha512-3XS7mjTOcvaP2H5OE/LxEgDHRuEyTZxBRlwvXHzNqYkZdYd7Ra98AimWoDSHP9OcLoydjA1ocgiZxxcqeXj0Sw== 1493 | dependencies: 1494 | create-react-class "^15.5.1" 1495 | hoist-non-react-statics "^2.5.0" 1496 | invariant "^2.0.0" 1497 | lodash "^4.2.0" 1498 | loose-envify "^1.1.0" 1499 | prop-types "^15.5.4" 1500 | 1501 | react-timer-mixin@^0.13.4: 1502 | version "0.13.4" 1503 | resolved "https://registry.yarnpkg.com/react-timer-mixin/-/react-timer-mixin-0.13.4.tgz#75a00c3c94c13abe29b43d63b4c65a88fc8264d3" 1504 | integrity sha512-4+ow23tp/Tv7hBM5Az5/Be/eKKF7DIvJ09voz5LyHGQaqqz9WV8YMs31eFvcYQs7d451LSg7kDJV70XYN/Ug/Q== 1505 | 1506 | react-transform-hmr@^1.0.4: 1507 | version "1.0.4" 1508 | resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" 1509 | integrity sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s= 1510 | dependencies: 1511 | global "^4.3.0" 1512 | react-proxy "^1.1.7" 1513 | 1514 | redux@^3.5.2: 1515 | version "3.7.2" 1516 | resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" 1517 | integrity sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A== 1518 | dependencies: 1519 | lodash "^4.2.1" 1520 | lodash-es "^4.2.1" 1521 | loose-envify "^1.1.0" 1522 | symbol-observable "^1.0.3" 1523 | 1524 | regenerate-unicode-properties@^7.0.0: 1525 | version "7.0.0" 1526 | resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" 1527 | integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== 1528 | dependencies: 1529 | regenerate "^1.4.0" 1530 | 1531 | regenerate@^1.4.0: 1532 | version "1.4.0" 1533 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" 1534 | integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== 1535 | 1536 | regenerator-runtime@^0.11.0: 1537 | version "0.11.1" 1538 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 1539 | integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== 1540 | 1541 | regenerator-transform@^0.10.0: 1542 | version "0.10.1" 1543 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" 1544 | integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== 1545 | dependencies: 1546 | babel-runtime "^6.18.0" 1547 | babel-types "^6.19.0" 1548 | private "^0.1.6" 1549 | 1550 | regenerator-transform@^0.13.3: 1551 | version "0.13.3" 1552 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" 1553 | integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== 1554 | dependencies: 1555 | private "^0.1.6" 1556 | 1557 | regexpu-core@^4.1.3: 1558 | version "4.4.0" 1559 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" 1560 | integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== 1561 | dependencies: 1562 | regenerate "^1.4.0" 1563 | regenerate-unicode-properties "^7.0.0" 1564 | regjsgen "^0.5.0" 1565 | regjsparser "^0.6.0" 1566 | unicode-match-property-ecmascript "^1.0.4" 1567 | unicode-match-property-value-ecmascript "^1.0.2" 1568 | 1569 | regjsgen@^0.5.0: 1570 | version "0.5.0" 1571 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" 1572 | integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== 1573 | 1574 | regjsparser@^0.6.0: 1575 | version "0.6.0" 1576 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" 1577 | integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== 1578 | dependencies: 1579 | jsesc "~0.5.0" 1580 | 1581 | reselect@^3.0.1: 1582 | version "3.0.1" 1583 | resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" 1584 | integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc= 1585 | 1586 | resolve@^1.4.0, resolve@^1.8.1: 1587 | version "1.10.0" 1588 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" 1589 | integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== 1590 | dependencies: 1591 | path-parse "^1.0.6" 1592 | 1593 | "safer-buffer@>= 2.1.2 < 3": 1594 | version "2.1.2" 1595 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1596 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1597 | 1598 | semver@^5.5.1: 1599 | version "5.6.0" 1600 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 1601 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 1602 | 1603 | setimmediate@^1.0.5: 1604 | version "1.0.5" 1605 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1606 | integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= 1607 | 1608 | source-map@^0.5.0: 1609 | version "0.5.7" 1610 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1611 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1612 | 1613 | strip-ansi@^3.0.0: 1614 | version "3.0.1" 1615 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1616 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1617 | dependencies: 1618 | ansi-regex "^2.0.0" 1619 | 1620 | supports-color@^2.0.0: 1621 | version "2.0.0" 1622 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1623 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 1624 | 1625 | supports-color@^5.3.0: 1626 | version "5.5.0" 1627 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1628 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1629 | dependencies: 1630 | has-flag "^3.0.0" 1631 | 1632 | symbol-observable@^1.0.3: 1633 | version "1.2.0" 1634 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 1635 | integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== 1636 | 1637 | to-fast-properties@^1.0.3: 1638 | version "1.0.3" 1639 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 1640 | integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= 1641 | 1642 | to-fast-properties@^2.0.0: 1643 | version "2.0.0" 1644 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1645 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1646 | 1647 | trim-right@^1.0.1: 1648 | version "1.0.1" 1649 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1650 | integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= 1651 | 1652 | ua-parser-js@^0.7.18: 1653 | version "0.7.19" 1654 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" 1655 | integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== 1656 | 1657 | unicode-canonical-property-names-ecmascript@^1.0.4: 1658 | version "1.0.4" 1659 | resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" 1660 | integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== 1661 | 1662 | unicode-match-property-ecmascript@^1.0.4: 1663 | version "1.0.4" 1664 | resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" 1665 | integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== 1666 | dependencies: 1667 | unicode-canonical-property-names-ecmascript "^1.0.4" 1668 | unicode-property-aliases-ecmascript "^1.0.4" 1669 | 1670 | unicode-match-property-value-ecmascript@^1.0.2: 1671 | version "1.0.2" 1672 | resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" 1673 | integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== 1674 | 1675 | unicode-property-aliases-ecmascript@^1.0.4: 1676 | version "1.0.4" 1677 | resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" 1678 | integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== 1679 | 1680 | whatwg-fetch@>=0.10.0: 1681 | version "3.0.0" 1682 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" 1683 | integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== 1684 | 1685 | wrappy@1: 1686 | version "1.0.2" 1687 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1688 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1689 | --------------------------------------------------------------------------------