Skip to content

Commit 8ca918c

Browse files
committed
fix(react-compiler): optimize components declared with arrow function and implicit return and compilationMode: 'infer' (#31792)
fixes #31601 #31639 cc @josephsavona DiffTrain build for [6b1a2c1](6b1a2c1)
1 parent e64ab31 commit 8ca918c

35 files changed

+107
-104
lines changed

compiled/eslint-plugin-react-hooks/index.js

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54557,34 +54557,37 @@ function callsHooksOrCreatesJsx(node, hookPattern) {
5455754557
});
5455854558
return invokesHooks || createsJsx;
5455954559
}
54560+
function isNonNode(node) {
54561+
if (!node) {
54562+
return true;
54563+
}
54564+
switch (node.type) {
54565+
case 'ObjectExpression':
54566+
case 'ArrowFunctionExpression':
54567+
case 'FunctionExpression':
54568+
case 'BigIntLiteral':
54569+
case 'ClassExpression':
54570+
case 'NewExpression':
54571+
return true;
54572+
}
54573+
return false;
54574+
}
5456054575
function returnsNonNode(node) {
54561-
let hasReturn = false;
5456254576
let returnsNonNode = false;
54577+
if (node.type === 'ArrowFunctionExpression' &&
54578+
node.node.body.type !== 'BlockStatement') {
54579+
returnsNonNode = isNonNode(node.node.body);
54580+
}
5456354581
node.traverse({
5456454582
ReturnStatement(ret) {
54565-
hasReturn = true;
54566-
const argument = ret.node.argument;
54567-
if (argument == null) {
54568-
returnsNonNode = true;
54569-
}
54570-
else {
54571-
switch (argument.type) {
54572-
case 'ObjectExpression':
54573-
case 'ArrowFunctionExpression':
54574-
case 'FunctionExpression':
54575-
case 'BigIntLiteral':
54576-
case 'ClassExpression':
54577-
case 'NewExpression':
54578-
returnsNonNode = true;
54579-
}
54580-
}
54583+
returnsNonNode = isNonNode(ret.node.argument);
5458154584
},
5458254585
ArrowFunctionExpression: skipNestedFunctions(node),
5458354586
FunctionExpression: skipNestedFunctions(node),
5458454587
FunctionDeclaration: skipNestedFunctions(node),
5458554588
ObjectMethod: node => node.skip(),
5458654589
});
54587-
return !hasReturn || returnsNonNode;
54590+
return returnsNonNode;
5458854591
}
5458954592
function getFunctionName$1(path) {
5459054593
if (path.isFunctionDeclaration()) {

compiled/facebook-www/REVISION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
de4aad5ba693be099b215b5819b5f25d05051a84
1+
6b1a2c1d81630a5f385c5be0f758365b63d92eae
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
de4aad5ba693be099b215b5819b5f25d05051a84
1+
6b1a2c1d81630a5f385c5be0f758365b63d92eae

compiled/facebook-www/React-dev.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1510,7 +1510,7 @@ __DEV__ &&
15101510
exports.useTransition = function () {
15111511
return resolveDispatcher().useTransition();
15121512
};
1513-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
1513+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";
15141514
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
15151515
"function" ===
15161516
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-dev.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1510,7 +1510,7 @@ __DEV__ &&
15101510
exports.useTransition = function () {
15111511
return resolveDispatcher().useTransition();
15121512
};
1513-
exports.version = "19.1.0-www-modern-de4aad5b-20250321";
1513+
exports.version = "19.1.0-www-modern-6b1a2c1d-20250321";
15141514
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
15151515
"function" ===
15161516
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-prod.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,4 +641,4 @@ exports.useSyncExternalStore = function (
641641
exports.useTransition = function () {
642642
return ReactSharedInternals.H.useTransition();
643643
};
644-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
644+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";

compiled/facebook-www/React-prod.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,4 +641,4 @@ exports.useSyncExternalStore = function (
641641
exports.useTransition = function () {
642642
return ReactSharedInternals.H.useTransition();
643643
};
644-
exports.version = "19.1.0-www-modern-de4aad5b-20250321";
644+
exports.version = "19.1.0-www-modern-6b1a2c1d-20250321";

compiled/facebook-www/React-profiling.classic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ exports.useSyncExternalStore = function (
645645
exports.useTransition = function () {
646646
return ReactSharedInternals.H.useTransition();
647647
};
648-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
648+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";
649649
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
650650
"function" ===
651651
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/React-profiling.modern.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ exports.useSyncExternalStore = function (
645645
exports.useTransition = function () {
646646
return ReactSharedInternals.H.useTransition();
647647
};
648-
exports.version = "19.1.0-www-modern-de4aad5b-20250321";
648+
exports.version = "19.1.0-www-modern-6b1a2c1d-20250321";
649649
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
650650
"function" ===
651651
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/ReactART-dev.classic.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18464,10 +18464,10 @@ __DEV__ &&
1846418464
(function () {
1846518465
var internals = {
1846618466
bundleType: 1,
18467-
version: "19.1.0-www-classic-de4aad5b-20250321",
18467+
version: "19.1.0-www-classic-6b1a2c1d-20250321",
1846818468
rendererPackageName: "react-art",
1846918469
currentDispatcherRef: ReactSharedInternals,
18470-
reconcilerVersion: "19.1.0-www-classic-de4aad5b-20250321"
18470+
reconcilerVersion: "19.1.0-www-classic-6b1a2c1d-20250321"
1847118471
};
1847218472
internals.overrideHookState = overrideHookState;
1847318473
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -18501,7 +18501,7 @@ __DEV__ &&
1850118501
exports.Shape = Shape;
1850218502
exports.Surface = Surface;
1850318503
exports.Text = Text;
18504-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
18504+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";
1850518505
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
1850618506
"function" ===
1850718507
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/ReactART-dev.modern.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18236,10 +18236,10 @@ __DEV__ &&
1823618236
(function () {
1823718237
var internals = {
1823818238
bundleType: 1,
18239-
version: "19.1.0-www-modern-de4aad5b-20250321",
18239+
version: "19.1.0-www-modern-6b1a2c1d-20250321",
1824018240
rendererPackageName: "react-art",
1824118241
currentDispatcherRef: ReactSharedInternals,
18242-
reconcilerVersion: "19.1.0-www-modern-de4aad5b-20250321"
18242+
reconcilerVersion: "19.1.0-www-modern-6b1a2c1d-20250321"
1824318243
};
1824418244
internals.overrideHookState = overrideHookState;
1824518245
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -18273,7 +18273,7 @@ __DEV__ &&
1827318273
exports.Shape = Shape;
1827418274
exports.Surface = Surface;
1827518275
exports.Text = Text;
18276-
exports.version = "19.1.0-www-modern-de4aad5b-20250321";
18276+
exports.version = "19.1.0-www-modern-6b1a2c1d-20250321";
1827718277
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
1827818278
"function" ===
1827918279
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/ReactART-prod.classic.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11276,10 +11276,10 @@ var slice = Array.prototype.slice,
1127611276
})(React.Component);
1127711277
var internals$jscomp$inline_1599 = {
1127811278
bundleType: 0,
11279-
version: "19.1.0-www-classic-de4aad5b-20250321",
11279+
version: "19.1.0-www-classic-6b1a2c1d-20250321",
1128011280
rendererPackageName: "react-art",
1128111281
currentDispatcherRef: ReactSharedInternals,
11282-
reconcilerVersion: "19.1.0-www-classic-de4aad5b-20250321"
11282+
reconcilerVersion: "19.1.0-www-classic-6b1a2c1d-20250321"
1128311283
};
1128411284
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1128511285
var hook$jscomp$inline_1600 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -11305,4 +11305,4 @@ exports.RadialGradient = RadialGradient;
1130511305
exports.Shape = TYPES.SHAPE;
1130611306
exports.Surface = Surface;
1130711307
exports.Text = Text;
11308-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
11308+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";

compiled/facebook-www/ReactART-prod.modern.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10989,10 +10989,10 @@ var slice = Array.prototype.slice,
1098910989
})(React.Component);
1099010990
var internals$jscomp$inline_1572 = {
1099110991
bundleType: 0,
10992-
version: "19.1.0-www-modern-de4aad5b-20250321",
10992+
version: "19.1.0-www-modern-6b1a2c1d-20250321",
1099310993
rendererPackageName: "react-art",
1099410994
currentDispatcherRef: ReactSharedInternals,
10995-
reconcilerVersion: "19.1.0-www-modern-de4aad5b-20250321"
10995+
reconcilerVersion: "19.1.0-www-modern-6b1a2c1d-20250321"
1099610996
};
1099710997
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1099810998
var hook$jscomp$inline_1573 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -11018,4 +11018,4 @@ exports.RadialGradient = RadialGradient;
1101811018
exports.Shape = TYPES.SHAPE;
1101911019
exports.Surface = Surface;
1102011020
exports.Text = Text;
11021-
exports.version = "19.1.0-www-modern-de4aad5b-20250321";
11021+
exports.version = "19.1.0-www-modern-6b1a2c1d-20250321";

compiled/facebook-www/ReactDOM-dev.classic.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30211,11 +30211,11 @@ __DEV__ &&
3021130211
return_targetInst = null;
3021230212
(function () {
3021330213
var isomorphicReactPackageVersion = React.version;
30214-
if ("19.1.0-www-classic-de4aad5b-20250321" !== isomorphicReactPackageVersion)
30214+
if ("19.1.0-www-classic-6b1a2c1d-20250321" !== isomorphicReactPackageVersion)
3021530215
throw Error(
3021630216
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
3021730217
(isomorphicReactPackageVersion +
30218-
"\n - react-dom: 19.1.0-www-classic-de4aad5b-20250321\nLearn more: https://react.dev/warnings/version-mismatch")
30218+
"\n - react-dom: 19.1.0-www-classic-6b1a2c1d-20250321\nLearn more: https://react.dev/warnings/version-mismatch")
3021930219
);
3022030220
})();
3022130221
("function" === typeof Map &&
@@ -30258,10 +30258,10 @@ __DEV__ &&
3025830258
!(function () {
3025930259
var internals = {
3026030260
bundleType: 1,
30261-
version: "19.1.0-www-classic-de4aad5b-20250321",
30261+
version: "19.1.0-www-classic-6b1a2c1d-20250321",
3026230262
rendererPackageName: "react-dom",
3026330263
currentDispatcherRef: ReactSharedInternals,
30264-
reconcilerVersion: "19.1.0-www-classic-de4aad5b-20250321"
30264+
reconcilerVersion: "19.1.0-www-classic-6b1a2c1d-20250321"
3026530265
};
3026630266
internals.overrideHookState = overrideHookState;
3026730267
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -30859,7 +30859,7 @@ __DEV__ &&
3085930859
exports.useFormStatus = function () {
3086030860
return resolveDispatcher().useHostTransitionStatus();
3086130861
};
30862-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
30862+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";
3086330863
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
3086430864
"function" ===
3086530865
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/ReactDOM-dev.modern.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29997,11 +29997,11 @@ __DEV__ &&
2999729997
return_targetInst = null;
2999829998
(function () {
2999929999
var isomorphicReactPackageVersion = React.version;
30000-
if ("19.1.0-www-modern-de4aad5b-20250321" !== isomorphicReactPackageVersion)
30000+
if ("19.1.0-www-modern-6b1a2c1d-20250321" !== isomorphicReactPackageVersion)
3000130001
throw Error(
3000230002
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
3000330003
(isomorphicReactPackageVersion +
30004-
"\n - react-dom: 19.1.0-www-modern-de4aad5b-20250321\nLearn more: https://react.dev/warnings/version-mismatch")
30004+
"\n - react-dom: 19.1.0-www-modern-6b1a2c1d-20250321\nLearn more: https://react.dev/warnings/version-mismatch")
3000530005
);
3000630006
})();
3000730007
("function" === typeof Map &&
@@ -30044,10 +30044,10 @@ __DEV__ &&
3004430044
!(function () {
3004530045
var internals = {
3004630046
bundleType: 1,
30047-
version: "19.1.0-www-modern-de4aad5b-20250321",
30047+
version: "19.1.0-www-modern-6b1a2c1d-20250321",
3004830048
rendererPackageName: "react-dom",
3004930049
currentDispatcherRef: ReactSharedInternals,
30050-
reconcilerVersion: "19.1.0-www-modern-de4aad5b-20250321"
30050+
reconcilerVersion: "19.1.0-www-modern-6b1a2c1d-20250321"
3005130051
};
3005230052
internals.overrideHookState = overrideHookState;
3005330053
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -30645,7 +30645,7 @@ __DEV__ &&
3064530645
exports.useFormStatus = function () {
3064630646
return resolveDispatcher().useHostTransitionStatus();
3064730647
};
30648-
exports.version = "19.1.0-www-modern-de4aad5b-20250321";
30648+
exports.version = "19.1.0-www-modern-6b1a2c1d-20250321";
3064930649
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
3065030650
"function" ===
3065130651
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

compiled/facebook-www/ReactDOM-prod.classic.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18943,14 +18943,14 @@ function getCrossOriginStringAs(as, input) {
1894318943
}
1894418944
var isomorphicReactPackageVersion$jscomp$inline_1987 = React.version;
1894518945
if (
18946-
"19.1.0-www-classic-de4aad5b-20250321" !==
18946+
"19.1.0-www-classic-6b1a2c1d-20250321" !==
1894718947
isomorphicReactPackageVersion$jscomp$inline_1987
1894818948
)
1894918949
throw Error(
1895018950
formatProdErrorMessage(
1895118951
527,
1895218952
isomorphicReactPackageVersion$jscomp$inline_1987,
18953-
"19.1.0-www-classic-de4aad5b-20250321"
18953+
"19.1.0-www-classic-6b1a2c1d-20250321"
1895418954
)
1895518955
);
1895618956
Internals.findDOMNode = function (componentOrElement) {
@@ -18968,10 +18968,10 @@ Internals.Events = [
1896818968
];
1896918969
var internals$jscomp$inline_2575 = {
1897018970
bundleType: 0,
18971-
version: "19.1.0-www-classic-de4aad5b-20250321",
18971+
version: "19.1.0-www-classic-6b1a2c1d-20250321",
1897218972
rendererPackageName: "react-dom",
1897318973
currentDispatcherRef: ReactSharedInternals,
18974-
reconcilerVersion: "19.1.0-www-classic-de4aad5b-20250321"
18974+
reconcilerVersion: "19.1.0-www-classic-6b1a2c1d-20250321"
1897518975
};
1897618976
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1897718977
var hook$jscomp$inline_2576 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -19335,4 +19335,4 @@ exports.useFormState = function (action, initialState, permalink) {
1933519335
exports.useFormStatus = function () {
1933619336
return ReactSharedInternals.H.useHostTransitionStatus();
1933719337
};
19338-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
19338+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";

compiled/facebook-www/ReactDOM-prod.modern.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18672,14 +18672,14 @@ function getCrossOriginStringAs(as, input) {
1867218672
}
1867318673
var isomorphicReactPackageVersion$jscomp$inline_1977 = React.version;
1867418674
if (
18675-
"19.1.0-www-modern-de4aad5b-20250321" !==
18675+
"19.1.0-www-modern-6b1a2c1d-20250321" !==
1867618676
isomorphicReactPackageVersion$jscomp$inline_1977
1867718677
)
1867818678
throw Error(
1867918679
formatProdErrorMessage(
1868018680
527,
1868118681
isomorphicReactPackageVersion$jscomp$inline_1977,
18682-
"19.1.0-www-modern-de4aad5b-20250321"
18682+
"19.1.0-www-modern-6b1a2c1d-20250321"
1868318683
)
1868418684
);
1868518685
Internals.findDOMNode = function (componentOrElement) {
@@ -18697,10 +18697,10 @@ Internals.Events = [
1869718697
];
1869818698
var internals$jscomp$inline_2557 = {
1869918699
bundleType: 0,
18700-
version: "19.1.0-www-modern-de4aad5b-20250321",
18700+
version: "19.1.0-www-modern-6b1a2c1d-20250321",
1870118701
rendererPackageName: "react-dom",
1870218702
currentDispatcherRef: ReactSharedInternals,
18703-
reconcilerVersion: "19.1.0-www-modern-de4aad5b-20250321"
18703+
reconcilerVersion: "19.1.0-www-modern-6b1a2c1d-20250321"
1870418704
};
1870518705
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
1870618706
var hook$jscomp$inline_2558 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -19064,4 +19064,4 @@ exports.useFormState = function (action, initialState, permalink) {
1906419064
exports.useFormStatus = function () {
1906519065
return ReactSharedInternals.H.useHostTransitionStatus();
1906619066
};
19067-
exports.version = "19.1.0-www-modern-de4aad5b-20250321";
19067+
exports.version = "19.1.0-www-modern-6b1a2c1d-20250321";

compiled/facebook-www/ReactDOM-profiling.classic.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20685,14 +20685,14 @@ function getCrossOriginStringAs(as, input) {
2068520685
}
2068620686
var isomorphicReactPackageVersion$jscomp$inline_2147 = React.version;
2068720687
if (
20688-
"19.1.0-www-classic-de4aad5b-20250321" !==
20688+
"19.1.0-www-classic-6b1a2c1d-20250321" !==
2068920689
isomorphicReactPackageVersion$jscomp$inline_2147
2069020690
)
2069120691
throw Error(
2069220692
formatProdErrorMessage(
2069320693
527,
2069420694
isomorphicReactPackageVersion$jscomp$inline_2147,
20695-
"19.1.0-www-classic-de4aad5b-20250321"
20695+
"19.1.0-www-classic-6b1a2c1d-20250321"
2069620696
)
2069720697
);
2069820698
Internals.findDOMNode = function (componentOrElement) {
@@ -20710,10 +20710,10 @@ Internals.Events = [
2071020710
];
2071120711
var internals$jscomp$inline_2149 = {
2071220712
bundleType: 0,
20713-
version: "19.1.0-www-classic-de4aad5b-20250321",
20713+
version: "19.1.0-www-classic-6b1a2c1d-20250321",
2071420714
rendererPackageName: "react-dom",
2071520715
currentDispatcherRef: ReactSharedInternals,
20716-
reconcilerVersion: "19.1.0-www-classic-de4aad5b-20250321"
20716+
reconcilerVersion: "19.1.0-www-classic-6b1a2c1d-20250321"
2071720717
};
2071820718
enableSchedulingProfiler &&
2071920719
((internals$jscomp$inline_2149.getLaneLabelMap = getLaneLabelMap),
@@ -21080,7 +21080,7 @@ exports.useFormState = function (action, initialState, permalink) {
2108021080
exports.useFormStatus = function () {
2108121081
return ReactSharedInternals.H.useHostTransitionStatus();
2108221082
};
21083-
exports.version = "19.1.0-www-classic-de4aad5b-20250321";
21083+
exports.version = "19.1.0-www-classic-6b1a2c1d-20250321";
2108421084
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
2108521085
"function" ===
2108621086
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&

0 commit comments

Comments
 (0)