UNPKG

rs-react-native-image-gallery

Version:
114 lines 17.6 kB
import React, { useCallback, useMemo, useRef } from 'react'; // react-native import { Animated, Dimensions, PanResponder, View } from 'react-native'; // components import { getMemoizedDistance, getScale } from './_helpers'; import { ANIMATION_DURATION, SWIPE_CLOSE_THRESHOLD, SWIPE_HORIZONTAL_THRESHOLD, SWIPE_VERTICAL_THRESHOLD } from './constants'; // ---------------------------------------------------------------------- var deviceHeight = Dimensions.get('window').height; var PanContainer = function (_a) { var children = _a.children, close = _a.close, setIsDragging = _a.setIsDragging; var translationXY = useRef(new Animated.ValueXY()).current; var scale = useRef(new Animated.Value(1)).current; var _initialTouchesRef = useRef([]); var onRelease = useCallback(function (_, gestureState) { setIsDragging(false); if (gestureState.dy > SWIPE_CLOSE_THRESHOLD && _initialTouchesRef.current.length === 1) { // Animate out before closing Animated.timing(translationXY.y, { toValue: deviceHeight, duration: ANIMATION_DURATION, useNativeDriver: true }).start(function () { return close(); }); return false; } // Reset with animation Animated.parallel([ Animated.timing(scale, { duration: ANIMATION_DURATION, toValue: 1, useNativeDriver: true }), Animated.timing(translationXY.x, { duration: ANIMATION_DURATION, toValue: 0, useNativeDriver: true }), Animated.timing(translationXY.y, { duration: ANIMATION_DURATION, toValue: 0, useNativeDriver: true }) ]).start(); }, [close, scale, translationXY.x, translationXY.y, setIsDragging]); // Create panResponder with memoization var panResponder = useMemo(function () { return PanResponder.create({ onStartShouldSetPanResponder: function () { return true; }, onMoveShouldSetPanResponder: function (_, gestureState) { var dx = gestureState.dx, dy = gestureState.dy, numberActiveTouches = gestureState.numberActiveTouches; var absDx = Math.abs(dx); var absDY = Math.abs(dy); // Improved gesture recognition logic if (absDY > SWIPE_VERTICAL_THRESHOLD && absDx <= SWIPE_HORIZONTAL_THRESHOLD && numberActiveTouches <= 1) { return true; } if (absDx > 0 && numberActiveTouches <= 1) { return false; } return true; }, onPanResponderGrant: function (evt) { setIsDragging(true); _initialTouchesRef.current = evt.nativeEvent.touches; translationXY.setOffset({ x: 0, y: 0 }); return true; }, onPanResponderMove: function (evt, gestureState) { var touches = evt.nativeEvent.touches; var dx = gestureState.dx, dy = gestureState.dy; if (touches.length <= 1) { // Handle vertical swipe to close if (Math.abs(dy) > SWIPE_VERTICAL_THRESHOLD) { translationXY.y.setValue(dy); return true; } // Handle horizontal swipe if (Math.abs(dx) > 0) { setIsDragging(false); return false; } // Not enough touches for pinch-zoom if (touches.length < 2) { onRelease(evt, gestureState); return false; } } // Handle pinch zoom and pan translationXY.x.setValue(dx); translationXY.y.setValue(dy); // Calculate scale for zooming using memoized version for better performance var currentDistance = getMemoizedDistance(touches); var initialDistance = getMemoizedDistance(_initialTouchesRef.current); if (currentDistance && initialDistance) { var newScale = getScale(currentDistance, initialDistance); scale.setValue(newScale); } return true; }, onPanResponderRelease: onRelease, onPanResponderTerminate: function () { return true; }, onPanResponderTerminationRequest: function () { return true; } }); }, [onRelease, setIsDragging, translationXY, scale]); return (<View style={{ flex: 1 }}> <Animated.View {...panResponder.panHandlers} style={{ flex: 1, transform: [{ translateX: translationXY.x }, { translateY: translationXY.y }, { scale: scale }] }}> {children} </Animated.View> </View>); }; export default React.memo(PanContainer); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuLWNvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYW4tY29udGFpbmVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFhLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3ZFLGVBQWU7QUFDZixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBMkMsWUFBWSxFQUE0QixJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0ksYUFBYTtBQUNiLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlILHlFQUF5RTtBQUVqRSxJQUFRLFlBQVksR0FBSyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUE3QixDQUE4QjtBQUUxRCxJQUFNLFlBQVksR0FBRyxVQUFDLEVBUXJCO1FBUEEsUUFBUSxjQUFBLEVBQ1IsS0FBSyxXQUFBLEVBQ0wsYUFBYSxtQkFBQTtJQU1iLElBQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM3RCxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ3BELElBQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUEwQixFQUFFLENBQUMsQ0FBQztJQUUvRCxJQUFNLFNBQVMsR0FBRyxXQUFXLENBQzVCLFVBQUMsQ0FBd0IsRUFBRSxZQUFzQztRQUNoRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckIsSUFBSSxZQUFZLENBQUMsRUFBRSxHQUFHLHFCQUFxQixJ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T0FBTyxJQUFJLENBQUM7WUFDYixDQUFDO1lBQ0QscUJBQXFCLEVBQUUsU0FBUztZQUNoQyx1QkFBdUIsRUFBRSxjQUFNLE9BQUEsSUFBSSxFQUFKLENBQUk7WUFDbkMsZ0NBQWdDLEVBQUUsY0FBTSxPQUFBLElBQUksRUFBSixDQUFJO1NBQzVDLENBQUM7SUEvREYsQ0ErREUsRUFDSCxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUNoRCxDQUFDO0lBRUYsT0FBTyxDQUNOLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQ3hCO0dBQUEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNiLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUM3QixLQUFLLENBQUMsQ0FBQztZQUNOLElBQUksRUFBRSxDQUFDO1lBQ1AsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssT0FBQSxFQUFFLENBQUM7U0FDeEYsQ0FBQyxDQUNGO0lBQUEsQ0FBQyxRQUFRLENBQ1Y7R0FBQSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQ2hCO0VBQUEsRUFBRSxJQUFJLENBQUMsQ0FDUCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsZUFBZSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0Jztcbi8vIHJlYWN0LW5hdGl2ZVxuaW1wb3J0IHsgQW5pbWF0ZWQsIERpbWVuc2lvbnMsIEdlc3R1cmVSZXNwb25kZXJFdmVudCwgTmF0aXZlVG91Y2hFdmVudCwgUGFuUmVzcG9uZGVyLCBQYW5SZXNwb25kZXJHZXN0dXJlU3RhdGUsIFZpZXcgfSBmcm9tICdyZWFjdC1uYXRpdmUnO1xuLy8gY29tcG9uZW50c1xuaW1wb3J0IHsgZ2V0TWVtb2l6ZWREaXN0YW5jZSwgZ2V0U2NhbGUgfSBmcm9tICcuL19oZWxwZXJzJztcbmltcG9ydCB7IEFOSU1BVElPTl9EVVJBVElPTiwgU1dJUEVfQ0xPU0VfVEhSRVNIT0xELCBTV0lQRV9IT1JJWk9OVEFMX1RIUkVTSE9MRCwgU1dJUEVfVkVSVElDQUxfVEhSRVNIT0xEIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IHsgaGVpZ2h0OiBkZXZpY2VIZWlnaHQgfSA9IERpbWVuc2lvbnMuZ2V0KCd3aW5kb3cnKTtcblxuY29uc3QgUGFuQ29udGFpbmVyID0gKHtcblx0Y2hpbGRyZW4sXG5cdGNsb3NlLFxuXHRzZXRJc0RyYWdnaW5nXG59OiB7XG5cdGNoaWxkcmVuOiBSZWFjdE5vZGU7XG5cdGNsb3NlOiAoKSA9PiB2b2lkO1xuXHRzZXRJc0RyYWdnaW5nOiAoaXNEcmFnZ2luZzogYm9vbGVhbikgPT4gdm9pZDtcbn0pID0+IHtcblx0Y29uc3QgdHJhbnNsYXRpb25YWSA9IHVzZVJlZihuZXcgQW5pbWF0ZWQuVmFsdWVYWSgpKS5jdXJyZW50O1xuXHRjb25zdCBzY2FsZSA9IHVzZVJlZihuZXcgQW5pbWF0ZWQuVmFsdWUoMSkpLmN1cnJlbnQ7XG5cdGNvbnN0IF9pbml0aWFsVG91Y2hlc1JlZiA9IHVzZVJlZjxBcnJheTxOYXRpdmVUb3VjaEV2ZW50Pj4oW10pO1xuXG5cdGNvbnN0IG9uUmVsZWFzZSA9IHVzZUNhbGxiYWNrKFxuXHRcdChfOiBHZXN0dXJlUmVzcG9uZGVyRXZlbnQsIGdlc3R1cmVTdGF0ZTogUGFuUmVzcG9uZGVyR2VzdHVyZVN0YXRlKTogdm9pZCB8IGJvb2xlYW4gPT4ge1xuXHRcdFx0c2V0SXNEcmFnZ2luZyhmYWxzZSk7XG5cblx0XHRcdGlmIChnZXN0dXJlU3RhdGUuZHkgPiBTV0lQRV9DTE9TRV9USFJFU0hPTEQgJiYgX2luaXRpYWxUb3VjaGVzUmVmLmN1cnJlbnQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIEFuaW1hdGUgb3V0IGJlZm9yZSBjbG9zaW5nXG5cdFx0XHRcdEFuaW1hdGVkLnRpbWluZyh0cmFuc2xhdGlvblhZLnksIHtcblx0XHRcdFx0XHR0b1ZhbHVlOiBkZXZpY2VIZWlnaHQsXG5cdFx0XHRcdFx0ZHVyYXRpb246IEFOSU1BVElPTl9EVVJBVElPTixcblx0XHRcdFx0XHR1c2VOYXRpdmVEcml2ZXI6IHRydWVcblx0XHRcdFx0fSkuc3RhcnQoKCkgPT4gY2xvc2UoKSk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzZXQgd2l0aCBhbmltYXRpb25cblx0XHRcdEFuaW1hdGVkLnBhcmFsbGVsKFtcblx0XHRcdFx0QW5pbWF0ZWQudGltaW5nKHNjYWxlLCB7XG5cdFx0XHRcdFx0ZHVyYXRpb246IEFOSU1BVElPTl9EVVJBVElPTixcblx0XHRcdFx0XHR0b1ZhbHVlOiAxLFxuXHRcdFx0XHRcdHVzZU5hdGl2ZURyaXZlcjogdHJ1ZVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0QW5pbWF0ZWQudGltaW5nKHRyYW5zbGF0aW9uWFkueCwge1xuXHRcdFx0XHRcdGR1cmF0aW9uOiBBTklNQVRJT05fRFVSQVRJT04sXG5cdFx0XHRcdFx0dG9WYWx1ZTogMCxcblx0XHRcdFx0XHR1c2VOYXRpdmVEcml2ZXI6IHRydWVcblx0XHRcdFx0fSksXG5cdFx0XHRcdEFuaW1hdGVkLnRpbWluZyh0cmFuc2xhdGlvblhZLnksIHtcblx0XHRcdFx0XHRkdXJhdGlvbjogQU5JTUFUSU9OX0RVUkFUSU9OLFxuXHRcdFx0XHRcdHRvVmFsdWU6IDAsXG5cdFx0XHRcdFx0dXNlTmF0aXZlRHJpdmVyOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHRdKS5zdGFydCgpO1xuXHRcdH0sXG5cdFx0W2Nsb3NlLCBzY2FsZSwgdHJhbnNsYXRpb25YWS54LCB0cmFuc2xhdGlvblhZLnksIHNldElzRHJhZ2dpbmddXG5cdCk7XG5cblx0Ly8gQ3JlYXRlIHBhblJlc3BvbmRlciB3aXRoIG1lbW9pemF0aW9uXG5cdGNvbnN0IHBhblJlc3BvbmRlciA9IHVzZU1lbW8oXG5cdFx0KCkgPT5cblx0XHRcdFBhblJlc3BvbmRlci5jcmVhdGUoe1xuXHRcdFx0XHRvblN0YXJ0U2hvdWxkU2V0UGFuUmVzcG9uZGVyOiAoKSA9PiB0cnVlLFxuXHRcdFx0XHRvbk1vdmVTaG91bGRTZXRQYW5SZXNwb25kZXI6IChfOiBHZXN0dXJlUmVzcG9uZGVyRXZlbnQsIGdlc3R1cmVTdGF0ZTogUGFuUmVzcG9uZGVyR2VzdHVyZVN0YXRlKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgeyBkeCwgZHksIG51bWJlckFjdGl2ZVRvdWNoZXMgfSA9IGdlc3R1cmVTdGF0ZTtcblx0XHRcdFx0XHRjb25zdCBhYnNEeCA9IE1hdGguYWJzKGR4KTtcblx0XHRcdFx0XHRjb25zdCBhYnNEWSA9IE1hdGguYWJzKGR5KTtcblxuXHRcdFx0XHRcdC8vIEltcHJvdmVkIGdlc3R1cmUgcmVjb2duaXRpb24gbG9naWNcblx0XHRcdFx0XHRpZiAoYWJzRFkgPiBTV0lQRV9WRVJUSUNBTF9USFJFU0hPTEQgJiYgYWJzRHggPD0gU1dJUEVfSE9SSVpPTlRBTF9USFJFU0hPTEQgJiYgbnVtYmVyQWN0aXZlVG91Y2hlcyA8PSAxKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGFic0R4ID4gMCAmJiBudW1iZXJBY3RpdmVUb3VjaGVzIDw9IDEpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uUGFuUmVzcG9uZGVyR3JhbnQ6IChldnQ6IEdlc3R1cmVSZXNwb25kZXJFdmVudCkgPT4ge1xuXHRcdFx0XHRcdHNldElzRHJhZ2dpbmcodHJ1ZSk7XG5cdFx0XHRcdFx0X2luaXRpYWxUb3VjaGVzUmVmLmN1cnJlbnQgPSBldnQubmF0aXZlRXZlbnQudG91Y2hlcztcblx0XHRcdFx0XHR0cmFuc2xhdGlvblhZLnNldE9mZnNldCh7IHg6IDAsIHk6IDAgfSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uUGFuUmVzcG9uZGVyTW92ZTogKGV2dDogR2VzdHVyZVJlc3BvbmRlckV2ZW50LCBnZXN0dXJlU3RhdGU6IFBhblJlc3BvbmRlckdlc3R1cmVTdGF0ZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgdG91Y2hlcyB9ID0gZXZ0Lm5hdGl2ZUV2ZW50O1xuXHRcdFx0XHRcdGNvbnN0IHsgZHgsIGR5IH0gPSBnZXN0dXJlU3RhdGU7XG5cblx0XHRcdFx0XHRpZiAodG91Y2hlcy5sZW5ndGggPD0gMSkge1xuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHZlcnRpY2FsIHN3aXBlIHRvIGNsb3NlXG5cdFx0XHRcdFx0XHRpZiAoTWF0aC5hYnMoZHkpID4gU1dJUEVfVkVSVElDQUxfVEhSRVNIT0xEKSB7XG5cdFx0XHRcdFx0XHRcdHRyYW5zbGF0aW9uWFkueS5zZXRWYWx1ZShkeSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgaG9yaXpvbnRhbCBzd2lwZVxuXHRcdFx0XHRcdFx0aWYgKE1hdGguYWJzKGR4KSA+IDApIHtcblx0XHRcdFx0XHRcdFx0c2V0SXNEcmFnZ2luZyhmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTm90IGVub3VnaCB0b3VjaGVzIGZvciBwaW5jaC16b29tXG5cdFx0XHRcdFx0XHRpZiAodG91Y2hlcy5sZW5ndGggPCAyKSB7XG5cdFx0XHRcdFx0XHRcdG9uUmVsZWFzZShldnQsIGdlc3R1cmVTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgcGluY2ggem9vbSBhbmQgcGFuXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25YWS54LnNldFZhbHVlKGR4KTtcblx0XHRcdFx0XHR0cmFuc2xhdGlvblhZLnkuc2V0VmFsdWUoZHkpO1xuXG5cdFx0XHRcdFx0Ly8gQ2FsY3VsYXRlIHNjYWxlIGZvciB6b29taW5nIHVzaW5nIG1lbW9pemVkIHZlcnNpb24gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldE1lbW9pemVkRGlzdGFuY2UodG91Y2hlcyk7XG5cdFx0XHRcdFx0Y29uc3QgaW5pdGlhbERpc3RhbmNlID0gZ2V0TWVtb2l6ZWREaXN0YW5jZShfaW5pdGlhbFRvdWNoZXNSZWYuY3VycmVudCk7XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnREaXN0YW5jZSAmJiBpbml0aWFsRGlzdGFuY2UpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld1NjYWxlID0gZ2V0U2NhbGUoY3VycmVudERpc3RhbmNlLCBpbml0aWFsRGlzdGFuY2UpO1xuXHRcdFx0XHRcdFx0c2NhbGUuc2V0VmFsdWUobmV3U2NhbGUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRvblBhblJlc3BvbmRlclJlbGVhc2U6IG9uUmVsZWFzZSxcblx0XHRcdFx0b25QYW5SZXNwb25kZXJUZXJtaW5hdGU6ICgpID0+IHRydWUsXG5cdFx0XHRcdG9uUGFuUmVzcG9uZGVyVGVybWluYXRpb25SZXF1ZXN0OiAoKSA9PiB0cnVlXG5cdFx0XHR9KSxcblx0XHRbb25SZWxlYXNlLCBzZXRJc0RyYWdnaW5nLCB0cmFuc2xhdGlvblhZLCBzY2FsZV1cblx0KTtcblxuXHRyZXR1cm4gKFxuXHRcdDxWaWV3IHN0eWxlPXt7IGZsZXg6IDEgfX0+XG5cdFx0XHQ8QW5pbWF0ZWQuVmlld1xuXHRcdFx0XHR7Li4ucGFuUmVzcG9uZGVyLnBhbkhhbmRsZXJzfVxuXHRcdFx0XHRzdHlsZT17e1xuXHRcdFx0XHRcdGZsZXg6IDEsXG5cdFx0XHRcdFx0dHJhbnNmb3JtOiBbeyB0cmFuc2xhdGVYOiB0cmFuc2xhdGlvblhZLnggfSwgeyB0cmFuc2xhdGVZOiB0cmFuc2xhdGlvblhZLnkgfSwgeyBzY2FsZSB9XVxuXHRcdFx0XHR9fT5cblx0XHRcdFx0e2NoaWxkcmVufVxuXHRcdFx0PC9BbmltYXRlZC5WaWV3PlxuXHRcdDwvVmlldz5cblx0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0Lm1lbW8oUGFuQ29udGFpbmVyKTtcbiJdfQ==