1526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify -analyzer-constraints=range -Wno-tautological-compare %s
243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid clang_analyzer_eval(bool);
443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
59e607dd1dff375b4fa33d923ed592dad3ad43d42Jordy Rose#define UINT_MAX (~0U)
61d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose#define INT_MAX (UINT_MAX & (UINT_MAX >> 1))
71d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose#define INT_MIN (-INT_MAX - 1)
8ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
9ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
10ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//  Plus/minus
11ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
12ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
13ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid separateExpressions (int a) {
14ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  int b = a + 1;
15ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  --b;
16ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
1743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a != 0 && b == 0); // expected-warning{{FALSE}}
18ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
19ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
20ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid oneLongExpression (int a) {
21ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  // Expression canonicalization should still allow this to work, even though
22ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  // the first term is on the left.
23ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  int b = 15 + a + 15 - 10 - 20;
24ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
2543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a != 0 && b == 0); // expected-warning{{FALSE}}
26ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
27ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
28b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixedTypes (int a) {
29b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  // Different additive types should not cause crashes when constant-folding.
30b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  // This is part of PR7406.
31b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  int b = a + 1LL;
3243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a != 0 && (b-1) == 0); // not crash, expected-warning{{FALSE}}
33b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
34b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose  int c = a + 1U;
3543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a != 0 && (c-1) == 0); // not crash, expected-warning{{FALSE}}
36b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose}
37b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
38ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
39ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//  Comparisons
40ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//---------------
41ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
42ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Equality and inequality only
43ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid eq_ne (unsigned a) {
4443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  if (a == UINT_MAX) {
4543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a+1 == 0); // expected-warning{{TRUE}}
4643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a-1 == UINT_MAX-1); // expected-warning{{TRUE}}
4743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  } else {
4843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a+1 != 0); // expected-warning{{TRUE}}
4943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a-1 != UINT_MAX-1); // expected-warning{{TRUE}}
5043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  }
51ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
52ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
53b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// Mixed typed inequalities (part of PR7406)
54b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// These should not crash.
55b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixed_eq_ne (int a) {
5643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  if (a == 1) {
5743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a+1U == 2); // expected-warning{{TRUE}}
5843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a-1U == 0); // expected-warning{{TRUE}}
5943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  } else {
6043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a+1U != 2); // expected-warning{{TRUE}}
6143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a-1U != 0); // expected-warning{{TRUE}}
6243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  }
63b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose}
64b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose
65ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
66ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Simple order comparisons with no adjustment
67ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGT (unsigned a) {
68ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a > 0)
6943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a != 0); // expected-warning{{TRUE}}
7043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  else
7143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a == 0); // expected-warning{{TRUE}}
72ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
73ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
74ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGE (unsigned a) {
75ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a >= UINT_MAX)
7643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a == UINT_MAX); // expected-warning{{TRUE}}
7743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  else
7843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a != UINT_MAX); // expected-warning{{TRUE}}
79ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
80ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
81ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLT (unsigned a) {
82ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a < UINT_MAX)
8343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a != UINT_MAX); // expected-warning{{TRUE}}
8443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  else
8543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a == UINT_MAX); // expected-warning{{TRUE}}
86ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
87ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
88ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLE (unsigned a) {
89ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a <= 0)
9043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a == 0); // expected-warning{{TRUE}}
9143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  else
9243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a != 0); // expected-warning{{TRUE}}
93ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
94ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
95ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
96ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Adjustment gives each of these an extra solution!
97ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGT (unsigned a) {
9843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a-1 > UINT_MAX-1); // expected-warning{{UNKNOWN}}
99ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
100ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
101ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGE (unsigned a) {
10243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a-1 > UINT_MAX-1); // expected-warning{{UNKNOWN}}
10343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
104ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a-1 >= UINT_MAX-1)
10543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a == UINT_MAX); // expected-warning{{UNKNOWN}}
106ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
107ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
108ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLT (unsigned a) {
10943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a+1 < 1); // expected-warning{{UNKNOWN}}
110ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
111ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
112ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLE (unsigned a) {
11343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a+1 <= 1); // expected-warning{{UNKNOWN}}
11443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
115ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose  if (a+1 <= 1)
11643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose    clang_analyzer_eval(a == 0); // expected-warning{{UNKNOWN}}
117ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
118ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
119ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose
120ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Tautologies
12143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose// The negative forms are exercised as well
12243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose// because clang_analyzer_eval tests both possibilities.
12343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid tautologies(unsigned a) {
12443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a <= UINT_MAX); // expected-warning{{TRUE}}
12543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a >= 0); // expected-warning{{TRUE}}
126ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose}
12714d20b1dff6370f76279fcfb0fd780e2e5eb57bbJordy Rose
12814d20b1dff6370f76279fcfb0fd780e2e5eb57bbJordy Rose
1291d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// Tautologies from outside the range of the symbol
13043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid tautologiesOutside(unsigned char a) {
131526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu  clang_analyzer_eval(a <= 0x100); // expected-warning{{TRUE}}
132526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu  clang_analyzer_eval(a < 0x100); // expected-warning{{TRUE}}
1331d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
134526e627d2bd7e8cbf630526d315c90864898d9ffRichard Trieu  clang_analyzer_eval(a != 0x100); // expected-warning{{TRUE}}
13543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a != -1); // expected-warning{{TRUE}}
1361d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
13743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a > -1); // expected-warning{{TRUE}}
13843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a >= -1); // expected-warning{{TRUE}}
1391d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose}
1401d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
1411d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
1421d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// Wraparound with mixed types. Note that the analyzer assumes
1431d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// -fwrapv semantics.
1441d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rosevoid mixedWraparoundSanityCheck(int a) {
1451d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int max = INT_MAX;
1461d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int min = INT_MIN;
1471d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
1481d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int b = a + 1;
14943d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a == max && b != min); // expected-warning{{FALSE}}
1501d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose}
1511d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
15243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid mixedWraparoundLE_GT(int a) {
1531d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int max = INT_MAX;
1541d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int min = INT_MIN;
1551d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
15643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a + 2) <= (max + 1LL)); // expected-warning{{TRUE}}
15743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a - 2) > (min - 1LL)); // expected-warning{{TRUE}}
15843d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a + 2LL) <= max); // expected-warning{{UNKNOWN}}
1591d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose}
1601d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
16143d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid mixedWraparoundGE_LT(int a) {
1621d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int max = INT_MAX;
1631d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int min = INT_MIN;
1641d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
16543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a + 2) < (max + 1LL)); // expected-warning{{TRUE}}
16643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a - 2) >= (min - 1LL)); // expected-warning{{TRUE}}
16743d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a - 2LL) >= min); // expected-warning{{UNKNOWN}}
1681d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose}
1691d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
17043d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rosevoid mixedWraparoundEQ_NE(int a) {
1711d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int max = INT_MAX;
1721d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
17343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a + 2) != (max + 1LL)); // expected-warning{{TRUE}}
17443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval((a + 2LL) == (max + 1LL)); // expected-warning{{UNKNOWN}}
1751d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose}
1761d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
1771d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
1781d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose// Mixed-signedness comparisons.
1791d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rosevoid mixedSignedness(int a, unsigned b) {
1801d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  int sMin = INT_MIN;
1811d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  unsigned uMin = INT_MIN;
18243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
18343d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(a == sMin && a != uMin); // expected-warning{{FALSE}}
18443d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(b == uMin && b != sMin); // expected-warning{{FALSE}}
1851d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose}
1861d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
1874708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rosevoid mixedSignedness2(int a) {
1884708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose  if (a != -1)
1894708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose    return;
1904708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose  clang_analyzer_eval(a == UINT_MAX); // expected-warning{{TRUE}}
1914708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose}
1924708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose
1934708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rosevoid mixedSignedness3(unsigned a) {
1944708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose  if (a != UINT_MAX)
1954708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose    return;
1964708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose  clang_analyzer_eval(a == -1); // expected-warning{{TRUE}}
1974708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose}
1984708b3dde86b06f40927ae9cf30a2de83949a8f2Jordan Rose
1991d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose
2001d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rosevoid multiplicativeSanityTest(int x) {
2011d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  // At one point we were ignoring the *4 completely -- the constraint manager
20243d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  // would see x < 8 and then declare the assertion to be known false.
2031d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose  if (x*4 < 8)
2041d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose    return;
20543d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose
20643d9f0d4e9b88dcab473a359a7b5579c2a619b22Jordy Rose  clang_analyzer_eval(x == 3); // expected-warning{{UNKNOWN}}
2071d8db493f86761df9470254a2ad572fc6abf1bf6Jordy Rose}
208