Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d58e9d0
Update object spread syntax description (#3036)
coryhouse Jun 16, 2020
09ba545
Fixing the infinitive (#3032)
saifalfalah Jun 17, 2020
e548bd7
Update 2013-10-16-react-v0.5.0.md (#2945)
NotMoni Jun 17, 2020
1913f35
Release Channels page in the docs doesn't have "Previous article" or …
sijusamson Jul 4, 2020
3fc860a
Added React Native Bangalore Meetup Group (#3058)
shwetapal Jul 6, 2020
3e4f268
Update copyright headers (#3086)
Jul 7, 2020
d603d48
Added copyright header to CSS files (#3089)
Jul 7, 2020
72b9b1a
Added Privacy and Terms footer links (#3087)
Jul 7, 2020
649298b
Add sidebar item padding (#3090)
kefimochi Jul 8, 2020
a098540
fixed issue of profile link broken for react v16.13.0 blog post (#3094)
nik72619c Jul 10, 2020
dea363e
Update 2016-07-13-mixins-considered-harmful.md (#3096)
RedasP Jul 10, 2020
0ad7e3a
Correct broken link in acknowledgements.html.js (#3111)
saswatamcode Jul 16, 2020
7d72c89
Add Ricky to team page (#3112)
rickhanlonii Jul 16, 2020
f3e55c8
Correct grammar in conditional-rendering.md (#3095)
shyamsn00 Jul 17, 2020
0f01e66
Adds Seth to Team Page (#3116)
sethwebster Jul 17, 2020
ee75c29
Team Page: Move Dominic and Yuzhi to acknowledgements (#3117)
gaearon Jul 17, 2020
6b45b65
Update urls of tools examples (#3123)
eliamaino-fp Jul 20, 2020
2bf673b
Channel naming was "Stable" instead of "Latest" (#3131)
anarafaelaferro Jul 22, 2020
7eb5d8c
Fix minor grammatical error (missing comma) (#3133)
AJMcDee Jul 22, 2020
13ea21c
Updated "Not supported" versions (#3135)
cHaLkdusT Jul 23, 2020
24f47fb
Removed deadlink from Event System section and added correct links (#…
enahsor Jul 24, 2020
bb8b014
Fix community anchor link to make it clear on all desktop/laptop scre…
RusimbiPatrick Jul 26, 2020
6333246
Update hooks-overview.md (#3110)
amodsachintha Jul 27, 2020
44df511
merging all conflicts
reactjs-translation-bot Jul 27, 2020
31c644e
resolve conflicts
vldmrkl Aug 3, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion content/blog/2013-10-16-react-v0.5.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ It's been awesome to see the things that people are building with React, and we
* Added `React.version`.
* Added `React.isValidClass` - Used to determine if a value is a valid component constructor.
* Removed `React.autoBind` - This was deprecated in v0.4 and now properly removed.
* Renamed `React.unmountAndReleaseReactRootNode` to `React.unmountComponentAtNode`.
* Renamed `React.unmountAndReleaseReactRootNode` to `React.unmountComponentAtNode`.
* Began laying down work for refined performance analysis.
* Better support for server-side rendering - [react-page](https://github.com/facebook/react-page) has helped improve the stability for server-side rendering.
* Made it possible to use React in environments enforcing a strict [Content Security Policy](https://developer.mozilla.org/en-US/docs/Security/CSP/Introducing_Content_Security_Policy). This also makes it possible to use React to build Chrome extensions.
Expand Down
2 changes: 1 addition & 1 deletion content/blog/2016-07-13-mixins-considered-harmful.md
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ var Button = React.createClass({

Sometimes people use mixins to selectively add logging to lifecycle methods in some components. In the future, we intend to provide an [official DevTools API](https://github.com/facebook/react/issues/5306) that would let you implement something similar without touching the components. However it’s still very much a work in progress. If you heavily depend on logging mixins for debugging, you might want to keep using those mixins for a little longer.

If you can’t accomplish something with a component, a higher-order component, or a utility module, it could be mean that React should provide this out of the box. [File an issue](https://github.com/facebook/react/issues/new) to tell us about your use case for mixins, and we’ll help you consider alternatives or perhaps implement your feature request.
If you can’t accomplish something with a component, a higher-order component, or a utility module, it could mean that React should provide this out of the box. [File an issue](https://github.com/facebook/react/issues/new) to tell us about your use case for mixins, and we’ll help you consider alternatives or perhaps implement your feature request.

Mixins are not deprecated in the traditional sense. You can keep using them with `React.createClass()`, as we won’t be changing it further. Eventually, as ES6 classes gain more adoption and their usability problems in React are solved, we might split `React.createClass()` into a separate package because most people wouldn’t need it. Even in that case, your old mixins would keep working.

Expand Down
4 changes: 2 additions & 2 deletions content/blog/2019-08-15-new-react-devtools.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ It also offers full support for React Hooks, including inspecting nested objects
* `16.x`: Supported

**`react-native`**
* `0`-`0.61`: Not supported
* `0.62`: Will be supported (when 0.62 is released)
* `0`-`0.61.x`: Not supported
* `0.62`: Supported

## How do I get the new DevTools? {#how-do-i-get-the-new-devtools}

Expand Down
2 changes: 1 addition & 1 deletion content/blog/2020-02-26-react-v16.13.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,6 @@ Refer to the documentation for [detailed installation instructions](/docs/instal
- Adjust `SuspenseList` CPU bound heuristic ([@sebmarkbage](https://github.com/sebmarkbage) in [#17455](https://github.com/facebook/react/pull/17455))
- Add missing event plugin priorities ([@trueadm](https://github.com/trueadm) in [#17914](https://github.com/facebook/react/pull/17914))
- Fix `isPending` only being true when transitioning from inside an input event ([@acdlite](https://github.com/acdlite) in [#17382](https://github.com/facebook/react/pull/17382))
- Fix `React.memo` components dropping updates when interrupted by a higher priority update ([@acdlite](<(https://github.com/acdlite)>) in [#18091](https://github.com/facebook/react/pull/18091))
- Fix `React.memo` components dropping updates when interrupted by a higher priority update ([@acdlite](https://github.com/acdlite) in [#18091](https://github.com/facebook/react/pull/18091))
- Don't warn when suspending at the wrong priority ([@gaearon](https://github.com/gaearon) in [#17971](https://github.com/facebook/react/pull/17971))
- Fix a bug with rebasing updates ([@acdlite](https://github.com/acdlite) and [@sebmarkbage](https://github.com/sebmarkbage) in [#17560](https://github.com/facebook/react/pull/17560), [#17510](https://github.com/facebook/react/pull/17510), [#17483](https://github.com/facebook/react/pull/17483), [#17480](https://github.com/facebook/react/pull/17480))
1 change: 1 addition & 0 deletions content/community/meetups.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ Do you have a local React.js meetup? Add it here! (Please keep the list alphabet

## India {#india}
* [Bangalore](https://www.meetup.com/ReactJS-Bangalore/)
* [Bangalore](https://www.meetup.com/React-Native-Bangalore-Meetup)
* [Chandigarh](https://www.meetup.com/Chandigarh-React-Developers/)
* [Chennai](https://www.meetup.com/React-Chennai/)
* [Delhi NCR](https://www.meetup.com/React-Delhi-NCR/)
Expand Down
26 changes: 13 additions & 13 deletions content/community/team.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,6 @@ Brian studied art in college and did programming on the side to pay for his educ

Dan got into programming after he accidentally discovered Visual Basic inside Microsoft PowerPoint. He has found his true calling in turning [Sebastian](#sebastian-markbage)'s tweets into long-form blog posts. Dan occasionally wins at Fortnite by hiding in a bush until the game ends.

### Dominic Gannaway {#dominic-gannaway}

![Dominic](../images/team/trueadm.jpg)

[@trueadm on GitHub](https://github.com/trueadm) &middot; [@trueadm on Twitter](https://twitter.com/trueadm)

Dominic is interested in travelling, drum and bass, stand-up comedy and spending time with the family. He most enjoys hacking on new unexplored ideas around UIs and accessibility and has a passion for tweaking and optimizing code to get the most performance out of things.

### Luna Ruan {#luna-ruan}

![Luna](../images/team/lunaruan.jpg)
Expand All @@ -62,6 +54,14 @@ Luna learned programming because she thought it meant creating video games. Inst

Rachel wrote a [book about UI animation](https://abookapart.com/products/animation-at-work) once and worked with MDN and the W3C on the web animations API. Now she is busy with education materials and community engineering on the React team. Secretly, she is an award-winning cartoonist for teenage girls. Catch her making fancy tea with lukewarm water in the microkitchen.

### Rick Hanlon {#rick-hanlon}

![Ricky](../images/team/rickhanlonii.jpg)

[@rickhanlonii on GitHub](https://github.com/rickhanlonii) &middot; [@rickhanlonii on Twitter](https://twitter.com/rickhanlonii)

Ricky majored in theoretical math and somehow found himself on the React Native team for a couple years before joining the React team. When he's not programming you can find him snowboarding, biking, climbing, golfing, or closing GitHub issues that do not match the issue template.

### Sebastian Markbåge {#sebastian-markbage}

![Sebastian](../images/team/sebmarkbage.jpg)
Expand All @@ -70,13 +70,11 @@ Rachel wrote a [book about UI animation](https://abookapart.com/products/animati

Sebastian majored in psychology. He's usually quiet. Even when he says something, it often doesn't make sense to the rest of us until a few months later. The correct way to pronounce his surname is "mark-boa-geh" but he settled for "mark-beige" out of pragmatism -- and that's how he approaches React.

### Yuzhi Zheng {#yuzhi-zheng}

![Yuzhi](../images/team/yuzhi.jpg)
### Seth Webster {#seth-webster}

[@yuzhi on GitHub](https://github.com/yuzhi) &middot; [@yuzhiz on Twitter](https://twitter.com/yuzhiz)
![Seth](../images/team/sethwebster.jpg)

Yuzhi studied Computer Science in school. She liked the instant gratification of seeing code come to life without having to physically be in a laboratory. Now she manages the React team. Before management, she used to work on the Relay data fetching framework. In her spare time, Yuzhi enjoys optimizing her life via gardening and home improvement projects.
Seth started programming as a kid growing up in Tucson, AZ. After school, he was bitten by the music bug and was a touring musician for about 10 years before returning to *work*, starting with Intuit. In his spare time, he loves [taking pictures](https://www.sethwebster.com) and flying for animal rescues in the northeastern United States.

## Acknowledgements {#acknowledgements}

Expand All @@ -93,6 +91,7 @@ React was originally created by [Jordan Walke](https://github.com/jordwalke). To
* [Christoph Nakazawa](https://github.com/cpojer)
* [Christopher Chedeau](https://github.com/vjeux)
* [Clement Hoang](https://github.com/clemmy)
* [Dominic Gannaway](https://github.com/trueadm)
* [Flarnie Marchan](https://github.com/flarnie)
* [Jason Quense](https://github.com/jquense)
* [Jesse Beach](https://github.com/jessebeach)
Expand All @@ -114,6 +113,7 @@ React was originally created by [Jordan Walke](https://github.com/jordwalke). To
* [Sophie Alpert](https://github.com/sophiebits)
* [Sunil Pai](https://github.com/threepointone)
* [Tim Yung](https://github.com/yungsters)
* [Yuzhi Zheng](https://github.com/yuzhi)

This list is not exhaustive.

Expand Down
2 changes: 1 addition & 1 deletion content/docs/code-splitting.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ console.log(add(16, 26)); // 42
>
> Наприкінці ваші бандли будуть значно відрізнятися від наведених прикладів.

Якщо ви використовуєте [Create React App](https://github.com/facebookincubator/create-react-app), [Next.js](https://github.com/zeit/next.js/), [Gatsby](https://www.gatsbyjs.org/) чи подібний інструмент, ви матимете налаштування Webpack за замовчуванням для бандлінгу вашого
Якщо ви використовуєте [Create React App](https://create-react-app.dev/), [Next.js](https://nextjs.org/), [Gatsby](https://www.gatsbyjs.org/) чи подібний інструмент, ви матимете налаштування Webpack за замовчуванням для бандлінгу вашого
додатку.

Якщо ви не використовуєте нічого з наведеного чи подібного, вам доведеться налаштовувати бандлінг самостійно. Для прикладів ознайомтеся зі
Expand Down
65 changes: 4 additions & 61 deletions content/docs/codebase-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,33 +35,11 @@ For example, a test for [`setInnerHTML.js`](https://github.com/facebook/react/bl

### Warnings and Invariants {#warnings-and-invariants}

The React codebase uses the `warning` module to display warnings:
The React codebase uses `console.error` to display warnings:

```js
var warning = require('warning');

warning(
2 + 2 === 4,
'Math is not working today.'
);
```

**The warning is shown when the `warning` condition is `false`.**

One way to think about it is that the condition should reflect the normal situation rather than the exceptional one.

It is a good idea to avoid spamming the console with duplicate warnings:

```js
var warning = require('warning');

var didWarnAboutMath = false;
if (!didWarnAboutMath) {
warning(
2 + 2 === 4,
'Math is not working today.'
);
didWarnAboutMath = true;
if (__DEV__) {
console.error('Something is wrong.');
}
```

Expand Down Expand Up @@ -114,39 +92,6 @@ ReactRef.detachRefs = function(
When possible, new code should use Flow annotations.
You can run `yarn flow` locally to check your code with Flow.

### Dynamic Injection {#dynamic-injection}

React uses dynamic injection in some modules. While it is always explicit, it is still unfortunate because it hinders understanding of the code. The main reason it exists is because React originally only supported DOM as a target. React Native started as a React fork. We had to add dynamic injection to let React Native override some behaviors.

You may see modules declaring their dynamic dependencies like this:

```js
// Dynamically injected
var textComponentClass = null;

// Relies on dynamically injected value
function createInstanceForText(text) {
return new textComponentClass(text);
}

var ReactHostComponent = {
createInstanceForText,

// Provides an opportunity for dynamic injection
injection: {
injectTextComponentClass: function(componentClass) {
textComponentClass = componentClass;
},
},
};

module.exports = ReactHostComponent;
```

The `injection` field is not handled specially in any way. But by convention, it means that this module wants to have some (presumably platform-specific) dependencies injected into it at runtime.

There are multiple injection points in the codebase. In the future, we intend to get rid of the dynamic injection mechanism and wire up all the pieces statically during the build.

### Multiple Packages {#multiple-packages}

React is a [monorepo](https://danluu.com/monorepo/). Its repository contains multiple separate packages so that their changes can be coordinated together, and issues live in one place.
Expand Down Expand Up @@ -211,9 +156,7 @@ Its source code is located in [`packages/react-reconciler`](https://github.com/f

### Event System {#event-system}

React implements a synthetic event system which is agnostic of the renderers and works both with React DOM and React Native. Its source code is located in [`packages/legacy-events`](https://github.com/facebook/react/tree/master/packages/legacy-events).

There is a [video with a deep code dive into it](https://www.youtube.com/watch?v=dRo_egw7tBc) (66 mins).
React implements a layer over native events to smooth out cross-browser differences. Its source code is located in [`packages/react-dom/src/events`](https://github.com/facebook/react/tree/master/packages/react-dom/src/events).

### What Next? {#what-next}

Expand Down
2 changes: 1 addition & 1 deletion content/docs/hooks-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ function FriendListItem(props) {
}
```

Стани цих компонентів ніяким чином не залежать одне від одного. Хуки -- це спосіб повторно використовувати *логіку стану*, а не сам стан. Більш того, кожний *виклик* хука забезпечує абсолютно ізольований стан. Ви навіть можете використовувати один і той самий хук декілька разів в одному компоненті.
Стан кожного компонента ніяким чином не залежить одне від одного. Хуки -- це спосіб повторно використовувати *логіку стану*, а не сам стан. Більш того, кожний *виклик* хука забезпечує абсолютно ізольований стан. Ви навіть можете використовувати один і той самий хук декілька разів в одному компоненті.

Користувацькі хуки -- це більше конвенція, аніж доповнення. Якщо ім'я функції починається з "`use`" і вона викликає інші хуки, ми розцінюємо це як користувацький хук. Якщо ви будете дотримуватися конвенції `useSomething` при іменуванні хуків, це дозволить нашому плагіну для лінтера знайти помилки в коді, який використовує хуки.

Expand Down
4 changes: 3 additions & 1 deletion content/docs/optimizing-performance.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,14 +371,16 @@ function updateColorMap(colormap) {

`updateColorMap` тепер повертає новий об'єкт, а не змінює старий. `Object.assign` — це ES6 і для його роботи потрібен поліфіл.

Існує пропозиція щодо внесення в JavaScript [розпакування властивостей об'єкта](https://github.com/sebmarkbage/ecmascript-rest-spread), щоб зробити простішим оновлення об'єктів без їхньої зміни:
[Оператор розкладу](https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Operators/Spread_syntax) дозволяє оновлювати об'єкти, не мутуючи їх:

```js
function updateColorMap(colormap) {
return {...colormap, right: 'blue'};
}
```

Ця функція була додана до JavaScript у ES2018.

Якщо ви використовуєте Create React App, то `Object.assign` та розпакування об'єктів доступні за замовчуванням.

Коли ви працюєте з глибоко вкладеними об'єктами, то постійне іх оновлення може заплутати вас. Якщо ви зіткнулися з такою проблемою, зверніть увагу на [Immer](https://github.com/mweststrate/immer) або [immutability-helper](https://github.com/kolodny/immutability-helper). Ці бібліотеки допомогають писати читабельний код, не втрачаючи переваг незмінності.
4 changes: 3 additions & 1 deletion content/docs/release-channels.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ title: Release Channels
permalink: docs/release-channels.html
layout: docs
category: installation
prev: cdn-links.html
next: hello-world.html
---

React relies on a thriving open source community to file bug reports, open pull requests, and [submit RFCs](https://github.com/reactjs/rfcs). To encourage feedback we sometimes share special builds of React that include unreleased features.
Expand Down Expand Up @@ -86,7 +88,7 @@ You may find it valuable to run integration tests against Experimental. This is

#### How Can I Learn More About Experimental Features? {#how-can-i-learn-more-about-experimental-features}

Experimental features may or may not be documented. Usually, experiments aren't documented until they are close to shipping in Next or Stable.
Experimental features may or may not be documented. Usually, experiments aren't documented until they are close to shipping in Next or Latest.

If a feature is not documented, they may be accompanied by an [RFC](https://github.com/reactjs/rfcs).

Expand Down
Binary file added content/images/team/rickhanlonii.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/images/team/sethwebster.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions flow-typed/gatsby.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

declare module 'gatsby' {
declare module.exports: any;
}
4 changes: 4 additions & 0 deletions flow-typed/glamor.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

declare module 'glamor' {
declare module.exports: {
css: {
Expand Down
4 changes: 4 additions & 0 deletions flow-typed/hex2rgba.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

declare module 'hex2rgba' {
declare module.exports: (hex: string, alpha?: number) => string;
}
4 changes: 4 additions & 0 deletions flow-typed/react-helmet.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

declare module 'react-helmet' {
declare module.exports: any;
}
4 changes: 4 additions & 0 deletions flow-typed/slugify.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

declare module 'slugify' {
declare module.exports: any;
}
2 changes: 1 addition & 1 deletion gatsby-browser.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* @emails react-core
*/
Expand Down
2 changes: 1 addition & 1 deletion gatsby-config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* @emails react-core
*/
Expand Down
2 changes: 1 addition & 1 deletion gatsby-node.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* @emails react-core
*/
Expand Down
2 changes: 1 addition & 1 deletion gatsby/createPages.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* @emails react-core
*/
Expand Down
2 changes: 1 addition & 1 deletion gatsby/onCreateNode.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* @emails react-core
*/
Expand Down
2 changes: 1 addition & 1 deletion gatsby/onCreatePage.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* @emails react-core
*/
Expand Down
2 changes: 1 addition & 1 deletion gatsby/onCreateWebpackConfig.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* Copyright (c) Facebook, Inc. and its affiliates.
*
* @emails react-core
*/
Expand Down
4 changes: 4 additions & 0 deletions plugins/gatsby-remark-header-custom-ids/gatsby-client.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

let offsetY = 0;

const getTargetOffset = hash => {
Expand Down
4 changes: 4 additions & 0 deletions plugins/gatsby-remark-header-custom-ids/gatsby-ssr.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

const React = require(`react`);

const pluginDefaults = {
Expand Down
4 changes: 4 additions & 0 deletions plugins/gatsby-remark-header-custom-ids/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/

/*!
* Based on 'gatsby-remark-autolink-headers'
* Original Author: Kyle Mathews <mathews.kyle@gmail.com>
Expand Down
Loading