mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Compare commits
13
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d552362f85 | ||
|
|
1594af13bc | ||
|
|
038cdda238 | ||
|
|
ea5109fc0e | ||
|
|
b23dd8565a | ||
|
|
d20b34a562 | ||
|
|
a0429ebb54 | ||
|
|
ab829005bd | ||
|
|
27073242f2 | ||
|
|
b78f6cee7d | ||
|
|
10daf76e68 | ||
|
|
e6eb81e097 | ||
|
|
72eb06009b |
@@ -1,17 +1,17 @@
|
||||
/**
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
* @flow strict
|
||||
*/
|
||||
|
||||
exports.version = {
|
||||
major: 0,
|
||||
minor: 0,
|
||||
minor: 66,
|
||||
patch: 0,
|
||||
prerelease: null,
|
||||
prerelease: 'rc.1',
|
||||
};
|
||||
|
||||
@@ -43,7 +43,8 @@ export type PermissionType =
|
||||
| 'android.permission.READ_EXTERNAL_STORAGE'
|
||||
| 'android.permission.WRITE_EXTERNAL_STORAGE'
|
||||
| 'android.permission.BLUETOOTH_CONNECT'
|
||||
| 'android.permission.BLUETOOTH_SCAN';
|
||||
| 'android.permission.BLUETOOTH_SCAN'
|
||||
| 'android.permission.BLUETOOTH_ADVERTISE';
|
||||
*/
|
||||
|
||||
export interface Spec extends TurboModule {
|
||||
|
||||
@@ -61,6 +61,7 @@ const PERMISSIONS = Object.freeze({
|
||||
WRITE_EXTERNAL_STORAGE: 'android.permission.WRITE_EXTERNAL_STORAGE',
|
||||
BLUETOOTH_CONNECT: 'android.permission.BLUETOOTH_CONNECT',
|
||||
BLUETOOTH_SCAN: 'android.permission.BLUETOOTH_SCAN',
|
||||
BLUETOOTH_ADVERTISE: 'android.permission.BLUETOOTH_ADVERTISE',
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -75,6 +76,7 @@ class PermissionsAndroid {
|
||||
ACCESS_COARSE_LOCATION: string,
|
||||
ACCESS_FINE_LOCATION: string,
|
||||
ADD_VOICEMAIL: string,
|
||||
BLUETOOTH_ADVERTISE: string,
|
||||
BLUETOOTH_CONNECT: string,
|
||||
BLUETOOTH_SCAN: string,
|
||||
BODY_SENSORS: string,
|
||||
|
||||
@@ -34,6 +34,7 @@ function getConstants(): Object {
|
||||
function getViewManagerConfig(viewManagerName: string): any {
|
||||
if (
|
||||
viewManagerConfigs[viewManagerName] === undefined &&
|
||||
global.nativeCallSyncHook && // If we're in the Chrome Debugger, let's not even try calling the sync method
|
||||
NativeUIManager.getConstantsForViewManager
|
||||
) {
|
||||
try {
|
||||
|
||||
@@ -20,8 +20,8 @@ function deprecatedPropType(
|
||||
return function validate(props, propName, componentName, ...rest) {
|
||||
// Don't warn for native components.
|
||||
if (
|
||||
!global.RN$Bridgeless &&
|
||||
UIManager.hasViewManagerConfig(componentName) &&
|
||||
global.RN$Bridgeless !== true &&
|
||||
!UIManager.hasViewManagerConfig(componentName) &&
|
||||
props[propName] !== undefined
|
||||
) {
|
||||
console.warn(
|
||||
|
||||
@@ -21,11 +21,11 @@ NSDictionary* RCTGetReactNativeVersion(void)
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^(void){
|
||||
__rnVersion = @{
|
||||
RCTVersionMajor: @(0),
|
||||
RCTVersionMinor: @(0),
|
||||
RCTVersionPatch: @(0),
|
||||
RCTVersionPrerelease: [NSNull null],
|
||||
};
|
||||
RCTVersionMajor: @(0),
|
||||
RCTVersionMinor: @(66),
|
||||
RCTVersionPatch: @(0),
|
||||
RCTVersionPrerelease: @"rc.1",
|
||||
};
|
||||
});
|
||||
return __rnVersion;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
VERSION_NAME=1000.0.0-main
|
||||
VERSION_NAME=0.66.0-rc.1
|
||||
GROUP=com.facebook.react
|
||||
|
||||
POM_NAME=ReactNative
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@ import java.util.Map;
|
||||
public class ReactNativeVersion {
|
||||
public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
|
||||
"major", 0,
|
||||
"minor", 0,
|
||||
"minor", 66,
|
||||
"patch", 0,
|
||||
"prerelease", null);
|
||||
"prerelease", "rc.1");
|
||||
}
|
||||
|
||||
@@ -16,9 +16,9 @@ namespace facebook::react {
|
||||
|
||||
constexpr struct {
|
||||
int32_t Major = 0;
|
||||
int32_t Minor = 0;
|
||||
int32_t Minor = 66;
|
||||
int32_t Patch = 0;
|
||||
std::string_view Prerelease = "";
|
||||
std::string_view Prerelease = "rc.1";
|
||||
} ReactNativeVersion;
|
||||
|
||||
} // namespace facebook::react
|
||||
|
||||
+44
-9
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"name": "react-native",
|
||||
"private": true,
|
||||
"version": "1000.0.0",
|
||||
"version": "0.66.0-rc.1",
|
||||
"bin": "./cli.js",
|
||||
"description": "A framework for building native apps using React",
|
||||
"license": "MIT",
|
||||
@@ -81,10 +80,6 @@
|
||||
"test-ios-e2e": "detox test -c ios.sim.release packages/rn-tester/e2e",
|
||||
"test-ios": "./scripts/objc-test.sh test"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/!(eslint-config-react-native-community)",
|
||||
"repo-config"
|
||||
],
|
||||
"peerDependencies": {
|
||||
"react": "17.0.2"
|
||||
},
|
||||
@@ -95,7 +90,7 @@
|
||||
"@react-native-community/cli-platform-ios": "^6.0.0",
|
||||
"@react-native/assets": "1.0.0",
|
||||
"@react-native/normalize-color": "1.0.0",
|
||||
"@react-native/polyfills": "1.0.0",
|
||||
"@react-native/polyfills": "2.0.0",
|
||||
"abort-controller": "^3.0.0",
|
||||
"anser": "^1.4.9",
|
||||
"base64-js": "^1.1.2",
|
||||
@@ -112,6 +107,7 @@
|
||||
"promise": "^8.0.3",
|
||||
"prop-types": "^15.7.2",
|
||||
"react-devtools-core": "^4.13.0",
|
||||
"react-native-codegen": "^0.0.7",
|
||||
"react-refresh": "^0.4.0",
|
||||
"regenerator-runtime": "^0.13.2",
|
||||
"scheduler": "^0.20.2",
|
||||
@@ -122,7 +118,46 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"flow-bin": "^0.158.0",
|
||||
"react": "17.0.2"
|
||||
"react": "17.0.2",
|
||||
"@babel/core": "^7.14.0",
|
||||
"@babel/generator": "^7.14.0",
|
||||
"@babel/template": "^7.0.0",
|
||||
"@babel/types": "^7.0.0",
|
||||
"@react-native-community/eslint-plugin": "*",
|
||||
"@reactions/component": "^2.0.2",
|
||||
"async": "^2.4.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"babel-preset-fbjs": "^3.4.0",
|
||||
"clang-format": "^1.2.4",
|
||||
"connect": "^3.6.5",
|
||||
"coveralls": "^3.0.2",
|
||||
"detox": "16.7.2",
|
||||
"eslint": "7.12.0",
|
||||
"eslint-config-fb-strict": "^24.9.0",
|
||||
"eslint-config-fbjs": "2.1.0",
|
||||
"eslint-config-prettier": "^6.0.0",
|
||||
"eslint-plugin-babel": "^5.3.0",
|
||||
"eslint-plugin-eslint-comments": "^3.1.1",
|
||||
"eslint-plugin-flowtype": "2.50.3",
|
||||
"eslint-plugin-jest": "22.4.1",
|
||||
"eslint-plugin-jsx-a11y": "6.2.1",
|
||||
"eslint-plugin-prettier": "2.6.2",
|
||||
"eslint-plugin-react": "7.21.5",
|
||||
"eslint-plugin-react-hooks": "^4.2.0",
|
||||
"eslint-plugin-react-native": "3.10.0",
|
||||
"eslint-plugin-relay": "1.8.1",
|
||||
"jest": "^26.6.3",
|
||||
"jest-junit": "^10.0.0",
|
||||
"jscodeshift": "^0.11.0",
|
||||
"metro-transform-plugins": "^0.66.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"prettier": "1.19.1",
|
||||
"react-shallow-renderer": "16.14.1",
|
||||
"react-test-renderer": "17.0.2",
|
||||
"shelljs": "^0.7.8",
|
||||
"signedsource": "^1.0.0",
|
||||
"ws": "^6.1.4",
|
||||
"yargs": "^15.3.1"
|
||||
},
|
||||
"detox": {
|
||||
"test-runner": "jest",
|
||||
@@ -161,4 +196,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/polyfills",
|
||||
"version": "1.0.0",
|
||||
"version": "2.0.0",
|
||||
"description": "Polyfills for React Native.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -58,4 +58,5 @@ end
|
||||
|
||||
post_install do |installer|
|
||||
react_native_post_install(installer)
|
||||
__apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||
end
|
||||
|
||||
@@ -321,7 +321,6 @@
|
||||
C38CB0C2095A8FFDE13321E5 /* Pods-RNTesterUnitTests.debug.xcconfig */,
|
||||
8735BC063632C9712E25C7D9 /* Pods-RNTesterUnitTests.release.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -610,7 +609,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "set -e\n\nexport NODE_BINARY=node\nexport PROJECT_ROOT=\"$SRCROOT/../../\"\nexport SOURCEMAP_FILE=../sourcemap.ios.map\n# export FORCE_BUNDLING=true\n\"$SRCROOT/../../scripts/react-native-xcode.sh\" $SRCROOT/../../packages/rn-tester/js/RNTesterApp.ios.js\n";
|
||||
shellScript = "set -e\n\nexport NODE_BINARY=node\nexport PROJECT_ROOT=\"$SRCROOT/../../\"\nexport ENTRY_FILE=\"$SRCROOT/js/RNTesterApp.ios.js\"\nexport SOURCEMAP_FILE=../sourcemap.ios.map\n# export FORCE_BUNDLING=true\n\"$SRCROOT/../../scripts/react-native-xcode.sh\"\n";
|
||||
};
|
||||
A2FBDDDD0C26B4EFA3726B6C /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
@@ -784,6 +783,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||
"$(inherited)",
|
||||
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
|
||||
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
|
||||
@@ -818,6 +818,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||
"$(inherited)",
|
||||
"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)",
|
||||
"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)",
|
||||
|
||||
@@ -130,6 +130,10 @@ let packageJson = JSON.parse(cat('package.json'));
|
||||
packageJson.version = version;
|
||||
delete packageJson.workspaces;
|
||||
delete packageJson.private;
|
||||
|
||||
// Copy dependencies over from repo-config/package.json
|
||||
const repoConfigJson = JSON.parse(cat('repo-config/package.json'));
|
||||
packageJson.devDependencies = {...packageJson.devDependencies, ...repoConfigJson.dependencies};
|
||||
fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2), 'utf-8');
|
||||
|
||||
// Change ReactAndroid/gradle.properties
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
|
||||
let RNCodegen;
|
||||
try {
|
||||
RNCodegen = require('react-native-codegen/lib/generators/RNCodegen.js');
|
||||
} catch (e) {
|
||||
RNCodegen = require('../packages/react-native-codegen/lib/generators/RNCodegen.js');
|
||||
} catch (e) {
|
||||
RNCodegen = require('react-native-codegen/lib/generators/RNCodegen.js');
|
||||
if (!RNCodegen) {
|
||||
throw 'RNCodegen not found.';
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ else
|
||||
ENTRY_FILE=${1:-index.js}
|
||||
fi
|
||||
|
||||
if [[ $DEV != true && ! -f "../$ENTRY_FILE" ]]; then
|
||||
if [[ $DEV != true && ! -f "$ENTRY_FILE" ]]; then
|
||||
echo "error: Entry file $ENTRY_FILE does not exist. If you use another file as your entry point, pass ENTRY_FILE=myindex.js" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
@@ -212,3 +212,38 @@ bash -l -c '#{env_vars} $\{PODS_TARGET_SRCROOT\}/#{prefix}/scripts/generate-spec
|
||||
:show_env_vars_in_log => true
|
||||
}
|
||||
end
|
||||
|
||||
# This provides a post_install workaround for build issues related Xcode 12.5 and Apple Silicon (M1) machines.
|
||||
# Call this in the app's main Podfile's post_install hook.
|
||||
# See https://github.com/facebook/react-native/issues/31480#issuecomment-902912841 for more context.
|
||||
# Actual fix was authored by https://github.com/mikehardy.
|
||||
# New app template will call this for now until the underlying issue is resolved.
|
||||
def __apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||
# Apple Silicon builds require a library path tweak for Swift library discovery to resolve Swift-related "symbol not found".
|
||||
# Note: this was fixed via https://github.com/facebook/react-native/commit/eb938863063f5535735af2be4e706f70647e5b90
|
||||
# Keeping this logic here but commented out for future reference.
|
||||
#
|
||||
# installer.aggregate_targets.each do |aggregate_target|
|
||||
# aggregate_target.user_project.native_targets.each do |target|
|
||||
# target.build_configurations.each do |config|
|
||||
# config.build_settings['LIBRARY_SEARCH_PATHS'] = ['$(SDKROOT)/usr/lib/swift', '$(inherited)']
|
||||
# end
|
||||
# end
|
||||
# aggregate_target.user_project.save
|
||||
# end
|
||||
|
||||
# Flipper podspecs are still targeting an older iOS deployment target, and may cause an error like:
|
||||
# "error: thread-local storage is not supported for the current target"
|
||||
# The most reliable known workaround is to bump iOS deployment target to match react-native (iOS 11 now).
|
||||
installer.pods_project.targets.each do |target|
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
|
||||
end
|
||||
end
|
||||
|
||||
# But... doing so caused another issue in Flipper:
|
||||
# "Time.h:52:17: error: typedef redefinition with different types"
|
||||
# We need to make a patch to RCT-Folly - set `__IPHONE_10_0` to our iOS target + 1.
|
||||
# See https://github.com/facebook/flipper/issues/834 for more details.
|
||||
`sed -i -e $'s/__IPHONE_10_0/__IPHONE_12_0/' Pods/RCT-Folly/folly/portability/Time.h`
|
||||
end
|
||||
|
||||
+36
-11
@@ -4,8 +4,6 @@
|
||||
# This source code is licensed under the MIT license found in the
|
||||
# LICENSE file in the root directory of this source tree.
|
||||
|
||||
JAVA_VERSION="1.7"
|
||||
|
||||
RED="\033[0;31m"
|
||||
GREEN="\033[0;32m"
|
||||
BLUE="\033[0;35m"
|
||||
@@ -49,28 +47,55 @@ lsof -i :8081 | grep LISTEN | /usr/bin/awk '{print $2}' | xargs kill
|
||||
info "Start the packager in another terminal by running 'npm start' from the root"
|
||||
info "and then press any key."
|
||||
info ""
|
||||
read -n 1
|
||||
read -r -n 1
|
||||
|
||||
./gradlew :packages:rn-tester:android:app:installJscDebug || error "Couldn't build RNTester Android"
|
||||
|
||||
info "Press any key to run RNTester in an already running Android emulator/device"
|
||||
info ""
|
||||
read -n 1
|
||||
read -r -n 1
|
||||
adb shell am start -n com.facebook.react.uiapp/.RNTesterActivity
|
||||
|
||||
success "Installing CocoaPods dependencies"
|
||||
|
||||
info "Once done testing, keep emulator running"
|
||||
info "Press any key to run RNTester on Android with Hermes enabled"
|
||||
read -r -n 1
|
||||
|
||||
./gradlew :packages:rn-tester:android:app:installHermesDebug || error "Couldn't build RNTester Android"
|
||||
adb shell am start -n com.facebook.react.uiapp/.RNTesterActivity
|
||||
|
||||
info "When done testing RNTester on Android,"
|
||||
info "Press any key to start testing RNTester in iOS"
|
||||
read -r -n 1
|
||||
|
||||
success "About to test iOS JSC... "
|
||||
success "Installing CocoaPods dependencies..."
|
||||
rm -rf packages/rn-tester/Pods
|
||||
(cd packages/rn-tester && pod install)
|
||||
|
||||
info "Press any key to open the workspace in Xcode, then build and test manually."
|
||||
info ""
|
||||
read -n 1
|
||||
read -r -n 1
|
||||
|
||||
open "packages/rn-tester/RNTesterPods.xcworkspace"
|
||||
|
||||
info "When done testing iOS JSC, press any key to test iOS Hermes"
|
||||
read -r -n 1
|
||||
|
||||
success "About to test iOS Hermes... "
|
||||
success "Installing CocoaPods dependencies..."
|
||||
rm -rf packages/rn-tester/Pods
|
||||
(cd packages/rn-tester && USE_HERMES=1 pod install)
|
||||
|
||||
info "Press any key to open the workspace in Xcode, then build and test manually."
|
||||
info ""
|
||||
read -r -n 1
|
||||
|
||||
open "packages/rn-tester/RNTesterPods.xcworkspace"
|
||||
|
||||
info "When done testing RNTester app on iOS and Android press any key to continue."
|
||||
info ""
|
||||
read -n 1
|
||||
read -r -n 1
|
||||
|
||||
success "Killing packager"
|
||||
lsof -i :8081 | grep LISTEN
|
||||
@@ -86,7 +111,7 @@ success "React Native version changed in the template"
|
||||
|
||||
project_name="RNTestProject"
|
||||
|
||||
cd /tmp/
|
||||
cd /tmp/ || exit
|
||||
rm -rf "$project_name"
|
||||
node "$repo_root/cli.js" init "$project_name" --template "$repo_root"
|
||||
|
||||
@@ -102,7 +127,7 @@ info " - Verify 'Reload JS' works"
|
||||
info ""
|
||||
info "Press any key to run the sample in Android emulator/device"
|
||||
info ""
|
||||
read -n 1
|
||||
read -r -n 1
|
||||
cd "/tmp/${project_name}" && npx react-native run-android
|
||||
|
||||
info "Test the following on iOS:"
|
||||
@@ -115,10 +140,10 @@ info " - Disable Fast Refresh."
|
||||
info ""
|
||||
info "Press any key to open the project in Xcode"
|
||||
info ""
|
||||
read -n 1
|
||||
read -r -n 1
|
||||
open "/tmp/${project_name}/ios/${project_name}.xcworkspace"
|
||||
|
||||
cd "$repo_root"
|
||||
cd "$repo_root" || exit
|
||||
|
||||
info "Next steps:"
|
||||
info " - https://github.com/facebook/react-native/blob/HEAD/Releases.md"
|
||||
|
||||
@@ -435,10 +435,10 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
|
||||
"\"$(inherited)\"",
|
||||
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
@@ -493,10 +493,10 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
|
||||
"\"$(inherited)\"",
|
||||
"\"$(SDKROOT)/usr/lib/swift\"",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
|
||||
@@ -25,5 +25,6 @@ target 'HelloWorld' do
|
||||
|
||||
post_install do |installer|
|
||||
react_native_post_install(installer)
|
||||
__apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "17.0.2",
|
||||
"react-native": "1000.0.0"
|
||||
"react-native": "0.66.0-rc.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.9",
|
||||
@@ -21,7 +21,6 @@
|
||||
"eslint": "7.14.0",
|
||||
"jest": "^26.6.3",
|
||||
"metro-react-native-babel-preset": "^0.66.2",
|
||||
"react-native-codegen": "^0.0.7",
|
||||
"react-test-renderer": "17.0.2"
|
||||
},
|
||||
"jest": {
|
||||
|
||||
Reference in New Issue
Block a user