[INSTRUCTIONS]

You are a program-analysis assistant. Your task is to statically analyze the control dependence of a given code snippet. 

## 1. Control Dependence Definition
  Control dependence captures the influence of control-flow decisions on the execution of statements.

  A statement `S2` is control-dependent on `S1` if there is a **transitive** (indirect) chain of **direct** control dependencies from `S1` to `S2`. This is equivalent to saying that `S1` has control dependence over `S2`, meaning `S1`’s condition influences whether `S2` executes.


  **Direct Control Dependence**:
  A statement `S2` is **directly** control-dependent on a statement `S1` if:
  
  1.	`S1` is a conditional control statement (e.g., an `if`, `while`, `for`, `switch`, etc.).
  
  2.	`S1` directly determines whether `S2` executes. That is, `S1` has multiple successor branches, 

  - there exists **at least one branch** in which `S2` **always executes**, and
  - there exists **at least one other branch** in which `S2` does **not necessarily execute**.

    “Not necessarily execute” means that `S2` might execute or might not, but it is **not guaranteed** to execute in that branch.

  `S2` is **control-dependent** on `S1` if there exists a **transitive chain** of control dependencies from `S1` to `S2`, where each intermediate step in the chain represents a **direct** control dependence between two statements.



## 2. Output Format
When asked, "Which lines have control dependence over `targetLine`? List all such lines." You should respond in JSON format as follows:
```json
{
  "ControlDependenceSources": [S1, ..., S2]
}
```
  
If you believe there is no line that has control dependence over `targetLine`, respond:
```json
{
  "ControlDependenceSources": []
}
```


    

## 3. Interprocedural Control Dependence
  All dependence analysis is performed within **a single function**. We do not track dependencies across function boundaries. The analysis only applies to variables and control structures inside the **specified function**.


## 4. Example Code Snippet

### Example 1

```python
1  if x > 0:
2      y = 10       # this line is directly control-dependent on line 1 (x>0)
3      if y > 5:
4          z = 20   # this line is directly control-dependent on line 3 (y>5)
5          w = 30   # this line is directly control-dependent on line 3 (y>5)
6  v = 40           # this line is NOT control-dependent on any line
```


**Analysis**:
- Line 2 is directly control-dependent on line 1 (`x>0`)
- Lines 4 and 5 are directly control-dependent on line 3 (`y>5`).
- Lines 4 and 5 are **indirectly** control-dependent on line 1 (`x>0`) becasue even if line 1 (`x>0`) is `true`, lines 4 and 5 may not execute if line 3’s condition (`y>5`) is `false`. However, since control dependence is transitive, lines 4 and 5 are **indirectly** control-dependent on line 1. 
- Line 6 is not control-dependent on any lines because Line 6 always executes, regardless of whether line 1 (`x>0`) or line 3 (`y>5`) is true or false.



#### Example Question 1.1: 
Which lines have control dependence over line `5`? List all such lines.


**Output**: 
```json
{
  "ControlDependenceSources": [1, 3]
}
```

#### Example Question 1.2:
Which lines have control dependence over line `6`? List all such lines.

**Output**: 
```json
{
  "ControlDependenceSources": []
}
```


### Example 2

```python
1  count = 0
2  if count < 5:
3      count += 1
4  print("Step 1 done")
5  while count < 10:
6      if count == 7:
7          break
8      if count % 2 == 0:
9          continue
10     count += 2
11     if count > 9:
12         count = 9
13     print("Iteration done")
14 print("End of program")
```

#### Example Question 2.1: 
Which lines have control dependence over line `13`? List all such lines.

**Analysis**:
  - Line 13 is directly control-dependent on line 8 because if line 8 evaluates to `true`, continue skips line 13 for that iteration.
  - Line 8 is directly control-dependent on line 6 because if line 6 evaluates to `true`, the break statement terminates the loop, preventing line 8 from executing.
  - Line 6 is directly control-dependent on line 5 because the loop condition at line 5 determines whether line 6 executes. If line 5 evaluates to `false`, execution skips the loop entirely.


**Output**:
```json
{
  "ControlDependenceSources": [5, 6, 8]
}
```

#### Example Question 2.2: 
Which lines have control dependence over line `10`? List all such lines.


**Analysis**: Similar to the explanation above, line 8 is an `if` condition inside the `while` loop with a `continue`, so it can make the execution skip the rest of the loop entirely, including line 10. 



**Output**:
```json
{
  "ControlDependenceSources": [5, 6, 8]
}
```


#### Example Question 2.3: 
Which lines have control dependence over line `14`? List all such lines.

**Analysis**: Line 14 is outside the while loop (lines 5 -- 13) and will be executed regardless of the condition. 

**Output**:
```json
{
  "ControlDependenceSources": []
}
```


#### Example Question 2.4: 
Which lines have control dependence over line `12`? List all such lines.

**Analysis**: Line 2 doesn't affect whether line 12 is reached. The condition in line 2 only controls whether line 3 is executed. Line 12 is in while loop (line 5 -- 13) and will or will not be executed regardless of the condition in line 2. 

**Output**:
```json
{
  "ControlDependenceSources": [5, 6, 8, 11]
}
```

---

[YOUR TURN]

Below is **your target snippet**. 

```Java
1   import java.io.*;
2   import java.util.*;
3   import javax.net.ssl.SSLContext;
4   public class Main {
5   	final boolean isDebug = false;
6   	String fileName = "input.txt";
7   	FastScanner sc;	
8   	void solve(){
9   		final int INF = Integer.MAX_VALUE / 2;
10  		final int MOD = 1000000007;
11  		String S = sc.next();
12  		int[] sumA = new int[S.length()+1];
13  		int[] sumC = new int[S.length()+1];
14  		int[] sumQ = new int[S.length()+1];
15  		long[] pow3 = new long[S.length()+1];
16  		pow3[0] = 1;
17  		for(int i = 1; i <= S.length(); i++){
18  			pow3[i] = pow3[i-1] * 3;
19  			pow3[i] %= MOD;
20  		}
21  		for(int i = 1; i <= S.length(); i++){
22  			sumA[i] = sumA[i-1];
23  			sumC[i] = sumC[i-1];
24  			sumQ[i] = sumQ[i-1];
25  			if(S.charAt(i-1) == 'A') 
26  				sumA[i]++;
27  			if(S.charAt(i-1) == 'C') 
28  				sumC[i]++;
29  			if(S.charAt(i-1) == '?') 
30  				sumQ[i]++;
31  		}
32  		long ans = 0;
33  		for(int i = 2; i <= S.length()-1; i++){
34  			if(S.charAt(i-1) == 'B'){
35  				long add;
36  				add = (sumA[i-1] - sumA[0]);
37  				add *= (sumC[S.length()] - sumC[i]);
38  				add %= MOD;
39  				add *= pow3[sumQ[S.length()]];
40  				add %= MOD;
41  				ans += add;
42  				ans %= MOD;
43  				if(sumQ[S.length()] >= 1){
44  					add = (sumA[i-1] - sumA[0]);
45  					add *= (sumQ[S.length()] - sumQ[i]);
46  					add %= MOD;
47  					add *= pow3[sumQ[S.length()] - 1];
48  					add %= MOD;
49  					ans += add;
50  					ans %= MOD;
51  					add = (sumQ[i-1] - sumQ[0]);
52  					add *= sumC[S.length()] - sumC[i];
53  					add %= MOD;
54  					add *= pow3[sumQ[S.length()] - 1];
55  					add %= MOD;
56  					ans += add;
57  					ans %= MOD;
58  				}
59  				if(sumQ[S.length()] >= 2){
60  					add = (sumQ[i-1] - sumQ[0]);
61  					add *= (sumQ[S.length()] - sumQ[i]);
62  					add %= MOD;
63  					add *= pow3[sumQ[S.length()] - 2];
64  					add %= MOD;
65  					ans += add;
66  					ans %= MOD;
67  				}
68  			}
69  			if(S.charAt(i-1) == '?'){
70  				long add;
71  				add = (sumA[i-1] - sumA[0]);
72  				add *= (sumC[S.length()] - sumC[i]);
73  				add %= MOD;
74  				add *= pow3[sumQ[S.length()] - 1];
75  				add %= MOD;
76  				ans += add;
77  				ans %= MOD;
78  				if(sumQ[S.length()] >= 2){
79  					add = (sumA[i-1] - sumA[0]);
80  					add *= (sumQ[S.length()] - sumQ[i]);
81  					add %= MOD;
82  					add *= pow3[sumQ[S.length()] - 2];
83  					add %= MOD;
84  					ans += add;
85  					ans %= MOD;
86  					add = (sumQ[i-1] - sumQ[0]);
87  					add *= (sumC[S.length()] - sumC[i]);
88  					add %= MOD;
89  					add *= pow3[sumQ[S.length()] - 2];
90  					add %= MOD;
91  					ans += add;
92  					ans %= MOD;
93  				}
94  				if(sumQ[S.length()] >= 3){
95  					add = (sumQ[i-1] - sumQ[0]);
96  					add *= (sumQ[S.length()] - sumQ[i]);
97  					add %= MOD;
98  					add *= pow3[sumQ[S.length()] - 3];
99  					add %= MOD;
100  					ans += add;
101  					ans %= MOD;
102  				}
103  			}
104  		}
105  		System.out.println(ans);
106  	}
107  	public static void main(String[] args) throws IOException {
108  		new Main().m();
109  	}
110  	void m() throws IOException {
111  		long S = System.currentTimeMillis();
112  		sc = (isDebug) ? new FastScanner(new FileInputStream(fileName)) : new FastScanner(System.in);
113  		solve();
114  		long G = System.currentTimeMillis();
115  		if(isDebug){
116  			System.out.println("---Debug---");
117  			System.out.printf("%8d ms", (G-S));
118  		}
119  	}
120  }
121  class FastScanner {
122      private InputStream in;
123      private final byte[] buffer = new byte[1024];
124      private int ptr = 0;
125      private int buflen = 0;
126      public FastScanner(InputStream in) {
127  		this.in = in;
128  	}
129      private boolean hasNextByte() {
130          if (ptr < buflen) {
131              return true;
132          }else{
133              ptr = 0;
134              try {
135                  buflen = in.read(buffer);
136              } catch (IOException e) {
137                  e.printStackTrace();
138              }
139              if (buflen <= 0) {
140                  return false;
141              }
142          }
143          return true;
144      }
145      private int readByte() {
146      	if (hasNextByte()) return buffer[ptr++];
147      	else return -1;
148      }
149      private static boolean isPrintableChar(int c){
150      	return 33 <= c && c <= 126;
151      }
152      public boolean hasNext() {
153      	while(hasNextByte() && !isPrintableChar(buffer[ptr]))
154      		ptr++; return hasNextByte();
155      }
156      public String next() {
157          if (!hasNext()) throw new NoSuchElementException();
158          StringBuilder sb = new StringBuilder();
159          int b = readByte();
160          while(isPrintableChar(b)) {
161              sb.appendCodePoint(b);
162              b = readByte();
163          }
164          return sb.toString();
165      }
166      public long nextLong() {
167          if (!hasNext()) throw new NoSuchElementException();
168          long n = 0;
169          boolean minus = false;
170          int b = readByte();
171          if (b == '-') {
172              minus = true;
173              b = readByte();
174          }
175          if (b < '0' || '9' < b) {
176              throw new NumberFormatException();
177          }
178          while(true){
179              if ('0' <= b && b <= '9') {
180                  n *= 10;
181                  n += b - '0';
182              }else if(b == -1 || !isPrintableChar(b)){
183                  return minus ? -n : n;
184              }else{
185                  throw new NumberFormatException();
186              }
187              b = readByte();
188          }
189      }
190      public int nextInt() {
191          long nl = nextLong();
192          if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE) throw new NumberFormatException();
193          return (int) nl;
194      }
195      public double nextDouble() {
196      	return Double.parseDouble(next());
197      }
198  }
```


**Question**: Which lines have control dependence over line `28` in function `solve`? List all such lines.

**Output**:


Ground truth answer: yes