Files @ r28800:381a234fb097
Branch filter:

Location: cpp/openttd-patchpack/source/src/train_cmd.cpp - annotation

translators
Update: Translations from eints
english (au): 2 changes by krysclarke
spanish (mexican): 149 changes by Can202
estonian: 11 changes by RM87
chinese (simplified): 18 changes by WenSimEHRP
hungarian: 2 changes by PstasDev
italian: 195 changes by Rivarossi
serbian: 42 changes by nkrs
german: 2 changes by Wuzzy2
belarusian: 537 changes by KorneySan
russian: 25 changes by KorneySan
ukrainian: 21 changes by StepanIvasyn
turkish: 14 changes by jnmbk
latvian: 2 changes by lexuslatvia
dutch: 1 change by iamthedutchdude
spanish: 15 changes by MontyMontana
french: 2 changes by ottdfevr
portuguese: 2 changes by jcteotonio, 2 changes by azulcosta
portuguese (brazilian): 149 changes by pasantoro
polish: 2 changes by pAter-exe
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r9111:983de9c5a848
r6422:5983361e241a
r5584:545d748cc681
r18617:524f2e0f54dc
r6772:59235ded8522
r8116:df67d3c5e4fd
r27160:192bc991c2e6
r13832:e17769fa4653
r13880:8eaaf85d49ac
r8763:c2c776621d56
r10208:ef8fcc3dc4ca
r5584:545d748cc681
r5584:545d748cc681
r8114:866ed489ed98
r17267:4f82ca9bd495
r8144:1432edd15267
r8157:cf41aa22cd09
r10696:8dfe83e30d01
r18764:f6e8611401f3
r9003:0b0148ae8377
r9009:e21a5dd1e60e
r9704:108fa337b182
r13589:d06fa116bfaa
r14248:a9050881acd7
r14248:a9050881acd7
r14248:a9050881acd7
r15855:2be9e0211a54
r18462:a1ba75a7f741
r20900:da7545c40d2d
r22959:8c769e762c2f
r26094:7572e88decb3
r26103:316b73a1be08
r27148:4e041ae27b9d
r28549:6bc33bc6ee38
r8083:8cd2123a0c7c
r8264:d493cb51fe8a
r26094:7572e88decb3
r5584:545d748cc681
r21383:942c32fb8b0e
r21383:942c32fb8b0e
r11980:193f7a6b6e37
r18436:92d461597905
r18436:92d461597905
r11980:193f7a6b6e37
r11980:193f7a6b6e37
r11980:193f7a6b6e37
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8248:31bcf1e2c22d
r21050:ac153d7f94aa
r27737:728d55b97775
r21050:ac153d7f94aa
r21050:ac153d7f94aa
r21050:ac153d7f94aa
r8248:31bcf1e2c22d
r5584:545d748cc681
r15610:623a23fb6560
r15610:623a23fb6560
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r12405:ba094e765533
r9413:fcf267325763
r5584:545d748cc681
r5584:545d748cc681
r9704:108fa337b182
r9704:108fa337b182
r9704:108fa337b182
r17155:63089d30d676
r12030:bf346482c342
r23966:9de0a0960701
r12030:bf346482c342
r23607:36c15679007d
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r24597:afde5721a3b6
r11981:3840cc07cbe4
r9704:108fa337b182
r9704:108fa337b182
r14635:a75264d517b7
r9705:bfaea820fe12
r17155:63089d30d676
r17155:63089d30d676
r26120:15c912177c88
r17155:63089d30d676
r17155:63089d30d676
r17155:63089d30d676
r9704:108fa337b182
r9704:108fa337b182
r9704:108fa337b182
r9704:108fa337b182
r9704:108fa337b182
r9704:108fa337b182
r9704:108fa337b182
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r21229:bf509b0caedd
r5584:545d748cc681
r21229:bf509b0caedd
r5584:545d748cc681
r27737:728d55b97775
r5584:545d748cc681
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r16778:660bd976d69f
r14251:3ca1b5f41119
r5584:545d748cc681
r8178:9f66f991c0bb
r25889:095192372b19
r8178:9f66f991c0bb
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r5584:545d748cc681
r6422:5983361e241a
r16778:660bd976d69f
r11981:3840cc07cbe4
r5584:545d748cc681
r12292:c3b6baef441a
r9515:30fe0a2a833b
r9037:fae0319750ef
r11982:ff4390b32b95
r14251:3ca1b5f41119
r12068:a96f28ffc328
r9037:fae0319750ef
r9037:fae0319750ef
r23607:36c15679007d
r9037:fae0319750ef
r13104:9e66a110a842
r14251:3ca1b5f41119
r12068:a96f28ffc328
r9037:fae0319750ef
r9037:fae0319750ef
r23607:36c15679007d
r18228:6cd8bae37157
r11188:143f3c64befd
r9037:fae0319750ef
r13208:40382e8abf19
r25889:095192372b19
r9037:fae0319750ef
r23607:36c15679007d
r16778:660bd976d69f
r6603:ea06f95493ee
r20956:2fe2ffecaf60
r20956:2fe2ffecaf60
r20956:2fe2ffecaf60
r15815:ae5db3adff4c
r15816:67664bff2b7d
r9738:3eba7cc44bca
r9738:3eba7cc44bca
r16497:18c88c97153f
r9738:3eba7cc44bca
r11981:3840cc07cbe4
r9738:3eba7cc44bca
r11981:3840cc07cbe4
r9738:3eba7cc44bca
r9738:3eba7cc44bca
r12292:c3b6baef441a
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r14251:3ca1b5f41119
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r6422:5983361e241a
r9413:fcf267325763
r27737:728d55b97775
r24597:afde5721a3b6
r6490:ba88f1f6bfd1
r5584:545d748cc681
r5584:545d748cc681
r27737:728d55b97775
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r24597:afde5721a3b6
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r17899:92aaab03ad72
r6608:f2d13a751f0b
r6422:5983361e241a
r27737:728d55b97775
r23607:36c15679007d
r18304:4a661ee8ffe5
r18304:4a661ee8ffe5
r19758:0924962fbd17
r19758:0924962fbd17
r19758:0924962fbd17
r19758:0924962fbd17
r18304:4a661ee8ffe5
r18304:4a661ee8ffe5
r7215:b3433b9d5b54
r18304:4a661ee8ffe5
r5584:545d748cc681
r17441:1a320fa88183
r9704:108fa337b182
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r21229:bf509b0caedd
r16778:660bd976d69f
r16778:660bd976d69f
r14251:3ca1b5f41119
r12068:a96f28ffc328
r6150:4dff209c790c
r5584:545d748cc681
r6422:5983361e241a
r16371:f5faec1bbc26
r14251:3ca1b5f41119
r25889:095192372b19
r14251:3ca1b5f41119
r5584:545d748cc681
r6422:5983361e241a
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r19878:34102534d9f9
r19879:0ab70bc92809
r20900:da7545c40d2d
r8706:7a24f8b401f5
r5584:545d748cc681
r5584:545d748cc681
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11980:193f7a6b6e37
r11652:5c73940aeb94
r11917:612c11f7ab47
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r16778:660bd976d69f
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r16778:660bd976d69f
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r16778:660bd976d69f
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r15810:0e843b449a0a
r18436:92d461597905
r18436:92d461597905
r11652:5c73940aeb94
r11652:5c73940aeb94
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r14251:3ca1b5f41119
r5584:545d748cc681
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r8850:e9956f61a4e6
r8169:954f67fb52e7
r12080:8115dddfc1a2
r14396:0e22f6ee524f
r12080:8115dddfc1a2
r6150:4dff209c790c
r6150:4dff209c790c
r11363:6906c490a00e
r6150:4dff209c790c
r6150:4dff209c790c
r5584:545d748cc681
r5584:545d748cc681
r23607:36c15679007d
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r8175:5802c40d8c55
r18054:dfa75002e456
r8175:5802c40d8c55
r5584:545d748cc681
r5584:545d748cc681
r8175:5802c40d8c55
r5584:545d748cc681
r5584:545d748cc681
r11363:6906c490a00e
r8175:5802c40d8c55
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r12080:8115dddfc1a2
r5584:545d748cc681
r8169:954f67fb52e7
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r7922:d7c3cc15726d
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8169:954f67fb52e7
r24566:ab91c5ea2c74
r27896:3f48fccebe5f
r8169:954f67fb52e7
r8178:9f66f991c0bb
r14251:3ca1b5f41119
r8178:9f66f991c0bb
r8178:9f66f991c0bb
r8178:9f66f991c0bb
r25889:095192372b19
r25889:095192372b19
r25889:095192372b19
r25890:31b085404537
r25889:095192372b19
r8169:954f67fb52e7
r5584:545d748cc681
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r14276:fe74de3c3311
r14276:fe74de3c3311
r14276:fe74de3c3311
r14276:fe74de3c3311
r14276:fe74de3c3311
r12080:8115dddfc1a2
r20182:023b50bd4833
r20182:023b50bd4833
r20182:023b50bd4833
r20182:023b50bd4833
r20182:023b50bd4833
r14276:fe74de3c3311
r14276:fe74de3c3311
r11652:5c73940aeb94
r11652:5c73940aeb94
r14276:fe74de3c3311
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11672:52d351517da4
r11672:52d351517da4
r11672:52d351517da4
r11672:52d351517da4
r14276:fe74de3c3311
r15054:f3d17610dc8b
r14276:fe74de3c3311
r11672:52d351517da4
r11672:52d351517da4
r24597:afde5721a3b6
r24597:afde5721a3b6
r8170:2f75569b3a80
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r23607:36c15679007d
r20182:023b50bd4833
r24597:afde5721a3b6
r14276:fe74de3c3311
r5584:545d748cc681
r19877:785cbea635d7
r19877:785cbea635d7
r19877:785cbea635d7
r24597:afde5721a3b6
r19877:785cbea635d7
r5584:545d748cc681
r5584:545d748cc681
r24597:afde5721a3b6
r24597:afde5721a3b6
r14276:fe74de3c3311
r14276:fe74de3c3311
r18845:66bf168f1100
r14251:3ca1b5f41119
r5584:545d748cc681
r20660:5782cd63ef4b
r14251:3ca1b5f41119
r16775:3ed9b708bc5a
r16775:3ed9b708bc5a
r5584:545d748cc681
r14251:3ca1b5f41119
r5584:545d748cc681
r5584:545d748cc681
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r12423:199e8b46a11b
r12423:199e8b46a11b
r23607:36c15679007d
r12423:199e8b46a11b
r12423:199e8b46a11b
r12423:199e8b46a11b
r12423:199e8b46a11b
r12423:199e8b46a11b
r12423:199e8b46a11b
r12423:199e8b46a11b
r18228:6cd8bae37157
r23607:36c15679007d
r18229:a35410711978
r18229:a35410711978
r12423:199e8b46a11b
r12423:199e8b46a11b
r23607:36c15679007d
r26672:e217fb99c0ac
r28101:7e6c6e389710
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26579:321856031c47
r12423:199e8b46a11b
r26579:321856031c47
r12423:199e8b46a11b
r12423:199e8b46a11b
r27737:728d55b97775
r12015:489eee6f86b7
r21050:ac153d7f94aa
r12015:489eee6f86b7
r12015:489eee6f86b7
r12015:489eee6f86b7
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r22459:c1921e75ce89
r5584:545d748cc681
r27737:728d55b97775
r5584:545d748cc681
r11981:3840cc07cbe4
r5584:545d748cc681
r9022:5be8b7703ae9
r22459:c1921e75ce89
r22459:c1921e75ce89
r9022:5be8b7703ae9
r18228:6cd8bae37157
r5584:545d748cc681
r5584:545d748cc681
r21050:ac153d7f94aa
r22459:c1921e75ce89
r9022:5be8b7703ae9
r20188:c7660e0c9b5b
r9022:5be8b7703ae9
r22459:c1921e75ce89
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r22459:c1921e75ce89
r9022:5be8b7703ae9
r12423:199e8b46a11b
r9022:5be8b7703ae9
r27737:728d55b97775
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r22459:c1921e75ce89
r22459:c1921e75ce89
r23607:36c15679007d
r26579:321856031c47
r12423:199e8b46a11b
r22459:c1921e75ce89
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r12159:d9511457307a
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r22459:c1921e75ce89
r5584:545d748cc681
r5584:545d748cc681
r18234:0d83ef81cba4
r5584:545d748cc681
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r9022:5be8b7703ae9
r22459:c1921e75ce89
r22459:c1921e75ce89
r22459:c1921e75ce89
r22459:c1921e75ce89
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r13589:d06fa116bfaa
r21979:8f441a1deb2a
r26579:321856031c47
r26579:321856031c47
r26579:321856031c47
r26579:321856031c47
r26579:321856031c47
r9022:5be8b7703ae9
r22459:c1921e75ce89
r22459:c1921e75ce89
r22459:c1921e75ce89
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r21979:8f441a1deb2a
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r15839:2b7528d029e3
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r22459:c1921e75ce89
r22459:c1921e75ce89
r22459:c1921e75ce89
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r26546:de367f04dbcc
r26546:de367f04dbcc
r22460:68e4922ff4a3
r22460:68e4922ff4a3
r19884:a1593074c6b8
r19884:a1593074c6b8
r22459:c1921e75ce89
r22460:68e4922ff4a3
r19884:a1593074c6b8
r19884:a1593074c6b8
r26579:321856031c47
r26546:de367f04dbcc
r26579:321856031c47
r24597:afde5721a3b6
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r19884:a1593074c6b8
r15839:2b7528d029e3
r26095:00c14d52e378
r15839:2b7528d029e3
r15839:2b7528d029e3
r23023:7b8669afd1db
r15839:2b7528d029e3
r15839:2b7528d029e3
r26095:00c14d52e378
r5584:545d748cc681
r11188:143f3c64befd
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r11980:193f7a6b6e37
r15839:2b7528d029e3
r11897:7e0b37f90451
r11897:7e0b37f90451
r15839:2b7528d029e3
r16778:660bd976d69f
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r27056:ac04ccbeb86c
r10930:4cbf235f5299
r11981:3840cc07cbe4
r10930:4cbf235f5299
r10930:4cbf235f5299
r12293:15e6328523ce
r10930:4cbf235f5299
r13924:f0296916bae7
r13924:f0296916bae7
r10930:4cbf235f5299
r11188:143f3c64befd
r28672:8ec1f5f8a9d1
r10930:4cbf235f5299
r20252:76a6f1c78ce7
r10930:4cbf235f5299
r11981:3840cc07cbe4
r10930:4cbf235f5299
r28549:6bc33bc6ee38
r27769:ebc238ecee04
r27148:4e041ae27b9d
r24570:4fa1d23595bf
r27231:22301bb798c3
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r28209:28b839eace1a
r13209:e62009d81509
r10930:4cbf235f5299
r21720:231348c28655
r21229:bf509b0caedd
r10930:4cbf235f5299
r10930:4cbf235f5299
r11346:032b1fd8218f
r13924:f0296916bae7
r13924:f0296916bae7
r23966:9de0a0960701
r14096:99a90cb9f557
r14096:99a90cb9f557
r15839:2b7528d029e3
r14096:99a90cb9f557
r14096:99a90cb9f557
r26111:5721922c714f
r24643:778be06d0ea7
r24643:778be06d0ea7
r13924:f0296916bae7
r13924:f0296916bae7
r5584:545d748cc681
r5584:545d748cc681
r15839:2b7528d029e3
r5584:545d748cc681
r5584:545d748cc681
r6422:5983361e241a
r27500:388bb166f1ec
r5584:545d748cc681
r28191:5fe4d4ffc726
r23966:9de0a0960701
r12291:690f4158878e
r12030:bf346482c342
r26111:5721922c714f
r5584:545d748cc681
r26090:5a592dbf1c28
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11980:193f7a6b6e37
r5584:545d748cc681
r11980:193f7a6b6e37
r11897:7e0b37f90451
r11897:7e0b37f90451
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r20252:76a6f1c78ce7
r11981:3840cc07cbe4
r5584:545d748cc681
r22385:243f05b43a0e
r27769:ebc238ecee04
r5584:545d748cc681
r24570:4fa1d23595bf
r27231:22301bb798c3
r12293:15e6328523ce
r12293:15e6328523ce
r11897:7e0b37f90451
r28209:28b839eace1a
r21720:231348c28655
r11897:7e0b37f90451
r11897:7e0b37f90451
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r15610:623a23fb6560
r15610:623a23fb6560
r26095:00c14d52e378
r15839:2b7528d029e3
r15839:2b7528d029e3
r23023:7b8669afd1db
r15839:2b7528d029e3
r5584:545d748cc681
r27500:388bb166f1ec
r5584:545d748cc681
r13208:40382e8abf19
r15839:2b7528d029e3
r26095:00c14d52e378
r5584:545d748cc681
r10930:4cbf235f5299
r15810:0e843b449a0a
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r11980:193f7a6b6e37
r15839:2b7528d029e3
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r27056:ac04ccbeb86c
r11981:3840cc07cbe4
r10930:4cbf235f5299
r10930:4cbf235f5299
r11188:143f3c64befd
r28672:8ec1f5f8a9d1
r10930:4cbf235f5299
r20252:76a6f1c78ce7
r10930:4cbf235f5299
r20252:76a6f1c78ce7
r10930:4cbf235f5299
r15839:2b7528d029e3
r16778:660bd976d69f
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r12160:b49804528c72
r10930:4cbf235f5299
r11981:3840cc07cbe4
r10930:4cbf235f5299
r20037:2761c8d9b8cc
r28549:6bc33bc6ee38
r27769:ebc238ecee04
r27148:4e041ae27b9d
r24570:4fa1d23595bf
r27231:22301bb798c3
r10930:4cbf235f5299
r10930:4cbf235f5299
r20041:fec94c55536d
r10930:4cbf235f5299
r10930:4cbf235f5299
r10930:4cbf235f5299
r12293:15e6328523ce
r12293:15e6328523ce
r10930:4cbf235f5299
r28209:28b839eace1a
r21720:231348c28655
r10930:4cbf235f5299
r10930:4cbf235f5299
r11897:7e0b37f90451
r10930:4cbf235f5299
r13209:e62009d81509
r8850:e9956f61a4e6
r5584:545d748cc681
r21229:bf509b0caedd
r10930:4cbf235f5299
r10930:4cbf235f5299
r11346:032b1fd8218f
r5584:545d748cc681
r5584:545d748cc681
r15839:2b7528d029e3
r5584:545d748cc681
r5584:545d748cc681
r11980:193f7a6b6e37
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r23966:9de0a0960701
r12292:c3b6baef441a
r6422:5983361e241a
r12029:5b077ec055c0
r12029:5b077ec055c0
r12029:5b077ec055c0
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r13928:43895803afbb
r23538:8df50944b27a
r13928:43895803afbb
r13914:b8090775f21f
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13914:b8090775f21f
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r28025:9116d6e411b0
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r23536:ce42deb0b32d
r23607:36c15679007d
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r14992:2648a73e4ab8
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13914:b8090775f21f
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13914:b8090775f21f
r13914:b8090775f21f
r13914:b8090775f21f
r13916:4c45398671ea
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r15810:0e843b449a0a
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23023:7b8669afd1db
r23023:7b8669afd1db
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r15810:0e843b449a0a
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r23607:36c15679007d
r23607:36c15679007d
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13916:4c45398671ea
r13916:4c45398671ea
r13928:43895803afbb
r13916:4c45398671ea
r13928:43895803afbb
r24643:778be06d0ea7
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r17211:a78e3d82def6
r13928:43895803afbb
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r24643:778be06d0ea7
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r17211:a78e3d82def6
r17211:a78e3d82def6
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r16778:660bd976d69f
r16778:660bd976d69f
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r27737:728d55b97775
r13928:43895803afbb
r13928:43895803afbb
r16778:660bd976d69f
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r18885:0002211deabb
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18325:d519e99a68a7
r18325:d519e99a68a7
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r18296:89d34cbdf3a3
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13916:4c45398671ea
r13916:4c45398671ea
r17211:a78e3d82def6
r13916:4c45398671ea
r13916:4c45398671ea
r13916:4c45398671ea
r13917:8841d76029cd
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23023:7b8669afd1db
r23023:7b8669afd1db
r15889:68e9eadf2026
r13917:8841d76029cd
r13917:8841d76029cd
r15889:68e9eadf2026
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r15889:68e9eadf2026
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13917:8841d76029cd
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13917:8841d76029cd
r13917:8841d76029cd
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r21229:bf509b0caedd
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r19878:34102534d9f9
r18682:0cc315a3a76a
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13917:8841d76029cd
r13917:8841d76029cd
r15610:623a23fb6560
r15610:623a23fb6560
r6422:5983361e241a
r9928:94206085695f
r26111:5721922c714f
r26111:5721922c714f
r26111:5721922c714f
r13057:58af81fcdcf8
r5584:545d748cc681
r26111:5721922c714f
r5584:545d748cc681
r26111:5721922c714f
r23607:36c15679007d
r14805:8c416234ced2
r14805:8c416234ced2
r14805:8c416234ced2
r5584:545d748cc681
r7696:5fa7dffd9aac
r12084:850e45fd8022
r7696:5fa7dffd9aac
r6422:5983361e241a
r11980:193f7a6b6e37
r26111:5721922c714f
r25506:3ffe99626780
r5584:545d748cc681
r26111:5721922c714f
r23607:36c15679007d
r14805:8c416234ced2
r26829:f1ebd010c392
r14805:8c416234ced2
r7696:5fa7dffd9aac
r7696:5fa7dffd9aac
r12084:850e45fd8022
r5584:545d748cc681
r5584:545d748cc681
r6422:5983361e241a
r12440:97b7db79722d
r23607:36c15679007d
r12440:97b7db79722d
r5584:545d748cc681
r5584:545d748cc681
r6422:5983361e241a
r6950:1a54b1afb12a
r5584:545d748cc681
r5584:545d748cc681
r11980:193f7a6b6e37
r11980:193f7a6b6e37
r23607:36c15679007d
r7497:84fb92567fc7
r6136:777f936d37dd
r6422:5983361e241a
r12296:564aa4953d26
r6136:777f936d37dd
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r12292:c3b6baef441a
r5584:545d748cc681
r13931:73929fdd9a3d
r13916:4c45398671ea
r5584:545d748cc681
r13931:73929fdd9a3d
r23607:36c15679007d
r13931:73929fdd9a3d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r23607:36c15679007d
r13928:43895803afbb
r21046:0a596385d40c
r23607:36c15679007d
r23607:36c15679007d
r21046:0a596385d40c
r23607:36c15679007d
r18149:d084e89bff7d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r9928:94206085695f
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r26829:f1ebd010c392
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r18822:e803baaa3dc8
r18822:e803baaa3dc8
r18822:e803baaa3dc8
r18822:e803baaa3dc8
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r16339:e90c1dadabf0
r16339:e90c1dadabf0
r13928:43895803afbb
r13928:43895803afbb
r16339:e90c1dadabf0
r16339:e90c1dadabf0
r13928:43895803afbb
r16471:88811d64cd3a
r16339:e90c1dadabf0
r16339:e90c1dadabf0
r13928:43895803afbb
r16339:e90c1dadabf0
r16339:e90c1dadabf0
r13928:43895803afbb
r13928:43895803afbb
r23838:bfeaabaa7b1d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r25565:6a5de7df7ea1
r25565:6a5de7df7ea1
r25565:6a5de7df7ea1
r25565:6a5de7df7ea1
r25565:6a5de7df7ea1
r20900:da7545c40d2d
r18597:b2bc73b2549d
r13928:43895803afbb
r27312:a042c56389f6
r27312:a042c56389f6
r27312:a042c56389f6
r27312:a042c56389f6
r27312:a042c56389f6
r27312:a042c56389f6
r27312:a042c56389f6
r27312:a042c56389f6
r13928:43895803afbb
r13928:43895803afbb
r27560:0fb97a3b3349
r5584:545d748cc681
r5584:545d748cc681
r13932:35674d8bd102
r13932:35674d8bd102
r13932:35674d8bd102
r13932:35674d8bd102
r18597:b2bc73b2549d
r13932:35674d8bd102
r13932:35674d8bd102
r18149:d084e89bff7d
r23607:36c15679007d
r23607:36c15679007d
r18149:d084e89bff7d
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r18824:4a8ec7bae9c5
r18824:4a8ec7bae9c5
r18824:4a8ec7bae9c5
r18824:4a8ec7bae9c5
r18824:4a8ec7bae9c5
r23607:36c15679007d
r23607:36c15679007d
r20706:7de41657684f
r13928:43895803afbb
r13928:43895803afbb
r9297:6cd3e74fc38e
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r13928:43895803afbb
r5584:545d748cc681
r5584:545d748cc681
r6950:1a54b1afb12a
r5584:545d748cc681
r5584:545d748cc681
r15610:623a23fb6560
r15610:623a23fb6560
r6422:5983361e241a
r15840:d15dd78ef53e
r26107:59139eb8d51a
r26107:59139eb8d51a
r26107:59139eb8d51a
r26107:59139eb8d51a
r26107:59139eb8d51a
r15855:2be9e0211a54
r13057:58af81fcdcf8
r5584:545d748cc681
r26107:59139eb8d51a
r5584:545d748cc681
r15840:d15dd78ef53e
r11980:193f7a6b6e37
r5584:545d748cc681
r12292:c3b6baef441a
r5584:545d748cc681
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r23607:36c15679007d
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r23607:36c15679007d
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r23607:36c15679007d
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r5584:545d748cc681
r5584:545d748cc681
r26178:733038a553ce
r22237:4b9f3d9200bb
r22237:4b9f3d9200bb
r22237:4b9f3d9200bb
r22237:4b9f3d9200bb
r22237:4b9f3d9200bb
r8230:33d57fce0ec2
r25518:10899ab79aae
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r27928:312b50d8ddd9
r26107:59139eb8d51a
r15855:2be9e0211a54
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r13930:709cd9aa92c8
r5584:545d748cc681
r13930:709cd9aa92c8
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r22868:6eb08946de7f
r5584:545d748cc681
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r18436:92d461597905
r18436:92d461597905
r21868:9829c8af7712
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r26672:e217fb99c0ac
r18436:92d461597905
r18436:92d461597905
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r26672:e217fb99c0ac
r18436:92d461597905
r26672:e217fb99c0ac
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r26672:e217fb99c0ac
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r26672:e217fb99c0ac
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r26672:e217fb99c0ac
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r26672:e217fb99c0ac
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r11980:193f7a6b6e37
r5584:545d748cc681
r11981:3840cc07cbe4
r15594:ba7e42fbae24
r11981:3840cc07cbe4
r12457:fda18fe9b6c0
r14203:aea88883737e
r9808:90431445db6a
r9808:90431445db6a
r9808:90431445db6a
r9808:90431445db6a
r17162:6666b029cd97
r9808:90431445db6a
r18682:0cc315a3a76a
r9808:90431445db6a
r9808:90431445db6a
r9808:90431445db6a
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r23023:7b8669afd1db
r23023:7b8669afd1db
r18845:66bf168f1100
r27737:728d55b97775
r9808:90431445db6a
r27737:728d55b97775
r27737:728d55b97775
r5584:545d748cc681
r5584:545d748cc681
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r5584:545d748cc681
r5584:545d748cc681
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14758:b9e158cab6dd
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14743:6ee8646cf93f
r14758:b9e158cab6dd
r5584:545d748cc681
r5584:545d748cc681
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r21720:231348c28655
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17132:5e9806613e1e
r17088:28f337664165
r17088:28f337664165
r21720:231348c28655
r17088:28f337664165
r17088:28f337664165
r17088:28f337664165
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18436:92d461597905
r5584:545d748cc681
r11980:193f7a6b6e37
r5584:545d748cc681
r5584:545d748cc681
r7492:75510449064b
r7492:75510449064b
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r27737:728d55b97775
r14668:9a4f7d31f6a2
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r14670:152f69781b86
r5733:ae88d57ddc8e
r5733:ae88d57ddc8e
r5733:ae88d57ddc8e
r5733:ae88d57ddc8e
r5584:545d748cc681
r14743:6ee8646cf93f
r5584:545d748cc681
r17088:28f337664165
r17088:28f337664165
r5584:545d748cc681
r17126:f52a9f37b3f9
r17126:f52a9f37b3f9
r17126:f52a9f37b3f9
r17126:f52a9f37b3f9
r17088:28f337664165
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r23607:36c15679007d
r8334:34423b580a30
r9775:4eaf88c92876
r5584:545d748cc681
r23607:36c15679007d
r8334:34423b580a30
r8334:34423b580a30
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r26903:202146204333
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r23607:36c15679007d
r8334:34423b580a30
r9775:4eaf88c92876
r8334:34423b580a30
r23607:36c15679007d
r12290:442d5d533a57
r12290:442d5d533a57
r23607:36c15679007d
r12290:442d5d533a57
r12290:442d5d533a57
r12290:442d5d533a57
r23607:36c15679007d
r12290:442d5d533a57
r12290:442d5d533a57
r5584:545d748cc681
r5584:545d748cc681
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r10083:2e8288935c09
r8334:34423b580a30
r8334:34423b580a30
r10083:2e8288935c09
r5584:545d748cc681
r8334:34423b580a30
r8334:34423b580a30
r8598:ad76237b6806
r8334:34423b580a30
r8334:34423b580a30
r10083:2e8288935c09
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r10083:2e8288935c09
r8334:34423b580a30
r8334:34423b580a30
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26903:202146204333
r26494:22737b47738b
r8334:34423b580a30
r8334:34423b580a30
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r8334:34423b580a30
r26494:22737b47738b
r8334:34423b580a30
r8334:34423b580a30
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r8344:df24797cd78b
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26787:a51c38e4aac5
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26787:a51c38e4aac5
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r27483:ea724a82d434
r27483:ea724a82d434
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26787:a51c38e4aac5
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r26494:22737b47738b
r8334:34423b580a30
r5584:545d748cc681
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r27483:ea724a82d434
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r26494:22737b47738b
r26494:22737b47738b
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r8356:1852675e132d
r5584:545d748cc681
r8712:6777443c9aa9
r5584:545d748cc681
r5584:545d748cc681
r11980:193f7a6b6e37
r5584:545d748cc681
r11980:193f7a6b6e37
r11980:193f7a6b6e37
r12450:fcc3ae606967
r6150:4dff209c790c
r5584:545d748cc681
r5584:545d748cc681
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r18436:92d461597905
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r11322:36e10b93494e
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r11980:193f7a6b6e37
r8712:6777443c9aa9
r8712:6777443c9aa9
r11980:193f7a6b6e37
r23607:36c15679007d
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r11980:193f7a6b6e37
r8712:6777443c9aa9
r23607:36c15679007d
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r11981:3840cc07cbe4
r23607:36c15679007d
r8712:6777443c9aa9
r8712:6777443c9aa9
r23607:36c15679007d
r8712:6777443c9aa9
r8712:6777443c9aa9
r11980:193f7a6b6e37
r11980:193f7a6b6e37
r12450:fcc3ae606967
r8712:6777443c9aa9
r8712:6777443c9aa9
r15810:0e843b449a0a
r8712:6777443c9aa9
r23607:36c15679007d
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r15810:0e843b449a0a
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r8712:6777443c9aa9
r6150:4dff209c790c
r18436:92d461597905
r8712:6777443c9aa9
r8712:6777443c9aa9
r23607:36c15679007d
r8712:6777443c9aa9
r8712:6777443c9aa9
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r25971:453e1656120b
r25971:453e1656120b
r25971:453e1656120b
r25971:453e1656120b
r25971:453e1656120b
r25971:453e1656120b
r25971:453e1656120b
r25971:453e1656120b
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18436:92d461597905
r5584:545d748cc681
r8961:7da2b7436c69
r25971:453e1656120b
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r12683:2c40e2b81044
r12683:2c40e2b81044
r9819:85cecbdda243
r5584:545d748cc681
r8334:34423b580a30
r5584:545d748cc681
r6422:5983361e241a
r8850:e9956f61a4e6
r5584:545d748cc681
r8712:6777443c9aa9
r5584:545d748cc681
r5584:545d748cc681
r6150:4dff209c790c
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8712:6777443c9aa9
r5584:545d748cc681
r8961:7da2b7436c69
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r8334:34423b580a30
r8667:d4e2c92b7622
r21229:bf509b0caedd
r8667:d4e2c92b7622
r8667:d4e2c92b7622
r23607:36c15679007d
r8667:d4e2c92b7622
r8334:34423b580a30
r8342:c2c539be911f
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8356:1852675e132d
r9819:85cecbdda243
r9819:85cecbdda243
r12132:a38dd864f398
r9973:12f7e05294c5
r18682:0cc315a3a76a
r11981:3840cc07cbe4
r9973:12f7e05294c5
r9973:12f7e05294c5
r9819:85cecbdda243
r22906:1b252dc87a48
r9819:85cecbdda243
r22906:1b252dc87a48
r9819:85cecbdda243
r9819:85cecbdda243
r9819:85cecbdda243
r9819:85cecbdda243
r9819:85cecbdda243
r9819:85cecbdda243
r11971:ac7eb21a00e4
r11981:3840cc07cbe4
r9819:85cecbdda243
r19187:bb7bca831c30
r19187:bb7bca831c30
r19187:bb7bca831c30
r12492:6a787b05475e
r9891:4db9c2615c78
r9819:85cecbdda243
r9819:85cecbdda243
r9891:4db9c2615c78
r9891:4db9c2615c78
r9891:4db9c2615c78
r9819:85cecbdda243
r11981:3840cc07cbe4
r10588:4d31bc47cb7d
r11981:3840cc07cbe4
r14203:aea88883737e
r9819:85cecbdda243
r5584:545d748cc681
r5584:545d748cc681
r15610:623a23fb6560
r15610:623a23fb6560
r6422:5983361e241a
r26111:5721922c714f
r26111:5721922c714f
r13057:58af81fcdcf8
r5584:545d748cc681
r26111:5721922c714f
r5584:545d748cc681
r26111:5721922c714f
r23607:36c15679007d
r14805:8c416234ced2
r14805:8c416234ced2
r14805:8c416234ced2
r5584:545d748cc681
r26111:5721922c714f
r6422:5983361e241a
r5584:545d748cc681
r13026:0c3f00ec0a74
r12341:44c95fb99562
r5584:545d748cc681
r5584:545d748cc681
r11980:193f7a6b6e37
r6422:5983361e241a
r13923:097b41840d11
r11725:57bc99fdc1bc
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r17293:73e49d820513
r21229:bf509b0caedd
r17293:73e49d820513
r17293:73e49d820513
r17293:73e49d820513
r17293:73e49d820513
r5584:545d748cc681
r5584:545d748cc681
r7476:d01b2c643c28
r26314:b43ac5d245f9
r12077:baf868e4baf0
r5584:545d748cc681
r5584:545d748cc681
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r23607:36c15679007d
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r11094:e0f4cb3197e9
r13967:0df597ac93ec
r15352:61cc54bb72c5
r13967:0df597ac93ec
r13967:0df597ac93ec
r14396:0e22f6ee524f
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r17162:6666b029cd97
r10176:4ba2bf13463a
r5584:545d748cc681
r5584:545d748cc681
r28657:ee447a88ccab
r28657:ee447a88ccab
r28657:ee447a88ccab
r5584:545d748cc681
r5584:545d748cc681
r6950:1a54b1afb12a
r5584:545d748cc681
r5584:545d748cc681
r15610:623a23fb6560
r15610:623a23fb6560
r26095:00c14d52e378
r26111:5721922c714f
r13057:58af81fcdcf8
r5584:545d748cc681
r26111:5721922c714f
r5584:545d748cc681
r26111:5721922c714f
r23607:36c15679007d
r14805:8c416234ced2
r19465:c2b6bb045744
r19465:c2b6bb045744
r14805:8c416234ced2
r14805:8c416234ced2
r14805:8c416234ced2
r12029:5b077ec055c0
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r19467:47fa1346a132
r13967:0df597ac93ec
r28657:ee447a88ccab
r28657:ee447a88ccab
r28657:ee447a88ccab
r13967:0df597ac93ec
r5584:545d748cc681
r6950:1a54b1afb12a
r5584:545d748cc681
r5584:545d748cc681
r15610:623a23fb6560
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r15613:193c12018337
r13832:e17769fa4653
r5584:545d748cc681
r6150:4dff209c790c
r6150:4dff209c790c
r13832:e17769fa4653
r9934:91e1ab4a9402
r9810:a537c0857d3f
r13832:e17769fa4653
r9934:91e1ab4a9402
r13823:717ccb00ab59
r14021:1aae6a0ffa3b
r14021:1aae6a0ffa3b
r13832:e17769fa4653
r13832:e17769fa4653
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r26715:ffe313a8ffbc
r8890:02179c54681e
r13832:e17769fa4653
r26715:ffe313a8ffbc
r26715:ffe313a8ffbc
r26715:ffe313a8ffbc
r8890:02179c54681e
r8890:02179c54681e
r18845:66bf168f1100
r26531:0c30eaa59bc4
r5584:545d748cc681
r5584:545d748cc681
r24858:bfbc5d118b1d
r24858:bfbc5d118b1d
r24858:bfbc5d118b1d
r24858:bfbc5d118b1d
r24858:bfbc5d118b1d
r5584:545d748cc681
r5584:545d748cc681
r26531:0c30eaa59bc4
r26531:0c30eaa59bc4
r26531:0c30eaa59bc4
r6593:469af92ae569
r6593:469af92ae569
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r11980:193f7a6b6e37
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r15146:dc5fafda1e2f
r9816:2ec7cf9ecbc4
r12492:6a787b05475e
r9816:2ec7cf9ecbc4
r11971:ac7eb21a00e4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r23440:7b9a736249f0
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r23607:36c15679007d
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r11980:193f7a6b6e37
r5584:545d748cc681
r6422:5983361e241a
r23607:36c15679007d
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r6422:5983361e241a
r16775:3ed9b708bc5a
r5584:545d748cc681
r13024:48c81d0b078a
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r28657:ee447a88ccab
r28657:ee447a88ccab
r28657:ee447a88ccab
r9818:2de1ef05f3ce
r9818:2de1ef05f3ce
r15352:61cc54bb72c5
r9818:2de1ef05f3ce
r14203:aea88883737e
r13024:48c81d0b078a
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r14203:aea88883737e
r5584:545d748cc681
r9818:2de1ef05f3ce
r12461:548f0e01a738
r9818:2de1ef05f3ce
r13024:48c81d0b078a
r5584:545d748cc681
r5584:545d748cc681
r9818:2de1ef05f3ce
r9818:2de1ef05f3ce
r5584:545d748cc681
r5584:545d748cc681
r23137:30ea4915fb74
r12150:c4ae4452befe
r23137:30ea4915fb74
r23137:30ea4915fb74
r11915:80ea6cb37825
r11915:80ea6cb37825
r11915:80ea6cb37825
r9818:2de1ef05f3ce
r15352:61cc54bb72c5
r9818:2de1ef05f3ce
r13024:48c81d0b078a
r9818:2de1ef05f3ce
r9818:2de1ef05f3ce
r9818:2de1ef05f3ce
r9818:2de1ef05f3ce
r12461:548f0e01a738
r9818:2de1ef05f3ce
r9818:2de1ef05f3ce
r5584:545d748cc681
r28657:ee447a88ccab
r28657:ee447a88ccab
r13024:48c81d0b078a
r5584:545d748cc681
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r18855:53b988159599
r21720:231348c28655
r8300:4cfeeb3725a9
r14251:3ca1b5f41119
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r11980:193f7a6b6e37
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r14697:0b5e0f20b510
r10103:3b6188cb0b44
r10103:3b6188cb0b44
r10103:3b6188cb0b44
r10103:3b6188cb0b44
r10103:3b6188cb0b44
r22048:48340dbb02c2
r22048:48340dbb02c2
r22048:48340dbb02c2
r22048:48340dbb02c2
r22048:48340dbb02c2
r22048:48340dbb02c2
r10103:3b6188cb0b44
r9809:f08252de80f7
r9809:f08252de80f7
r12492:6a787b05475e
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r12492:6a787b05475e
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r22600:b52b51b3fd73
r9810:a537c0857d3f
r12290:442d5d533a57
r9810:a537c0857d3f
r22600:b52b51b3fd73
r22600:b52b51b3fd73
r22600:b52b51b3fd73
r12492:6a787b05475e
r9810:a537c0857d3f
r19187:bb7bca831c30
r19187:bb7bca831c30
r19187:bb7bca831c30
r19187:bb7bca831c30
r23607:36c15679007d
r19187:bb7bca831c30
r19187:bb7bca831c30
r19187:bb7bca831c30
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r11981:3840cc07cbe4
r9810:a537c0857d3f
r9810:a537c0857d3f
r10974:02baee90a7c0
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r10103:3b6188cb0b44
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r23023:7b8669afd1db
r10974:02baee90a7c0
r23023:7b8669afd1db
r26468:408717343c14
r9810:a537c0857d3f
r9810:a537c0857d3f
r26468:408717343c14
r5584:545d748cc681
r26468:408717343c14
r26468:408717343c14
r13823:717ccb00ab59
r23248:ca7f30396636
r26468:408717343c14
r13832:e17769fa4653
r13832:e17769fa4653
r5584:545d748cc681
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r11980:193f7a6b6e37
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r23440:7b9a736249f0
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r11941:8901ca1bc641
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r23607:36c15679007d
r23607:36c15679007d
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r13823:717ccb00ab59
r13823:717ccb00ab59
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r10186:464b2861e080
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r23440:7b9a736249f0
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r13832:e17769fa4653
r9810:a537c0857d3f
r9810:a537c0857d3f
r23023:7b8669afd1db
r9810:a537c0857d3f
r13832:e17769fa4653
r23023:7b8669afd1db
r23023:7b8669afd1db
r13832:e17769fa4653
r13832:e17769fa4653
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r10251:5ed21ea74fc8
r18845:66bf168f1100
r10251:5ed21ea74fc8
r17554:5c50ac4e916a
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10343:664ae9e95a85
r10251:5ed21ea74fc8
r17683:ed148d83dec5
r26469:d443093474bb
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r17554:5c50ac4e916a
r10343:664ae9e95a85
r10343:664ae9e95a85
r10343:664ae9e95a85
r10343:664ae9e95a85
r17554:5c50ac4e916a
r26469:d443093474bb
r26469:d443093474bb
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10343:664ae9e95a85
r17683:ed148d83dec5
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r26469:d443093474bb
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10683:189002eba2a5
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10683:189002eba2a5
r10251:5ed21ea74fc8
r10792:96e0dd7b7036
r10792:96e0dd7b7036
r10683:189002eba2a5
r10251:5ed21ea74fc8
r18921:a0ea80c19807
r10569:2bbd4c373e37
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10544:3093e218ea50
r10251:5ed21ea74fc8
r11986:6596046384a5
r23607:36c15679007d
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r28649:d3bb8c4dcee1
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r17794:0cc19d7573b2
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r18921:a0ea80c19807
r10251:5ed21ea74fc8
r10261:8cd93ccf90f1
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r9812:5b96876a0e87
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r9812:5b96876a0e87
r10261:8cd93ccf90f1
r10261:8cd93ccf90f1
r10261:8cd93ccf90f1
r18921:a0ea80c19807
r18921:a0ea80c19807
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r10251:5ed21ea74fc8
r9812:5b96876a0e87
r9810:a537c0857d3f
r11980:193f7a6b6e37
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r26470:40beb4ba4113
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r23607:36c15679007d
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9817:972c582731b2
r9817:972c582731b2
r9810:a537c0857d3f
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r9817:972c582731b2
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r23607:36c15679007d
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r18829:5ce9dc1b5388
r9810:a537c0857d3f
r9810:a537c0857d3f
r10252:9d409dc13e87
r10252:9d409dc13e87
r10252:9d409dc13e87
r10252:9d409dc13e87
r10307:e1c95abeffb3
r10307:e1c95abeffb3
r10307:e1c95abeffb3
r10307:e1c95abeffb3
r10307:e1c95abeffb3
r10683:189002eba2a5
r10683:189002eba2a5
r10683:189002eba2a5
r10444:70ba922c9fc1
r12492:6a787b05475e
r10683:189002eba2a5
r10683:189002eba2a5
r10252:9d409dc13e87
r10252:9d409dc13e87
r9817:972c582731b2
r9817:972c582731b2
r16766:61f33c5e3a5b
r9817:972c582731b2
r9817:972c582731b2
r26470:40beb4ba4113
r9817:972c582731b2
r16766:61f33c5e3a5b
r5584:545d748cc681
r5584:545d748cc681
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r11971:ac7eb21a00e4
r23607:36c15679007d
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r9810:a537c0857d3f
r23607:36c15679007d
r9810:a537c0857d3f
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r23440:7b9a736249f0
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r10683:189002eba2a5
r9812:5b96876a0e87
r16766:61f33c5e3a5b
r26468:408717343c14
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r23607:36c15679007d
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r23607:36c15679007d
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r9812:5b96876a0e87
r11971:ac7eb21a00e4
r9810:a537c0857d3f
r9810:a537c0857d3f
r5584:545d748cc681
r26470:40beb4ba4113
r26470:40beb4ba4113
r26470:40beb4ba4113
r26470:40beb4ba4113
r26470:40beb4ba4113
r26470:40beb4ba4113
r26470:40beb4ba4113
r26470:40beb4ba4113
r26470:40beb4ba4113
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r10974:02baee90a7c0
r10974:02baee90a7c0
r10974:02baee90a7c0
r9813:0cfc0fa50161
r11980:193f7a6b6e37
r9813:0cfc0fa50161
r12290:442d5d533a57
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r12132:a38dd864f398
r12461:548f0e01a738
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r23607:36c15679007d
r9831:848a57462435
r15810:0e843b449a0a
r12682:065964b5ff72
r12682:065964b5ff72
r12682:065964b5ff72
r12682:065964b5ff72
r23607:36c15679007d
r12682:065964b5ff72
r12682:065964b5ff72
r12682:065964b5ff72
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r18682:0cc315a3a76a
r11981:3840cc07cbe4
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r15810:0e843b449a0a
r12132:a38dd864f398
r12461:548f0e01a738
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r10974:02baee90a7c0
r9813:0cfc0fa50161
r23440:7b9a736249f0
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r12461:548f0e01a738
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r11981:3840cc07cbe4
r14203:aea88883737e
r18682:0cc315a3a76a
r10587:d75f53e423b4
r11981:3840cc07cbe4
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r5584:545d748cc681
r13832:e17769fa4653
r5584:545d748cc681
r9413:fcf267325763
r11981:3840cc07cbe4
r8850:e9956f61a4e6
r5584:545d748cc681
r8850:e9956f61a4e6
r5584:545d748cc681
r13832:e17769fa4653
r5584:545d748cc681
r9413:fcf267325763
r13832:e17769fa4653
r13832:e17769fa4653
r13832:e17769fa4653
r13832:e17769fa4653
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r8827:6ee5217ef94b
r5584:545d748cc681
r8830:3bad3e96d573
r8830:3bad3e96d573
r11917:612c11f7ab47
r8928:b99c60f72521
r8928:b99c60f72521
r17184:a6dd7165a9b8
r8928:b99c60f72521
r8928:b99c60f72521
r8928:b99c60f72521
r8928:b99c60f72521
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r6553:04028e73a0f7
r5584:545d748cc681
r15117:4610e022866d
r5584:545d748cc681
r20610:4d2570719606
r20610:4d2570719606
r23607:36c15679007d
r6553:04028e73a0f7
r6553:04028e73a0f7
r14251:3ca1b5f41119
r14251:3ca1b5f41119
r5584:545d748cc681
r5584:545d748cc681
r10214:51bc41889761
r14992:2648a73e4ab8
r10214:51bc41889761
r15426:38ea83bb4f51
r15426:38ea83bb4f51
r10214:51bc41889761
r10214:51bc41889761
r14274:562f45526a0b
r5584:545d748cc681
r14276:fe74de3c3311
r14276:fe74de3c3311
r14396:0e22f6ee524f
r20182:023b50bd4833
r17165:9871e31ef1c8
r14396:0e22f6ee524f
r17165:9871e31ef1c8
r14279:b1c04915b4a5
r5584:545d748cc681
r5584:545d748cc681
r16362:9d8d927a8276
r16362:9d8d927a8276
r16362:9d8d927a8276
r16362:9d8d927a8276
r16362:9d8d927a8276
r11980:193f7a6b6e37
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11917:612c11f7ab47
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r12005:1096fe8178fd
r11725:57bc99fdc1bc
r19369:05b3aefe07b5
r5584:545d748cc681
r10123:310b4a36ab6c
r5584:545d748cc681
r18501:8e3d905ea4bc
r18764:f6e8611401f3
r5584:545d748cc681
r5584:545d748cc681
r15352:61cc54bb72c5
r15341:53ae0ca46a92
r15341:53ae0ca46a92
r6550:75603d3aae13
r9003:0b0148ae8377
r19949:26fad1c62a1b
r15925:9a7fe46227a0
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11980:193f7a6b6e37
r5584:545d748cc681
r16537:b136370bd3c2
r16537:b136370bd3c2
r5584:545d748cc681
r5584:545d748cc681
r18989:156eeb86b09e
r18989:156eeb86b09e
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r6248:b940b09d7ab8
r5584:545d748cc681
r18989:156eeb86b09e
r18989:156eeb86b09e
r11363:6906c490a00e
r6422:5983361e241a
r6422:5983361e241a
r6422:5983361e241a
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18262:3bc00eb1e3da
r5584:545d748cc681
r14396:0e22f6ee524f
r5584:545d748cc681
r18989:156eeb86b09e
r5584:545d748cc681
r5584:545d748cc681
r18989:156eeb86b09e
r5584:545d748cc681
r27737:728d55b97775
r16775:3ed9b708bc5a
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r9821:79f6522fbbdd
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8794:8df5798447df
r8794:8df5798447df
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r5584:545d748cc681
r9821:79f6522fbbdd
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r12413:18cb483f6737
r12413:18cb483f6737
r23607:36c15679007d
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r5584:545d748cc681
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r13863:252b1a5c4f87
r5584:545d748cc681
r13863:252b1a5c4f87
r13863:252b1a5c4f87
r16759:67718e97d197
r13863:252b1a5c4f87
r12683:2c40e2b81044
r12683:2c40e2b81044
r13863:252b1a5c4f87
r23607:36c15679007d
r13863:252b1a5c4f87
r13863:252b1a5c4f87
r9845:7f328db36b4a
r9845:7f328db36b4a
r13863:252b1a5c4f87
r9845:7f328db36b4a
r9811:73da48dbb2e3
r13863:252b1a5c4f87
r13863:252b1a5c4f87
r17127:fe5262df76e1
r13863:252b1a5c4f87
r13863:252b1a5c4f87
r14374:97155e225051
r14374:97155e225051
r14374:97155e225051
r8271:1f7e6755eb3a
r8271:1f7e6755eb3a
r17131:8e7f5d0ba4e4
r13863:252b1a5c4f87
r13863:252b1a5c4f87
r13863:252b1a5c4f87
r5584:545d748cc681
r5584:545d748cc681
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r11980:193f7a6b6e37
r11150:a045cdfa8f23
r12413:18cb483f6737
r12227:937c28c992ae
r11150:a045cdfa8f23
r12413:18cb483f6737
r13863:252b1a5c4f87
r18501:8e3d905ea4bc
r18764:f6e8611401f3
r12413:18cb483f6737
r12413:18cb483f6737
r12413:18cb483f6737
r16786:8180941c80a8
r12413:18cb483f6737
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r11150:a045cdfa8f23
r18845:66bf168f1100
r6966:d47f1815e2dd
r18845:66bf168f1100
r18845:66bf168f1100
r6966:d47f1815e2dd
r6966:d47f1815e2dd
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r23607:36c15679007d
r18845:66bf168f1100
r9775:4eaf88c92876
r6966:d47f1815e2dd
r8850:e9956f61a4e6
r6966:d47f1815e2dd
r12227:937c28c992ae
r23607:36c15679007d
r8281:770943ea08b4
r17053:d1bd348513e5
r23607:36c15679007d
r17053:d1bd348513e5
r8281:770943ea08b4
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r23607:36c15679007d
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r23607:36c15679007d
r12227:937c28c992ae
r12227:937c28c992ae
r18436:92d461597905
r23607:36c15679007d
r12227:937c28c992ae
r12227:937c28c992ae
r23607:36c15679007d
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r12227:937c28c992ae
r23607:36c15679007d
r6966:d47f1815e2dd
r6966:d47f1815e2dd
r6422:5983361e241a
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r5584:545d748cc681
r11980:193f7a6b6e37
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r5584:545d748cc681
r6150:4dff209c790c
r5584:545d748cc681
r6966:d47f1815e2dd
r6966:d47f1815e2dd
r6966:d47f1815e2dd
r11981:3840cc07cbe4
r10083:2e8288935c09
r10083:2e8288935c09
r7371:d19698ba3220
r10083:2e8288935c09
r7371:d19698ba3220
r6966:d47f1815e2dd
r6966:d47f1815e2dd
r10282:80a4805fff2c
r6966:d47f1815e2dd
r6966:d47f1815e2dd
r24578:e105ade320f5
r5584:545d748cc681
r5584:545d748cc681
r24858:bfbc5d118b1d
r10282:80a4805fff2c
r5584:545d748cc681
r5584:545d748cc681
r12290:442d5d533a57
r5584:545d748cc681
r23607:36c15679007d
r12290:442d5d533a57
r12290:442d5d533a57
r9699:1f93d59ccf9d
r9699:1f93d59ccf9d
r12290:442d5d533a57
r23607:36c15679007d
r23607:36c15679007d
r23607:36c15679007d
r12290:442d5d533a57
r12290:442d5d533a57
r5584:545d748cc681
r5584:545d748cc681
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r5584:545d748cc681
r12080:8115dddfc1a2
r11980:193f7a6b6e37
r12080:8115dddfc1a2
r5584:545d748cc681
r5584:545d748cc681
r8710:2778607a3b6c
r6871:057e32f0d7b7
r8334:34423b580a30
r5584:545d748cc681
r6153:c45b80eecb6a
r11981:3840cc07cbe4
r5584:545d748cc681
r6152:985ea6ad0695
r5584:545d748cc681
r11981:3840cc07cbe4
r5994:2d36164769d3
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5994:2d36164769d3
r5584:545d748cc681
r10655:e515a6dc6473
r18436:92d461597905
r5584:545d748cc681
r27737:728d55b97775
r7928:a80e7e05d6c5
r5584:545d748cc681
r5584:545d748cc681
r7928:a80e7e05d6c5
r10655:e515a6dc6473
r5991:254bad51c6b2
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r11426:1e05bf384bc9
r5994:2d36164769d3
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8794:8df5798447df
r8794:8df5798447df
r8794:8df5798447df
r8794:8df5798447df
r8794:8df5798447df
r8616:656db5986c9e
r8616:656db5986c9e
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r5994:2d36164769d3
r5584:545d748cc681
r15810:0e843b449a0a
r5584:545d748cc681
r5994:2d36164769d3
r5584:545d748cc681
r6150:4dff209c790c
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r23607:36c15679007d
r9810:a537c0857d3f
r5584:545d748cc681
r15352:61cc54bb72c5
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r20909:bfdf50e62a4a
r20909:bfdf50e62a4a
r20909:bfdf50e62a4a
r13967:0df597ac93ec
r13967:0df597ac93ec
r15352:61cc54bb72c5
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r13967:0df597ac93ec
r5584:545d748cc681
r15352:61cc54bb72c5
r8616:656db5986c9e
r8616:656db5986c9e
r6151:395bcf9e47f4
r9808:90431445db6a
r18436:92d461597905
r9808:90431445db6a
r6151:395bcf9e47f4
r6151:395bcf9e47f4
r6151:395bcf9e47f4
r23119:c8d0f4cc5c84
r27883:ddbd33508a8a
r6151:395bcf9e47f4
r6151:395bcf9e47f4
r6151:395bcf9e47f4
r23119:c8d0f4cc5c84
r27883:ddbd33508a8a
r9699:1f93d59ccf9d
r9699:1f93d59ccf9d
r9699:1f93d59ccf9d
r9699:1f93d59ccf9d
r6151:395bcf9e47f4
r6151:395bcf9e47f4
r18436:92d461597905
r6151:395bcf9e47f4
r6151:395bcf9e47f4
r9820:2da628ecb1e6
r9820:2da628ecb1e6
r14692:0667dbbad1e0
r14692:0667dbbad1e0
r14692:0667dbbad1e0
r17213:9e1a5315b952
r14692:0667dbbad1e0
r14203:aea88883737e
r18436:92d461597905
r9820:2da628ecb1e6
r6151:395bcf9e47f4
r9888:b78c7ec247c0
r19949:26fad1c62a1b
r6151:395bcf9e47f4
r5584:545d748cc681
r5584:545d748cc681
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11981:3840cc07cbe4
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11981:3840cc07cbe4
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11685:b0980ef188ad
r11685:b0980ef188ad
r11685:b0980ef188ad
r11685:b0980ef188ad
r15810:0e843b449a0a
r15810:0e843b449a0a
r11685:b0980ef188ad
r11429:9d96e421d2b0
r11685:b0980ef188ad
r11685:b0980ef188ad
r11685:b0980ef188ad
r11685:b0980ef188ad
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r11429:9d96e421d2b0
r5584:545d748cc681
r5584:545d748cc681
r5994:2d36164769d3
r5994:2d36164769d3
r5994:2d36164769d3
r5994:2d36164769d3
r5994:2d36164769d3
r5584:545d748cc681
r5584:545d748cc681
r28518:ca5098bf21c9
r6150:4dff209c790c
r6150:4dff209c790c
r6150:4dff209c790c
r5584:545d748cc681
r5584:545d748cc681
r27737:728d55b97775
r7928:a80e7e05d6c5
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r7928:a80e7e05d6c5
r9809:f08252de80f7
r9809:f08252de80f7
r12290:442d5d533a57
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r9809:f08252de80f7
r23607:36c15679007d
r9809:f08252de80f7
r5584:545d748cc681
r5584:545d748cc681
r6154:ac5bfaeff771
r21229:bf509b0caedd
r5584:545d748cc681
r5584:545d748cc681
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r6871:057e32f0d7b7
r14744:20a253ef5af6
r8334:34423b580a30
r5584:545d748cc681
r12080:8115dddfc1a2
r23607:36c15679007d
r18989:156eeb86b09e
r12080:8115dddfc1a2
r18989:156eeb86b09e
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r12080:8115dddfc1a2
r9816:2ec7cf9ecbc4
r12290:442d5d533a57
r14203:aea88883737e
r9816:2ec7cf9ecbc4
r15810:0e843b449a0a
r9824:94c591de0a6f
r20203:2cafcc9e4e6e
r9824:94c591de0a6f
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r11652:5c73940aeb94
r5584:545d748cc681
r5584:545d748cc681
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r12290:442d5d533a57
r9888:b78c7ec247c0
r9888:b78c7ec247c0
r9888:b78c7ec247c0
r17089:d17b3f2c82d0
r17089:d17b3f2c82d0
r17089:d17b3f2c82d0
r17089:d17b3f2c82d0
r17089:d17b3f2c82d0
r9816:2ec7cf9ecbc4
r5584:545d748cc681
r5584:545d748cc681
r21720:231348c28655
r21720:231348c28655
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r22868:6eb08946de7f
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r21720:231348c28655
r5584:545d748cc681
r5584:545d748cc681
r18262:3bc00eb1e3da
r5584:545d748cc681
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r6871:057e32f0d7b7
r8334:34423b580a30
r12290:442d5d533a57
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r11981:3840cc07cbe4
r11981:3840cc07cbe4
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r9821:79f6522fbbdd
r6871:057e32f0d7b7
r6871:057e32f0d7b7
r6871:057e32f0d7b7
r23607:36c15679007d
r8334:34423b580a30
r8342:c2c539be911f
r8334:34423b580a30
r6871:057e32f0d7b7
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r12290:442d5d533a57
r5584:545d748cc681
r12080:8115dddfc1a2
r14251:3ca1b5f41119
r12080:8115dddfc1a2
r18436:92d461597905
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r27160:192bc991c2e6
r5584:545d748cc681
r5584:545d748cc681
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r5584:545d748cc681
r5584:545d748cc681
r15610:623a23fb6560
r15610:623a23fb6560
r10083:2e8288935c09
r9840:82815686d536
r23607:36c15679007d
r9840:82815686d536
r9840:82815686d536
r9840:82815686d536
r9840:82815686d536
r9840:82815686d536
r9845:7f328db36b4a
r15247:3dffd26914e6
r15247:3dffd26914e6
r11981:3840cc07cbe4
r9845:7f328db36b4a
r15247:3dffd26914e6
r15247:3dffd26914e6
r9845:7f328db36b4a
r9845:7f328db36b4a
r9840:82815686d536
r23607:36c15679007d
r9840:82815686d536
r9840:82815686d536
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8073:0e6cc74a55ad
r6484:7a9ab9f50ee4
r5584:545d748cc681
r11980:193f7a6b6e37
r5584:545d748cc681
r11980:193f7a6b6e37
r8267:5a499e9f002f
r5584:545d748cc681
r5584:545d748cc681
r15810:0e843b449a0a
r11980:193f7a6b6e37
r23607:36c15679007d
r23607:36c15679007d
r5584:545d748cc681
r10493:b82fe3a35854
r8267:5a499e9f002f
r21229:bf509b0caedd
r8267:5a499e9f002f
r8267:5a499e9f002f
r11981:3840cc07cbe4
r13024:48c81d0b078a
r8267:5a499e9f002f
r20309:1193be4a351b
r8267:5a499e9f002f
r8267:5a499e9f002f
r8255:3bfd39c46917
r11981:3840cc07cbe4
r8255:3bfd39c46917
r8300:4cfeeb3725a9
r8255:3bfd39c46917
r7398:6cf0bd875a61
r23607:36c15679007d
r9840:82815686d536
r12132:a38dd864f398
r11981:3840cc07cbe4
r12132:a38dd864f398
r9845:7f328db36b4a
r9845:7f328db36b4a
r9845:7f328db36b4a
r9840:82815686d536
r9840:82815686d536
r9840:82815686d536
r9840:82815686d536
r9840:82815686d536
r10083:2e8288935c09
r9840:82815686d536
r9840:82815686d536
r9840:82815686d536
r25786:87f8e7b82850
r9840:82815686d536
r5584:545d748cc681
r8334:34423b580a30
r8342:c2c539be911f
r8255:3bfd39c46917
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r27233:ee72fbff3328
r8257:dc2c45de9e3d
r8961:7da2b7436c69
r8300:4cfeeb3725a9
r8257:dc2c45de9e3d
r9840:82815686d536
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r17226:04f59d7fdf18
r17226:04f59d7fdf18
r17226:04f59d7fdf18
r17226:04f59d7fdf18
r11980:193f7a6b6e37
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r14744:20a253ef5af6
r8850:e9956f61a4e6
r18855:53b988159599
r21720:231348c28655
r22456:1b00f2c0bc73
r22456:1b00f2c0bc73
r22456:1b00f2c0bc73
r18855:53b988159599
r5584:545d748cc681
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r17226:04f59d7fdf18
r17226:04f59d7fdf18
r17226:04f59d7fdf18
r17226:04f59d7fdf18
r17226:04f59d7fdf18
r11980:193f7a6b6e37
r5584:545d748cc681
r11981:3840cc07cbe4
r5584:545d748cc681
r5993:2c7e309aaf76
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r27737:728d55b97775
r7967:9fd776876428
r5584:545d748cc681
r5584:545d748cc681
r6150:4dff209c790c
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8969:a12996f56447
r23607:36c15679007d
r5584:545d748cc681
r11965:2b94ac4aa35a
r5584:545d748cc681
r11965:2b94ac4aa35a
r11965:2b94ac4aa35a
r5584:545d748cc681
r5584:545d748cc681
r8283:10ba4dfb3e81
r27737:728d55b97775
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8305:fdac84b3e102
r8283:10ba4dfb3e81
r8305:fdac84b3e102
r8283:10ba4dfb3e81
r8305:fdac84b3e102
r8305:fdac84b3e102
r18436:92d461597905
r8305:fdac84b3e102
r8283:10ba4dfb3e81
r18436:92d461597905
r5584:545d748cc681
r8305:fdac84b3e102
r6150:4dff209c790c
r6150:4dff209c790c
r5584:545d748cc681
r8312:1940cdf508c8
r8312:1940cdf508c8
r5584:545d748cc681
r8312:1940cdf508c8
r28649:d3bb8c4dcee1
r5584:545d748cc681
r8312:1940cdf508c8
r5584:545d748cc681
r8312:1940cdf508c8
r8312:1940cdf508c8
r5587:034e5e185dc2
r5584:545d748cc681
r5584:545d748cc681
r17442:dbbc4b082a6e
r17442:dbbc4b082a6e
r17442:dbbc4b082a6e
r18436:92d461597905
r18436:92d461597905
r18436:92d461597905
r8305:fdac84b3e102
r5584:545d748cc681
r18436:92d461597905
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r6422:5983361e241a
r5584:545d748cc681
r27737:728d55b97775
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8305:fdac84b3e102
r8305:fdac84b3e102
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r11980:193f7a6b6e37
r8334:34423b580a30
r8334:34423b580a30
r11981:3840cc07cbe4
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8961:7da2b7436c69
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r11980:193f7a6b6e37
r8334:34423b580a30
r12290:442d5d533a57
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r22906:1b252dc87a48
r8334:34423b580a30
r8334:34423b580a30
r8606:9f6f09d1d701
r8334:34423b580a30
r8606:9f6f09d1d701
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8334:34423b580a30
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r18436:92d461597905
r8305:fdac84b3e102
r8305:fdac84b3e102
r18436:92d461597905
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r27737:728d55b97775
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8334:34423b580a30
r8305:fdac84b3e102
r8305:fdac84b3e102
r22906:1b252dc87a48
r8305:fdac84b3e102
r8334:34423b580a30
r8305:fdac84b3e102
r8305:fdac84b3e102
r8794:8df5798447df
r8794:8df5798447df
r8794:8df5798447df
r8794:8df5798447df
r8794:8df5798447df
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8482:3e71f854e1b4
r8616:656db5986c9e
r23440:7b9a736249f0
r11981:3840cc07cbe4
r8482:3e71f854e1b4
r8482:3e71f854e1b4
r8606:9f6f09d1d701
r8606:9f6f09d1d701
r18436:92d461597905
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r18436:92d461597905
r8305:fdac84b3e102
r8305:fdac84b3e102
r8356:1852675e132d
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r8305:fdac84b3e102
r11980:193f7a6b6e37
r5584:545d748cc681
r5584:545d748cc681
r7476:d01b2c643c28
r11965:2b94ac4aa35a
r5584:545d748cc681
r5584:545d748cc681
r15352:61cc54bb72c5
r11981:3840cc07cbe4
r18682:0cc315a3a76a
r9808:90431445db6a
r5584:545d748cc681
r5584:545d748cc681
r15947:6f1c6a44a807
r5584:545d748cc681
r11981:3840cc07cbe4
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r12077:baf868e4baf0
r5584:545d748cc681
r11967:df0600d2c7e7
r8827:6ee5217ef94b
r14203:aea88883737e
r5584:545d748cc681
r5584:545d748cc681
r15439:c3d2564d153b
r5584:545d748cc681
r11965:2b94ac4aa35a
r15439:c3d2564d153b
r15439:c3d2564d153b
r15439:c3d2564d153b
r15439:c3d2564d153b
r22906:1b252dc87a48
r16296:3b65fa0a880b
r16296:3b65fa0a880b
r16296:3b65fa0a880b
r15439:c3d2564d153b
r15439:c3d2564d153b
r15439:c3d2564d153b
r5584:545d748cc681
r5584:545d748cc681
r6594:cd6701cee0ee
r5584:545d748cc681
r11965:2b94ac4aa35a
r11965:2b94ac4aa35a
r11965:2b94ac4aa35a
r5584:545d748cc681
r16501:1e4c47fd9577
r5584:545d748cc681
r9816:2ec7cf9ecbc4
r11967:df0600d2c7e7
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9816:2ec7cf9ecbc4
r9813:0cfc0fa50161
r11981:3840cc07cbe4
r14203:aea88883737e
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r27883:ddbd33508a8a
r14203:aea88883737e
r15352:61cc54bb72c5
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r27883:ddbd33508a8a
r9813:0cfc0fa50161
r16762:1d4bc6bc195d
r10574:861fa688dc29
r19367:da2e40bf245d
r9813:0cfc0fa50161
r14203:aea88883737e
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r15352:61cc54bb72c5
r11981:3840cc07cbe4
r14203:aea88883737e
r18682:0cc315a3a76a
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r9813:0cfc0fa50161
r10682:a0450bbfff97
r10682:a0450bbfff97
r18682:0cc315a3a76a
r11965:2b94ac4aa35a
r10682:a0450bbfff97
r10682:a0450bbfff97
r14274:562f45526a0b
r8426:169063274d20
r8426:169063274d20
r15341:53ae0ca46a92
r13967:0df597ac93ec
r15352:61cc54bb72c5
r15341:53ae0ca46a92
r8426:169063274d20
r8426:169063274d20
r15426:38ea83bb4f51
r10214:51bc41889761
r6422:5983361e241a
r17162:6666b029cd97
r5584:545d748cc681
r5584:545d748cc681
r10214:51bc41889761
r11696:d0e7314029e0
r10214:51bc41889761
r23607:36c15679007d
r11696:d0e7314029e0
r11696:d0e7314029e0
r15426:38ea83bb4f51
r15426:38ea83bb4f51
r11689:154feeb8fd54
r11696:d0e7314029e0
r11696:d0e7314029e0
r11696:d0e7314029e0
r11696:d0e7314029e0
r11696:d0e7314029e0
r12462:a7cb564c6c56
r11696:d0e7314029e0
r11696:d0e7314029e0
r12462:a7cb564c6c56
r11696:d0e7314029e0
r11689:154feeb8fd54
r11696:d0e7314029e0
r17162:6666b029cd97
r5584:545d748cc681
r5584:545d748cc681
r23607:36c15679007d
r11322:36e10b93494e
r11322:36e10b93494e
r12656:6db5e45ad71c
r11322:36e10b93494e
r11322:36e10b93494e
r10641:28b35ec7c5ae
r11965:2b94ac4aa35a
r11965:2b94ac4aa35a
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r7488:e5f4cea230c4
r7488:e5f4cea230c4
r7488:e5f4cea230c4
r11980:193f7a6b6e37
r7488:e5f4cea230c4
r7488:e5f4cea230c4
r18228:6cd8bae37157
r13731:60d669a7b9e1
r13731:60d669a7b9e1
r13731:60d669a7b9e1
r7488:e5f4cea230c4
r7488:e5f4cea230c4
r9208:9de1b88a8a4f
r12292:c3b6baef441a
r9208:9de1b88a8a4f
r18229:a35410711978
r23607:36c15679007d
r7488:e5f4cea230c4
r7488:e5f4cea230c4
r7488:e5f4cea230c4
r7488:e5f4cea230c4
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r11965:2b94ac4aa35a
r5584:545d748cc681
r7135:3964060426dc
r7135:3964060426dc
r12290:442d5d533a57
r26433:7064d8b8a1a8
r26433:7064d8b8a1a8
r15353:64b63ee2a478
r11965:2b94ac4aa35a
r7135:3964060426dc
r7135:3964060426dc
r11965:2b94ac4aa35a
r5584:545d748cc681
r11965:2b94ac4aa35a
r12291:690f4158878e
r7696:5fa7dffd9aac
r11981:3840cc07cbe4
r11965:2b94ac4aa35a
r11965:2b94ac4aa35a
r11965:2b94ac4aa35a
r5584:545d748cc681
r11965:2b94ac4aa35a
r11965:2b94ac4aa35a
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r19944:25a78576fb5e
r18845:66bf168f1100
r18845:66bf168f1100
r11980:193f7a6b6e37
r5584:545d748cc681
r12027:83216fa52f8f
r19467:47fa1346a132
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r13935:e0b7841f69a5
r13935:e0b7841f69a5
r13935:e0b7841f69a5
r13935:e0b7841f69a5
r13935:e0b7841f69a5
r13935:e0b7841f69a5
r13935:e0b7841f69a5
r13935:e0b7841f69a5
r5584:545d748cc681
r13935:e0b7841f69a5
r8836:911846a8cfa6
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8836:911846a8cfa6
r18682:0cc315a3a76a
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r12991:ff20fa5b1c08
r5584:545d748cc681
r8836:911846a8cfa6
r12991:ff20fa5b1c08
r7967:9fd776876428
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r17683:ed148d83dec5
r26466:938bcd34baa7
r5584:545d748cc681
r18682:0cc315a3a76a
r5584:545d748cc681
r5584:545d748cc681
r28549:6bc33bc6ee38
r28549:6bc33bc6ee38
r5584:545d748cc681
r17997:5866700f3901
r28549:6bc33bc6ee38
r28549:6bc33bc6ee38
r28549:6bc33bc6ee38
r28549:6bc33bc6ee38
r28549:6bc33bc6ee38
r8467:0ea88f22d4aa
r8467:0ea88f22d4aa
r12290:442d5d533a57
r8467:0ea88f22d4aa
r8467:0ea88f22d4aa
r8467:0ea88f22d4aa
r8467:0ea88f22d4aa
r8467:0ea88f22d4aa
r5584:545d748cc681
r5584:545d748cc681
r8836:911846a8cfa6
r12500:5e5dd00d1e93
r10488:cbe4b3cd8549
r5584:545d748cc681
r5584:545d748cc681
r8556:c5860d29500d
r5584:545d748cc681
r27884:803962be0328
r8556:c5860d29500d
r8556:c5860d29500d
r8556:c5860d29500d
r8467:0ea88f22d4aa
r10207:a1fc2f2a33db
r8467:0ea88f22d4aa
r13024:48c81d0b078a
r13024:48c81d0b078a
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r18845:66bf168f1100
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11981:3840cc07cbe4
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11981:3840cc07cbe4
r25484:c5af4712cb7f
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11971:ac7eb21a00e4
r11981:3840cc07cbe4
r11971:ac7eb21a00e4
r26526:c817c3792857
r27737:728d55b97775
r26526:c817c3792857
r27737:728d55b97775
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
r26526:c817c3792857
/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 */

/** @file train_cmd.cpp Handling of trains. */

#include "stdafx.h"
#include "error.h"
#include "articulated_vehicles.h"
#include "command_func.h"
#include "error_func.h"
#include "pathfinder/npf/npf_func.h"
#include "pathfinder/yapf/yapf.hpp"
#include "news_func.h"
#include "company_func.h"
#include "newgrf_sound.h"
#include "newgrf_text.h"
#include "strings_func.h"
#include "viewport_func.h"
#include "vehicle_func.h"
#include "sound_func.h"
#include "ai/ai.hpp"
#include "game/game.hpp"
#include "newgrf_station.h"
#include "effectvehicle_func.h"
#include "network/network.h"
#include "spritecache.h"
#include "core/random_func.hpp"
#include "company_base.h"
#include "newgrf.h"
#include "order_backup.h"
#include "zoom_func.h"
#include "newgrf_debug.h"
#include "framerate_type.h"
#include "train_cmd.h"
#include "misc_cmd.h"
#include "timer/timer_game_calendar.h"
#include "timer/timer_game_economy.h"

#include "table/strings.h"
#include "table/train_sprites.h"

#include "safeguards.h"

static Track ChooseTrainTrack(Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool force_res, bool *got_reservation, bool mark_stuck);
static bool TrainCheckIfLineEnds(Train *v, bool reverse = true);
bool TrainController(Train *v, Vehicle *nomove, bool reverse = true); // Also used in vehicle_sl.cpp.
static TileIndex TrainApproachingCrossingTile(const Train *v);
static void CheckIfTrainNeedsService(Train *v);
static void CheckNextTrainTile(Train *v);

static const byte _vehicle_initial_x_fract[4] = {10, 8, 4,  8};
static const byte _vehicle_initial_y_fract[4] = { 8, 4, 8, 10};

template <>
bool IsValidImageIndex<VEH_TRAIN>(uint8_t image_index)
{
	return image_index < lengthof(_engine_sprite_base);
}


/**
 * Return the cargo weight multiplier to use for a rail vehicle
 * @param cargo Cargo type to get multiplier for
 * @return Cargo weight multiplier
 */
byte FreightWagonMult(CargoID cargo)
{
	if (!CargoSpec::Get(cargo)->is_freight) return 1;
	return _settings_game.vehicle.freight_trains;
}

/** Checks if lengths of all rail vehicles are valid. If not, shows an error message. */
void CheckTrainsLengths()
{
	bool first = true;

	for (const Train *v : Train::Iterate()) {
		if (v->First() == v && !(v->vehstatus & VS_CRASHED)) {
			for (const Train *u = v, *w = v->Next(); w != nullptr; u = w, w = w->Next()) {
				if (u->track != TRACK_BIT_DEPOT) {
					if ((w->track != TRACK_BIT_DEPOT &&
							std::max(abs(u->x_pos - w->x_pos), abs(u->y_pos - w->y_pos)) != u->CalcNextVehicleOffset()) ||
							(w->track == TRACK_BIT_DEPOT && TicksToLeaveDepot(u) <= 0)) {
						SetDParam(0, v->index);
						SetDParam(1, v->owner);
						ShowErrorMessage(STR_BROKEN_VEHICLE_LENGTH, INVALID_STRING_ID, WL_CRITICAL);

						if (!_networking && first) {
							first = false;
							Command<CMD_PAUSE>::Post(PM_PAUSED_ERROR, true);
						}
						/* Break so we warn only once for each train. */
						break;
					}
				}
			}
		}
	}
}

/**
 * Recalculates the cached stuff of a train. Should be called each time a vehicle is added
 * to/removed from the chain, and when the game is loaded.
 * Note: this needs to be called too for 'wagon chains' (in the depot, without an engine)
 * @param allowed_changes Stuff that is allowed to change.
 */
void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
{
	uint16_t max_speed = UINT16_MAX;

	assert(this->IsFrontEngine() || this->IsFreeWagon());

	const RailVehicleInfo *rvi_v = RailVehInfo(this->engine_type);
	EngineID first_engine = this->IsFrontEngine() ? this->engine_type : INVALID_ENGINE;
	this->gcache.cached_total_length = 0;
	this->compatible_railtypes = RAILTYPES_NONE;

	bool train_can_tilt = true;
	int min_curve_speed_mod = INT_MAX;

	for (Train *u = this; u != nullptr; u = u->Next()) {
		const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);

		/* Check the this->first cache. */
		assert(u->First() == this);

		/* update the 'first engine' */
		u->gcache.first_engine = this == u ? INVALID_ENGINE : first_engine;
		u->railtype = rvi_u->railtype;

		if (u->IsEngine()) first_engine = u->engine_type;

		/* Set user defined data to its default value */
		u->tcache.user_def_data = rvi_u->user_def_data;
		this->InvalidateNewGRFCache();
		u->InvalidateNewGRFCache();
	}

	for (Train *u = this; u != nullptr; u = u->Next()) {
		/* Update user defined data (must be done before other properties) */
		u->tcache.user_def_data = GetVehicleProperty(u, PROP_TRAIN_USER_DATA, u->tcache.user_def_data);
		this->InvalidateNewGRFCache();
		u->InvalidateNewGRFCache();
	}

	for (Train *u = this; u != nullptr; u = u->Next()) {
		const Engine *e_u = u->GetEngine();
		const RailVehicleInfo *rvi_u = &e_u->u.rail;

		if (!HasBit(e_u->info.misc_flags, EF_RAIL_TILTS)) train_can_tilt = false;
		min_curve_speed_mod = std::min(min_curve_speed_mod, u->GetCurveSpeedModifier());

		/* Cache wagon override sprite group. nullptr is returned if there is none */
		u->tcache.cached_override = GetWagonOverrideSpriteSet(u->engine_type, u->cargo_type, u->gcache.first_engine);

		/* Reset colour map */
		u->colourmap = PAL_NONE;

		/* Update powered-wagon-status and visual effect */
		u->UpdateVisualEffect(true);

		if (rvi_v->pow_wag_power != 0 && rvi_u->railveh_type == RAILVEH_WAGON &&
				UsesWagonOverride(u) && !HasBit(u->vcache.cached_vis_effect, VE_DISABLE_WAGON_POWER)) {
			/* wagon is powered */
			SetBit(u->flags, VRF_POWEREDWAGON); // cache 'powered' status
		} else {
			ClrBit(u->flags, VRF_POWEREDWAGON);
		}

		if (!u->IsArticulatedPart()) {
			/* Do not count powered wagons for the compatible railtypes, as wagons always
			   have railtype normal */
			if (rvi_u->power > 0) {
				this->compatible_railtypes |= GetRailTypeInfo(u->railtype)->powered_railtypes;
			}

			/* Some electric engines can be allowed to run on normal rail. It happens to all
			 * existing electric engines when elrails are disabled and then re-enabled */
			if (HasBit(u->flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL)) {
				u->railtype = RAILTYPE_RAIL;
				u->compatible_railtypes |= RAILTYPES_RAIL;
			}

			/* max speed is the minimum of the speed limits of all vehicles in the consist */
			if ((rvi_u->railveh_type != RAILVEH_WAGON || _settings_game.vehicle.wagon_speed_limits) && !UsesWagonOverride(u)) {
				uint16_t speed = GetVehicleProperty(u, PROP_TRAIN_SPEED, rvi_u->max_speed);
				if (speed != 0) max_speed = std::min(speed, max_speed);
			}
		}

		uint16_t new_cap = e_u->DetermineCapacity(u);
		if (allowed_changes & CCF_CAPACITY) {
			/* Update vehicle capacity. */
			if (u->cargo_cap > new_cap) u->cargo.Truncate(new_cap);
			u->refit_cap = std::min(new_cap, u->refit_cap);
			u->cargo_cap = new_cap;
		} else {
			/* Verify capacity hasn't changed. */
			if (new_cap != u->cargo_cap) ShowNewGrfVehicleError(u->engine_type, STR_NEWGRF_BROKEN, STR_NEWGRF_BROKEN_CAPACITY, GBUG_VEH_CAPACITY, true);
		}
		u->vcache.cached_cargo_age_period = GetVehicleProperty(u, PROP_TRAIN_CARGO_AGE_PERIOD, e_u->info.cargo_age_period);

		/* check the vehicle length (callback) */
		uint16_t veh_len = CALLBACK_FAILED;
		if (e_u->GetGRF() != nullptr && e_u->GetGRF()->grf_version >= 8) {
			/* Use callback 36 */
			veh_len = GetVehicleProperty(u, PROP_TRAIN_SHORTEN_FACTOR, CALLBACK_FAILED);

			if (veh_len != CALLBACK_FAILED && veh_len >= VEHICLE_LENGTH) {
				ErrorUnknownCallbackResult(e_u->GetGRFID(), CBID_VEHICLE_LENGTH, veh_len);
			}
		} else if (HasBit(e_u->info.callback_mask, CBM_VEHICLE_LENGTH)) {
			/* Use callback 11 */
			veh_len = GetVehicleCallback(CBID_VEHICLE_LENGTH, 0, 0, u->engine_type, u);
		}
		if (veh_len == CALLBACK_FAILED) veh_len = rvi_u->shorten_factor;
		veh_len = VEHICLE_LENGTH - Clamp(veh_len, 0, VEHICLE_LENGTH - 1);

		if (allowed_changes & CCF_LENGTH) {
			/* Update vehicle length. */
			u->gcache.cached_veh_length = veh_len;
		} else {
			/* Verify length hasn't changed. */
			if (veh_len != u->gcache.cached_veh_length) VehicleLengthChanged(u);
		}

		this->gcache.cached_total_length += u->gcache.cached_veh_length;
		this->InvalidateNewGRFCache();
		u->InvalidateNewGRFCache();
	}

	/* store consist weight/max speed in cache */
	this->vcache.cached_max_speed = max_speed;
	this->tcache.cached_tilt = train_can_tilt;
	this->tcache.cached_curve_speed_mod = min_curve_speed_mod;
	this->tcache.cached_max_curve_speed = this->GetCurveSpeedLimit();

	/* recalculate cached weights and power too (we do this *after* the rest, so it is known which wagons are powered and need extra weight added) */
	this->CargoChanged();

	if (this->IsFrontEngine()) {
		this->UpdateAcceleration();
		SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
		InvalidateWindowData(WC_VEHICLE_REFIT, this->index, VIWD_CONSIST_CHANGED);
		InvalidateWindowData(WC_VEHICLE_ORDERS, this->index, VIWD_CONSIST_CHANGED);
		InvalidateNewGRFInspectWindow(GSF_TRAINS, this->index);
	}
}

/**
 * Get the stop location of (the center) of the front vehicle of a train at
 * a platform of a station.
 * @param station_id     the ID of the station where we're stopping
 * @param tile           the tile where the vehicle currently is
 * @param v              the vehicle to get the stop location of
 * @param station_ahead  'return' the amount of 1/16th tiles in front of the train
 * @param station_length 'return' the station length in 1/16th tiles
 * @return the location, calculated from the begin of the station to stop at.
 */
int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, int *station_ahead, int *station_length)
{
	const Station *st = Station::Get(station_id);
	*station_ahead  = st->GetPlatformLength(tile, DirToDiagDir(v->direction)) * TILE_SIZE;
	*station_length = st->GetPlatformLength(tile) * TILE_SIZE;

	/* Default to the middle of the station for stations stops that are not in
	 * the order list like intermediate stations when non-stop is disabled */
	OrderStopLocation osl = OSL_PLATFORM_MIDDLE;
	if (v->gcache.cached_total_length >= *station_length) {
		/* The train is longer than the station, make it stop at the far end of the platform */
		osl = OSL_PLATFORM_FAR_END;
	} else if (v->current_order.IsType(OT_GOTO_STATION) && v->current_order.GetDestination() == station_id) {
		osl = v->current_order.GetStopLocation();
	}

	/* The stop location of the FRONT! of the train */
	int stop;
	switch (osl) {
		default: NOT_REACHED();

		case OSL_PLATFORM_NEAR_END:
			stop = v->gcache.cached_total_length;
			break;

		case OSL_PLATFORM_MIDDLE:
			stop = *station_length - (*station_length - v->gcache.cached_total_length) / 2;
			break;

		case OSL_PLATFORM_FAR_END:
			stop = *station_length;
			break;
	}

	/* Subtract half the front vehicle length of the train so we get the real
	 * stop location of the train. */
	return stop - (v->gcache.cached_veh_length + 1) / 2;
}


/**
 * Computes train speed limit caused by curves
 * @return imposed speed limit
 */
int Train::GetCurveSpeedLimit() const
{
	assert(this->First() == this);

	static const int absolute_max_speed = UINT16_MAX;
	int max_speed = absolute_max_speed;

	if (_settings_game.vehicle.train_acceleration_model == AM_ORIGINAL) return max_speed;

	int curvecount[2] = {0, 0};

	/* first find the curve speed limit */
	int numcurve = 0;
	int sum = 0;
	int pos = 0;
	int lastpos = -1;
	for (const Vehicle *u = this; u->Next() != nullptr; u = u->Next(), pos++) {
		Direction this_dir = u->direction;
		Direction next_dir = u->Next()->direction;

		DirDiff dirdiff = DirDifference(this_dir, next_dir);
		if (dirdiff == DIRDIFF_SAME) continue;

		if (dirdiff == DIRDIFF_45LEFT) curvecount[0]++;
		if (dirdiff == DIRDIFF_45RIGHT) curvecount[1]++;
		if (dirdiff == DIRDIFF_45LEFT || dirdiff == DIRDIFF_45RIGHT) {
			if (lastpos != -1) {
				numcurve++;
				sum += pos - lastpos;
				if (pos - lastpos == 1 && max_speed > 88) {
					max_speed = 88;
				}
			}
			lastpos = pos;
		}

		/* if we have a 90 degree turn, fix the speed limit to 60 */
		if (dirdiff == DIRDIFF_90LEFT || dirdiff == DIRDIFF_90RIGHT) {
			max_speed = 61;
		}
	}

	if (numcurve > 0 && max_speed > 88) {
		if (curvecount[0] == 1 && curvecount[1] == 1) {
			max_speed = absolute_max_speed;
		} else {
			sum /= numcurve;
			max_speed = 232 - (13 - Clamp(sum, 1, 12)) * (13 - Clamp(sum, 1, 12));
		}
	}

	if (max_speed != absolute_max_speed) {
		/* Apply the current railtype's curve speed advantage */
		const RailTypeInfo *rti = GetRailTypeInfo(GetRailType(this->tile));
		max_speed += (max_speed / 2) * rti->curve_speed;

		if (this->tcache.cached_tilt) {
			/* Apply max_speed bonus of 20% for a tilting train */
			max_speed += max_speed / 5;
		}

		/* Apply max_speed modifier (cached value is fixed-point binary with 8 fractional bits)
		 * and clamp the result to an acceptable range. */
		max_speed += (max_speed * this->tcache.cached_curve_speed_mod) / 256;
		max_speed = Clamp(max_speed, 2, absolute_max_speed);
	}

	return max_speed;
}

/**
 * Calculates the maximum speed of the vehicle under its current conditions.
 * @return Maximum speed of the vehicle.
 */
int Train::GetCurrentMaxSpeed() const
{
	int max_speed = _settings_game.vehicle.train_acceleration_model == AM_ORIGINAL ?
			this->gcache.cached_max_track_speed :
			this->tcache.cached_max_curve_speed;

	if (_settings_game.vehicle.train_acceleration_model == AM_REALISTIC && IsRailStationTile(this->tile)) {
		StationID sid = GetStationIndex(this->tile);
		if (this->current_order.ShouldStopAtStation(this, sid)) {
			int station_ahead;
			int station_length;
			int stop_at = GetTrainStopLocation(sid, this->tile, this, &station_ahead, &station_length);

			/* The distance to go is whatever is still ahead of the train minus the
			 * distance from the train's stop location to the end of the platform */
			int distance_to_go = station_ahead / TILE_SIZE - (station_length - stop_at) / TILE_SIZE;

			if (distance_to_go > 0) {
				int st_max_speed = 120;

				int delta_v = this->cur_speed / (distance_to_go + 1);
				if (max_speed > (this->cur_speed - delta_v)) {
					st_max_speed = this->cur_speed - (delta_v / 10);
				}

				st_max_speed = std::max(st_max_speed, 25 * distance_to_go);
				max_speed = std::min(max_speed, st_max_speed);
			}
		}
	}

	for (const Train *u = this; u != nullptr; u = u->Next()) {
		if (_settings_game.vehicle.train_acceleration_model == AM_REALISTIC && u->track == TRACK_BIT_DEPOT) {
			max_speed = std::min(max_speed, 61);
			break;
		}

		/* Vehicle is on the middle part of a bridge. */
		if (u->track == TRACK_BIT_WORMHOLE && !(u->vehstatus & VS_HIDDEN)) {
			max_speed = std::min<int>(max_speed, GetBridgeSpec(GetBridgeType(u->tile))->speed);
		}
	}

	max_speed = std::min<int>(max_speed, this->current_order.GetMaxSpeed());
	return std::min<int>(max_speed, this->gcache.cached_max_track_speed);
}

/** Update acceleration of the train from the cached power and weight. */
void Train::UpdateAcceleration()
{
	assert(this->IsFrontEngine() || this->IsFreeWagon());

	uint power = this->gcache.cached_power;
	uint weight = this->gcache.cached_weight;
	assert(weight != 0);
	this->acceleration = Clamp(power / weight * 4, 1, 255);
}

int Train::GetCursorImageOffset() const
{
	if (this->gcache.cached_veh_length != 8 && HasBit(this->flags, VRF_REVERSE_DIRECTION) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_RAIL_FLIPS)) {
		int reference_width = TRAININFO_DEFAULT_VEHICLE_WIDTH;

		const Engine *e = this->GetEngine();
		if (e->GetGRF() != nullptr && is_custom_sprite(e->u.rail.image_index)) {
			reference_width = e->GetGRF()->traininfo_vehicle_width;
		}

		return ScaleSpriteTrad((this->gcache.cached_veh_length - (int)VEHICLE_LENGTH) * reference_width / (int)VEHICLE_LENGTH);
	}
	return 0;
}

/**
 * Get the width of a train vehicle image in the GUI.
 * @param offset Additional offset for positioning the sprite; set to nullptr if not needed
 * @return Width in pixels
 */
int Train::GetDisplayImageWidth(Point *offset) const
{
	int reference_width = TRAININFO_DEFAULT_VEHICLE_WIDTH;
	int vehicle_pitch = 0;

	const Engine *e = this->GetEngine();
	if (e->GetGRF() != nullptr && is_custom_sprite(e->u.rail.image_index)) {
		reference_width = e->GetGRF()->traininfo_vehicle_width;
		vehicle_pitch = e->GetGRF()->traininfo_vehicle_pitch;
	}

	if (offset != nullptr) {
		if (HasBit(this->flags, VRF_REVERSE_DIRECTION) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_RAIL_FLIPS)) {
			offset->x = ScaleSpriteTrad(((int)this->gcache.cached_veh_length - (int)VEHICLE_LENGTH / 2) * reference_width / (int)VEHICLE_LENGTH);
		} else {
			offset->x = ScaleSpriteTrad(reference_width) / 2;
		}
		offset->y = ScaleSpriteTrad(vehicle_pitch);
	}
	return ScaleSpriteTrad(this->gcache.cached_veh_length * reference_width / VEHICLE_LENGTH);
}

static SpriteID GetDefaultTrainSprite(uint8_t spritenum, Direction direction)
{
	assert(IsValidImageIndex<VEH_TRAIN>(spritenum));
	return ((direction + _engine_sprite_add[spritenum]) & _engine_sprite_and[spritenum]) + _engine_sprite_base[spritenum];
}

/**
 * Get the sprite to display the train.
 * @param direction Direction of view/travel.
 * @param image_type Visualisation context.
 * @return Sprite to display.
 */
void Train::GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const
{
	uint8_t spritenum = this->spritenum;

	if (HasBit(this->flags, VRF_REVERSE_DIRECTION)) direction = ReverseDir(direction);

	if (is_custom_sprite(spritenum)) {
		GetCustomVehicleSprite(this, (Direction)(direction + 4 * IS_CUSTOM_SECONDHEAD_SPRITE(spritenum)), image_type, result);
		if (result->IsValid()) return;

		spritenum = this->GetEngine()->original_image_index;
	}

	assert(IsValidImageIndex<VEH_TRAIN>(spritenum));
	SpriteID sprite = GetDefaultTrainSprite(spritenum, direction);

	if (this->cargo.StoredCount() >= this->cargo_cap / 2U) sprite += _wagon_full_adder[spritenum];

	result->Set(sprite);
}

static void GetRailIcon(EngineID engine, bool rear_head, int &y, EngineImageType image_type, VehicleSpriteSeq *result)
{
	const Engine *e = Engine::Get(engine);
	Direction dir = rear_head ? DIR_E : DIR_W;
	uint8_t spritenum = e->u.rail.image_index;

	if (is_custom_sprite(spritenum)) {
		GetCustomVehicleIcon(engine, dir, image_type, result);
		if (result->IsValid()) {
			if (e->GetGRF() != nullptr) {
				y += ScaleSpriteTrad(e->GetGRF()->traininfo_vehicle_pitch);
			}
			return;
		}

		spritenum = Engine::Get(engine)->original_image_index;
	}

	if (rear_head) spritenum++;

	result->Set(GetDefaultTrainSprite(spritenum, DIR_W));
}

void DrawTrainEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type)
{
	if (RailVehInfo(engine)->railveh_type == RAILVEH_MULTIHEAD) {
		int yf = y;
		int yr = y;

		VehicleSpriteSeq seqf, seqr;
		GetRailIcon(engine, false, yf, image_type, &seqf);
		GetRailIcon(engine, true, yr, image_type, &seqr);

		Rect rectf, rectr;
		seqf.GetBounds(&rectf);
		seqr.GetBounds(&rectr);

		preferred_x = Clamp(preferred_x,
				left - UnScaleGUI(rectf.left) + ScaleSpriteTrad(14),
				right - UnScaleGUI(rectr.right) - ScaleSpriteTrad(15));

		seqf.Draw(preferred_x - ScaleSpriteTrad(14), yf, pal, pal == PALETTE_CRASH);
		seqr.Draw(preferred_x + ScaleSpriteTrad(15), yr, pal, pal == PALETTE_CRASH);
	} else {
		VehicleSpriteSeq seq;
		GetRailIcon(engine, false, y, image_type, &seq);

		Rect rect;
		seq.GetBounds(&rect);
		preferred_x = Clamp(preferred_x,
				left - UnScaleGUI(rect.left),
				right - UnScaleGUI(rect.right));

		seq.Draw(preferred_x, y, pal, pal == PALETTE_CRASH);
	}
}

/**
 * Get the size of the sprite of a train sprite heading west, or both heads (used for lists).
 * @param engine The engine to get the sprite from.
 * @param[out] width The width of the sprite.
 * @param[out] height The height of the sprite.
 * @param[out] xoffs Number of pixels to shift the sprite to the right.
 * @param[out] yoffs Number of pixels to shift the sprite downwards.
 * @param image_type Context the sprite is used in.
 */
void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type)
{
	int y = 0;

	VehicleSpriteSeq seq;
	GetRailIcon(engine, false, y, image_type, &seq);

	Rect rect;
	seq.GetBounds(&rect);

	width  = UnScaleGUI(rect.Width());
	height = UnScaleGUI(rect.Height());
	xoffs  = UnScaleGUI(rect.left);
	yoffs  = UnScaleGUI(rect.top);

	if (RailVehInfo(engine)->railveh_type == RAILVEH_MULTIHEAD) {
		GetRailIcon(engine, true, y, image_type, &seq);
		seq.GetBounds(&rect);

		/* Calculate values relative to an imaginary center between the two sprites. */
		width = ScaleSpriteTrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) + UnScaleGUI(rect.right) - xoffs;
		height = std::max<uint>(height, UnScaleGUI(rect.Height()));
		xoffs  = xoffs - ScaleSpriteTrad(TRAININFO_DEFAULT_VEHICLE_WIDTH) / 2;
		yoffs  = std::min(yoffs, UnScaleGUI(rect.top));
	}
}

/**
 * Build a railroad wagon.
 * @param flags    type of operation.
 * @param tile     tile of the depot where rail-vehicle is built.
 * @param e        the engine to build.
 * @param[out] ret the vehicle that has been built.
 * @return the cost of this operation or an error.
 */
static CommandCost CmdBuildRailWagon(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret)
{
	const RailVehicleInfo *rvi = &e->u.rail;

	/* Check that the wagon can drive on the track in question */
	if (!IsCompatibleRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;

	if (flags & DC_EXEC) {
		Train *v = new Train();
		*ret = v;
		v->spritenum = rvi->image_index;

		v->engine_type = e->index;
		v->gcache.first_engine = INVALID_ENGINE; // needs to be set before first callback

		DiagDirection dir = GetRailDepotDirection(tile);

		v->direction = DiagDirToDir(dir);
		v->tile = tile;

		int x = TileX(tile) * TILE_SIZE | _vehicle_initial_x_fract[dir];
		int y = TileY(tile) * TILE_SIZE | _vehicle_initial_y_fract[dir];

		v->x_pos = x;
		v->y_pos = y;
		v->z_pos = GetSlopePixelZ(x, y, true);
		v->owner = _current_company;
		v->track = TRACK_BIT_DEPOT;
		v->vehstatus = VS_HIDDEN | VS_DEFPAL;

		v->SetWagon();

		v->SetFreeWagon();
		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);

		v->cargo_type = e->GetDefaultCargoType();
		assert(IsValidCargoID(v->cargo_type));
		v->cargo_cap = rvi->capacity;
		v->refit_cap = 0;

		v->railtype = rvi->railtype;

		v->date_of_last_service = TimerGameEconomy::date;
		v->date_of_last_service_newgrf = TimerGameCalendar::date;
		v->build_year = TimerGameCalendar::year;
		v->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY);
		v->random_bits = Random();

		v->group_id = DEFAULT_GROUP;

		if (TestVehicleBuildProbability(v, v->engine_type, BuildProbabilityType::Reversed)) SetBit(v->flags, VRF_REVERSE_DIRECTION);
		AddArticulatedParts(v);

		v->UpdatePosition();
		v->First()->ConsistChanged(CCF_ARRANGE);
		UpdateTrainGroupID(v->First());

		CheckConsistencyOfArticulatedVehicle(v);

		/* Try to connect the vehicle to one of free chains of wagons. */
		for (Train *w : Train::Iterate()) {
			if (w->tile == tile &&              ///< Same depot
					w->IsFreeWagon() &&             ///< A free wagon chain
					w->engine_type == e->index &&   ///< Same type
					w->First() != v &&              ///< Don't connect to ourself
					!(w->vehstatus & VS_CRASHED)) { ///< Not crashed/flooded
				if (Command<CMD_MOVE_RAIL_VEHICLE>::Do(DC_EXEC, v->index, w->Last()->index, true).Succeeded()) {
					break;
				}
			}
		}
	}

	return CommandCost();
}

/** Move all free vehicles in the depot to the train */
void NormalizeTrainVehInDepot(const Train *u)
{
	assert(u->IsEngine());
	for (const Train *v : Train::Iterate()) {
		if (v->IsFreeWagon() && v->tile == u->tile &&
				v->track == TRACK_BIT_DEPOT) {
			if (Command<CMD_MOVE_RAIL_VEHICLE>::Do(DC_EXEC, v->index, u->index, true).Failed()) {
				break;
			}
		}
	}
}

static void AddRearEngineToMultiheadedTrain(Train *v)
{
	Train *u = new Train();
	v->value >>= 1;
	u->value = v->value;
	u->direction = v->direction;
	u->owner = v->owner;
	u->tile = v->tile;
	u->x_pos = v->x_pos;
	u->y_pos = v->y_pos;
	u->z_pos = v->z_pos;
	u->track = TRACK_BIT_DEPOT;
	u->vehstatus = v->vehstatus & ~VS_STOPPED;
	u->spritenum = v->spritenum + 1;
	u->cargo_type = v->cargo_type;
	u->cargo_subtype = v->cargo_subtype;
	u->cargo_cap = v->cargo_cap;
	u->refit_cap = v->refit_cap;
	u->railtype = v->railtype;
	u->engine_type = v->engine_type;
	u->date_of_last_service = v->date_of_last_service;
	u->date_of_last_service_newgrf = v->date_of_last_service_newgrf;
	u->build_year = v->build_year;
	u->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY);
	u->random_bits = Random();
	v->SetMultiheaded();
	u->SetMultiheaded();
	v->SetNext(u);
	if (TestVehicleBuildProbability(u, u->engine_type, BuildProbabilityType::Reversed)) SetBit(u->flags, VRF_REVERSE_DIRECTION);
	u->UpdatePosition();

	/* Now we need to link the front and rear engines together */
	v->other_multiheaded_part = u;
	u->other_multiheaded_part = v;
}

/**
 * Build a railroad vehicle.
 * @param flags    type of operation.
 * @param tile     tile of the depot where rail-vehicle is built.
 * @param e        the engine to build.
 * @param[out] ret the vehicle that has been built.
 * @return the cost of this operation or an error.
 */
CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret)
{
	const RailVehicleInfo *rvi = &e->u.rail;

	if (rvi->railveh_type == RAILVEH_WAGON) return CmdBuildRailWagon(flags, tile, e, ret);

	/* Check if depot and new engine uses the same kind of tracks *
	 * We need to see if the engine got power on the tile to avoid electric engines in non-electric depots */
	if (!HasPowerOnRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR;

	if (flags & DC_EXEC) {
		DiagDirection dir = GetRailDepotDirection(tile);
		int x = TileX(tile) * TILE_SIZE + _vehicle_initial_x_fract[dir];
		int y = TileY(tile) * TILE_SIZE + _vehicle_initial_y_fract[dir];

		Train *v = new Train();
		*ret = v;
		v->direction = DiagDirToDir(dir);
		v->tile = tile;
		v->owner = _current_company;
		v->x_pos = x;
		v->y_pos = y;
		v->z_pos = GetSlopePixelZ(x, y, true);
		v->track = TRACK_BIT_DEPOT;
		v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
		v->spritenum = rvi->image_index;
		v->cargo_type = e->GetDefaultCargoType();
		assert(IsValidCargoID(v->cargo_type));
		v->cargo_cap = rvi->capacity;
		v->refit_cap = 0;
		v->last_station_visited = INVALID_STATION;
		v->last_loading_station = INVALID_STATION;

		v->engine_type = e->index;
		v->gcache.first_engine = INVALID_ENGINE; // needs to be set before first callback

		v->reliability = e->reliability;
		v->reliability_spd_dec = e->reliability_spd_dec;
		v->max_age = e->GetLifeLengthInDays();

		v->railtype = rvi->railtype;

		v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_trains);
		v->date_of_last_service = TimerGameEconomy::date;
		v->date_of_last_service_newgrf = TimerGameCalendar::date;
		v->build_year = TimerGameCalendar::year;
		v->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY);
		v->random_bits = Random();

		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
		v->SetServiceIntervalIsPercent(Company::Get(_current_company)->settings.vehicle.servint_ispercent);

		v->group_id = DEFAULT_GROUP;

		v->SetFrontEngine();
		v->SetEngine();

		if (TestVehicleBuildProbability(v, v->engine_type, BuildProbabilityType::Reversed)) SetBit(v->flags, VRF_REVERSE_DIRECTION);
		v->UpdatePosition();

		if (rvi->railveh_type == RAILVEH_MULTIHEAD) {
			AddRearEngineToMultiheadedTrain(v);
		} else {
			AddArticulatedParts(v);
		}

		v->ConsistChanged(CCF_ARRANGE);
		UpdateTrainGroupID(v);

		CheckConsistencyOfArticulatedVehicle(v);
	}

	return CommandCost();
}

static Train *FindGoodVehiclePos(const Train *src)
{
	EngineID eng = src->engine_type;
	TileIndex tile = src->tile;

	for (Train *dst : Train::Iterate()) {
		if (dst->IsFreeWagon() && dst->tile == tile && !(dst->vehstatus & VS_CRASHED)) {
			/* check so all vehicles in the line have the same engine. */
			Train *t = dst;
			while (t->engine_type == eng) {
				t = t->Next();
				if (t == nullptr) return dst;
			}
		}
	}

	return nullptr;
}

/** Helper type for lists/vectors of trains */
typedef std::vector<Train *> TrainList;

/**
 * Make a backup of a train into a train list.
 * @param list to make the backup in
 * @param t    the train to make the backup of
 */
static void MakeTrainBackup(TrainList &list, Train *t)
{
	for (; t != nullptr; t = t->Next()) list.push_back(t);
}

/**
 * Restore the train from the backup list.
 * @param list the train to restore.
 */
static void RestoreTrainBackup(TrainList &list)
{
	/* No train, nothing to do. */
	if (list.empty()) return;

	Train *prev = nullptr;
	/* Iterate over the list and rebuild it. */
	for (Train *t : list) {
		if (prev != nullptr) {
			prev->SetNext(t);
		} else if (t->Previous() != nullptr) {
			/* Make sure the head of the train is always the first in the chain. */
			t->Previous()->SetNext(nullptr);
		}
		prev = t;
	}
}

/**
 * Remove the given wagon from its consist.
 * @param part the part of the train to remove.
 * @param chain whether to remove the whole chain.
 */
static void RemoveFromConsist(Train *part, bool chain = false)
{
	Train *tail = chain ? part->Last() : part->GetLastEnginePart();

	/* Unlink at the front, but make it point to the next
	 * vehicle after the to be remove part. */
	if (part->Previous() != nullptr) part->Previous()->SetNext(tail->Next());

	/* Unlink at the back */
	tail->SetNext(nullptr);
}

/**
 * Inserts a chain into the train at dst.
 * @param dst   the place where to append after.
 * @param chain the chain to actually add.
 */
static void InsertInConsist(Train *dst, Train *chain)
{
	/* We do not want to add something in the middle of an articulated part. */
	assert(dst != nullptr && (dst->Next() == nullptr || !dst->Next()->IsArticulatedPart()));

	chain->Last()->SetNext(dst->Next());
	dst->SetNext(chain);
}

/**
 * Normalise the dual heads in the train, i.e. if one is
 * missing move that one to this train.
 * @param t the train to normalise.
 */
static void NormaliseDualHeads(Train *t)
{
	for (; t != nullptr; t = t->GetNextVehicle()) {
		if (!t->IsMultiheaded() || !t->IsEngine()) continue;

		/* Make sure that there are no free cars before next engine */
		Train *u;
		for (u = t; u->Next() != nullptr && !u->Next()->IsEngine(); u = u->Next()) {}

		if (u == t->other_multiheaded_part) continue;

		/* Remove the part from the 'wrong' train */
		RemoveFromConsist(t->other_multiheaded_part);
		/* And add it to the 'right' train */
		InsertInConsist(u, t->other_multiheaded_part);
	}
}

/**
 * Normalise the sub types of the parts in this chain.
 * @param chain the chain to normalise.
 */
static void NormaliseSubtypes(Train *chain)
{
	/* Nothing to do */
	if (chain == nullptr) return;

	/* We must be the first in the chain. */
	assert(chain->Previous() == nullptr);

	/* Set the appropriate bits for the first in the chain. */
	if (chain->IsWagon()) {
		chain->SetFreeWagon();
	} else {
		assert(chain->IsEngine());
		chain->SetFrontEngine();
	}

	/* Now clear the bits for the rest of the chain */
	for (Train *t = chain->Next(); t != nullptr; t = t->Next()) {
		t->ClearFreeWagon();
		t->ClearFrontEngine();
	}
}

/**
 * Check/validate whether we may actually build a new train.
 * @note All vehicles are/were 'heads' of their chains.
 * @param original_dst The original destination chain.
 * @param dst          The destination chain after constructing the train.
 * @param original_src The original source chain.
 * @param src          The source chain after constructing the train.
 * @return possible error of this command.
 */
static CommandCost CheckNewTrain(Train *original_dst, Train *dst, Train *original_src, Train *src)
{
	/* Just add 'new' engines and subtract the original ones.
	 * If that's less than or equal to 0 we can be sure we did
	 * not add any engines (read: trains) along the way. */
	if ((src          != nullptr && src->IsEngine()          ? 1 : 0) +
			(dst          != nullptr && dst->IsEngine()          ? 1 : 0) -
			(original_src != nullptr && original_src->IsEngine() ? 1 : 0) -
			(original_dst != nullptr && original_dst->IsEngine() ? 1 : 0) <= 0) {
		return CommandCost();
	}

	/* Get a free unit number and check whether it's within the bounds.
	 * There will always be a maximum of one new train. */
	if (GetFreeUnitNumber(VEH_TRAIN) <= _settings_game.vehicle.max_trains) return CommandCost();

	return_cmd_error(STR_ERROR_TOO_MANY_VEHICLES_IN_GAME);
}

/**
 * Check whether the train parts can be attached.
 * @param t the train to check
 * @return possible error of this command.
 */
static CommandCost CheckTrainAttachment(Train *t)
{
	/* No multi-part train, no need to check. */
	if (t == nullptr || t->Next() == nullptr) return CommandCost();

	/* The maximum length for a train. For each part we decrease this by one
	 * and if the result is negative the train is simply too long. */
	int allowed_len = _settings_game.vehicle.max_train_length * TILE_SIZE - t->gcache.cached_veh_length;

	/* For free-wagon chains, check if they are within the max_train_length limit. */
	if (!t->IsEngine()) {
		t = t->Next();
		while (t != nullptr) {
			allowed_len -= t->gcache.cached_veh_length;

			t = t->Next();
		}

		if (allowed_len < 0) return_cmd_error(STR_ERROR_TRAIN_TOO_LONG);
		return CommandCost();
	}

	Train *head = t;
	Train *prev = t;

	/* Break the prev -> t link so it always holds within the loop. */
	t = t->Next();
	prev->SetNext(nullptr);

	/* Make sure the cache is cleared. */
	head->InvalidateNewGRFCache();

	while (t != nullptr) {
		allowed_len -= t->gcache.cached_veh_length;

		Train *next = t->Next();

		/* Unlink the to-be-added piece; it is already unlinked from the previous
		 * part due to the fact that the prev -> t link is broken. */
		t->SetNext(nullptr);

		/* Don't check callback for articulated or rear dual headed parts */
		if (!t->IsArticulatedPart() && !t->IsRearDualheaded()) {
			/* Back up and clear the first_engine data to avoid using wagon override group */
			EngineID first_engine = t->gcache.first_engine;
			t->gcache.first_engine = INVALID_ENGINE;

			/* We don't want the cache to interfere. head's cache is cleared before
			 * the loop and after each callback does not need to be cleared here. */
			t->InvalidateNewGRFCache();

			uint16_t callback = GetVehicleCallbackParent(CBID_TRAIN_ALLOW_WAGON_ATTACH, 0, 0, head->engine_type, t, head);

			/* Restore original first_engine data */
			t->gcache.first_engine = first_engine;

			/* We do not want to remember any cached variables from the test run */
			t->InvalidateNewGRFCache();
			head->InvalidateNewGRFCache();

			if (callback != CALLBACK_FAILED) {
				/* A failing callback means everything is okay */
				StringID error = STR_NULL;

				if (head->GetGRF()->grf_version < 8) {
					if (callback == 0xFD) error = STR_ERROR_INCOMPATIBLE_RAIL_TYPES;
					if (callback  < 0xFD) error = GetGRFStringID(head->GetGRFID(), 0xD000 + callback);
					if (callback >= 0x100) ErrorUnknownCallbackResult(head->GetGRFID(), CBID_TRAIN_ALLOW_WAGON_ATTACH, callback);
				} else {
					if (callback < 0x400) {
						error = GetGRFStringID(head->GetGRFID(), 0xD000 + callback);
					} else {
						switch (callback) {
							case 0x400: // allow if railtypes match (always the case for OpenTTD)
							case 0x401: // allow
								break;

							default:    // unknown reason -> disallow
							case 0x402: // disallow attaching
								error = STR_ERROR_INCOMPATIBLE_RAIL_TYPES;
								break;
						}
					}
				}

				if (error != STR_NULL) return_cmd_error(error);
			}
		}

		/* And link it to the new part. */
		prev->SetNext(t);
		prev = t;
		t = next;
	}

	if (allowed_len < 0) return_cmd_error(STR_ERROR_TRAIN_TOO_LONG);
	return CommandCost();
}

/**
 * Validate whether we are going to create valid trains.
 * @note All vehicles are/were 'heads' of their chains.
 * @param original_dst The original destination chain.
 * @param dst          The destination chain after constructing the train.
 * @param original_src The original source chain.
 * @param src          The source chain after constructing the train.
 * @param check_limit  Whether to check the vehicle limit.
 * @return possible error of this command.
 */
static CommandCost ValidateTrains(Train *original_dst, Train *dst, Train *original_src, Train *src, bool check_limit)
{
	/* Check whether we may actually construct the trains. */
	CommandCost ret = CheckTrainAttachment(src);
	if (ret.Failed()) return ret;
	ret = CheckTrainAttachment(dst);
	if (ret.Failed()) return ret;

	/* Check whether we need to build a new train. */
	return check_limit ? CheckNewTrain(original_dst, dst, original_src, src) : CommandCost();
}

/**
 * Arrange the trains in the wanted way.
 * @param dst_head   The destination chain of the to be moved vehicle.
 * @param dst        The destination for the to be moved vehicle.
 * @param src_head   The source chain of the to be moved vehicle.
 * @param src        The to be moved vehicle.
 * @param move_chain Whether to move all vehicles after src or not.
 */
static void ArrangeTrains(Train **dst_head, Train *dst, Train **src_head, Train *src, bool move_chain)
{
	/* First determine the front of the two resulting trains */
	if (*src_head == *dst_head) {
		/* If we aren't moving part(s) to a new train, we are just moving the
		 * front back and there is not destination head. */
		*dst_head = nullptr;
	} else if (*dst_head == nullptr) {
		/* If we are moving to a new train the head of the move train would become
		 * the head of the new vehicle. */
		*dst_head = src;
	}

	if (src == *src_head) {
		/* If we are moving the front of a train then we are, in effect, creating
		 * a new head for the train. Point to that. Unless we are moving the whole
		 * train in which case there is not 'source' train anymore.
		 * In case we are a multiheaded part we want the complete thing to come
		 * with us, so src->GetNextUnit(), however... when we are e.g. a wagon
		 * that is followed by a rear multihead we do not want to include that. */
		*src_head = move_chain ? nullptr :
				(src->IsMultiheaded() ? src->GetNextUnit() : src->GetNextVehicle());
	}

	/* Now it's just simply removing the part that we are going to move from the
	 * source train and *if* the destination is a not a new train add the chain
	 * at the destination location. */
	RemoveFromConsist(src, move_chain);
	if (*dst_head != src) InsertInConsist(dst, src);

	/* Now normalise the dual heads, that is move the dual heads around in such
	 * a way that the head and rear of a dual head are in the same train */
	NormaliseDualHeads(*src_head);
	NormaliseDualHeads(*dst_head);
}

/**
 * Normalise the head of the train again, i.e. that is tell the world that
 * we have changed and update all kinds of variables.
 * @param head the train to update.
 */
static void NormaliseTrainHead(Train *head)
{
	/* Not much to do! */
	if (head == nullptr) return;

	/* Tell the 'world' the train changed. */
	head->ConsistChanged(CCF_ARRANGE);
	UpdateTrainGroupID(head);

	/* Not a front engine, i.e. a free wagon chain. No need to do more. */
	if (!head->IsFrontEngine()) return;

	/* Update the refit button and window */
	InvalidateWindowData(WC_VEHICLE_REFIT, head->index, VIWD_CONSIST_CHANGED);
	SetWindowWidgetDirty(WC_VEHICLE_VIEW, head->index, WID_VV_REFIT);

	/* If we don't have a unit number yet, set one. */
	if (head->unitnumber != 0) return;
	head->unitnumber = GetFreeUnitNumber(VEH_TRAIN);
}

/**
 * Move a rail vehicle around inside the depot.
 * @param flags type of operation
 *              Note: DC_AUTOREPLACE is set when autoreplace tries to undo its modifications or moves vehicles to temporary locations inside the depot.
 * @param src_veh source vehicle index
 * @param dest_veh what wagon to put the source wagon AFTER, XXX - INVALID_VEHICLE to make a new line
 * @param move_chain move all vehicles following the source vehicle
 * @return the cost of this operation or an error
 */
CommandCost CmdMoveRailVehicle(DoCommandFlag flags, VehicleID src_veh, VehicleID dest_veh, bool move_chain)
{
	Train *src = Train::GetIfValid(src_veh);
	if (src == nullptr) return CMD_ERROR;

	CommandCost ret = CheckOwnership(src->owner);
	if (ret.Failed()) return ret;

	/* Do not allow moving crashed vehicles inside the depot, it is likely to cause asserts later */
	if (src->vehstatus & VS_CRASHED) return CMD_ERROR;

	/* if nothing is selected as destination, try and find a matching vehicle to drag to. */
	Train *dst;
	if (dest_veh == INVALID_VEHICLE) {
		dst = (src->IsEngine() || (flags & DC_AUTOREPLACE)) ? nullptr : FindGoodVehiclePos(src);
	} else {
		dst = Train::GetIfValid(dest_veh);
		if (dst == nullptr) return CMD_ERROR;

		ret = CheckOwnership(dst->owner);
		if (ret.Failed()) return ret;

		/* Do not allow appending to crashed vehicles, too */
		if (dst->vehstatus & VS_CRASHED) return CMD_ERROR;
	}

	/* if an articulated part is being handled, deal with its parent vehicle */
	src = src->GetFirstEnginePart();
	if (dst != nullptr) {
		dst = dst->GetFirstEnginePart();
	}

	/* don't move the same vehicle.. */
	if (src == dst) return CommandCost();

	/* locate the head of the two chains */
	Train *src_head = src->First();
	Train *dst_head;
	if (dst != nullptr) {
		dst_head = dst->First();
		if (dst_head->tile != src_head->tile) return CMD_ERROR;
		/* Now deal with articulated part of destination wagon */
		dst = dst->GetLastEnginePart();
	} else {
		dst_head = nullptr;
	}

	if (src->IsRearDualheaded()) return_cmd_error(STR_ERROR_REAR_ENGINE_FOLLOW_FRONT);

	/* When moving all wagons, we can't have the same src_head and dst_head */
	if (move_chain && src_head == dst_head) return CommandCost();

	/* When moving a multiheaded part to be place after itself, bail out. */
	if (!move_chain && dst != nullptr && dst->IsRearDualheaded() && src == dst->other_multiheaded_part) return CommandCost();

	/* Check if all vehicles in the source train are stopped inside a depot. */
	if (!src_head->IsStoppedInDepot()) return_cmd_error(STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT);

	/* Check if all vehicles in the destination train are stopped inside a depot. */
	if (dst_head != nullptr && !dst_head->IsStoppedInDepot()) return_cmd_error(STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT);

	/* First make a backup of the order of the trains. That way we can do
	 * whatever we want with the order and later on easily revert. */
	TrainList original_src;
	TrainList original_dst;

	MakeTrainBackup(original_src, src_head);
	MakeTrainBackup(original_dst, dst_head);

	/* Also make backup of the original heads as ArrangeTrains can change them.
	 * For the destination head we do not care if it is the same as the source
	 * head because in that case it's just a copy. */
	Train *original_src_head = src_head;
	Train *original_dst_head = (dst_head == src_head ? nullptr : dst_head);

	/* We want this information from before the rearrangement, but execute this after the validation.
	 * original_src_head can't be nullptr; src is by definition != nullptr, so src_head can't be nullptr as
	 * src->GetFirst() always yields non-nullptr, so eventually original_src_head != nullptr as well. */
	bool original_src_head_front_engine = original_src_head->IsFrontEngine();
	bool original_dst_head_front_engine = original_dst_head != nullptr && original_dst_head->IsFrontEngine();

	/* (Re)arrange the trains in the wanted arrangement. */
	ArrangeTrains(&dst_head, dst, &src_head, src, move_chain);

	if ((flags & DC_AUTOREPLACE) == 0) {
		/* If the autoreplace flag is set we do not need to test for the validity
		 * because we are going to revert the train to its original state. As we
		 * assume the original state was correct autoreplace can skip this. */
		ret = ValidateTrains(original_dst_head, dst_head, original_src_head, src_head, true);
		if (ret.Failed()) {
			/* Restore the train we had. */
			RestoreTrainBackup(original_src);
			RestoreTrainBackup(original_dst);
			return ret;
		}
	}

	/* do it? */
	if (flags & DC_EXEC) {
		/* Remove old heads from the statistics */
		if (original_src_head_front_engine) GroupStatistics::CountVehicle(original_src_head, -1);
		if (original_dst_head_front_engine) GroupStatistics::CountVehicle(original_dst_head, -1);

		/* First normalise the sub types of the chains. */
		NormaliseSubtypes(src_head);
		NormaliseSubtypes(dst_head);

		/* There are 14 different cases:
		 *  1) front engine gets moved to a new train, it stays a front engine.
		 *     a) the 'next' part is a wagon that becomes a free wagon chain.
		 *     b) the 'next' part is an engine that becomes a front engine.
		 *     c) there is no 'next' part, nothing else happens
		 *  2) front engine gets moved to another train, it is not a front engine anymore
		 *     a) the 'next' part is a wagon that becomes a free wagon chain.
		 *     b) the 'next' part is an engine that becomes a front engine.
		 *     c) there is no 'next' part, nothing else happens
		 *  3) front engine gets moved to later in the current train, it is not a front engine anymore.
		 *     a) the 'next' part is a wagon that becomes a free wagon chain.
		 *     b) the 'next' part is an engine that becomes a front engine.
		 *  4) free wagon gets moved
		 *     a) the 'next' part is a wagon that becomes a free wagon chain.
		 *     b) the 'next' part is an engine that becomes a front engine.
		 *     c) there is no 'next' part, nothing else happens
		 *  5) non front engine gets moved and becomes a new train, nothing else happens
		 *  6) non front engine gets moved within a train / to another train, nothing happens
		 *  7) wagon gets moved, nothing happens
		 */
		if (src == original_src_head && src->IsEngine() && !src->IsFrontEngine()) {
			/* Cases #2 and #3: the front engine gets trashed. */
			CloseWindowById(WC_VEHICLE_VIEW, src->index);
			CloseWindowById(WC_VEHICLE_ORDERS, src->index);
			CloseWindowById(WC_VEHICLE_REFIT, src->index);
			CloseWindowById(WC_VEHICLE_DETAILS, src->index);
			CloseWindowById(WC_VEHICLE_TIMETABLE, src->index);
			DeleteNewGRFInspectWindow(GSF_TRAINS, src->index);
			SetWindowDirty(WC_COMPANY, _current_company);

			if (src_head != nullptr && src_head->IsFrontEngine()) {
				/* Cases #?b: Transfer order, unit number and other stuff
				 * to the new front engine. */
				src_head->orders = src->orders;
				if (src_head->orders != nullptr) src_head->AddToShared(src);
				src_head->CopyVehicleConfigAndStatistics(src);
			}
			/* Remove stuff not valid anymore for non-front engines. */
			DeleteVehicleOrders(src);
			src->unitnumber = 0;
			src->name.clear();
		}

		/* We weren't a front engine but are becoming one. So
		 * we should be put in the default group. */
		if (original_src_head != src && dst_head == src) {
			SetTrainGroupID(src, DEFAULT_GROUP);
			SetWindowDirty(WC_COMPANY, _current_company);
		}

		/* Add new heads to statistics */
		if (src_head != nullptr && src_head->IsFrontEngine()) GroupStatistics::CountVehicle(src_head, 1);
		if (dst_head != nullptr && dst_head->IsFrontEngine()) GroupStatistics::CountVehicle(dst_head, 1);

		/* Handle 'new engine' part of cases #1b, #2b, #3b, #4b and #5 in NormaliseTrainHead. */
		NormaliseTrainHead(src_head);
		NormaliseTrainHead(dst_head);

		if ((flags & DC_NO_CARGO_CAP_CHECK) == 0) {
			CheckCargoCapacity(src_head);
			CheckCargoCapacity(dst_head);
		}

		if (src_head != nullptr) src_head->First()->MarkDirty();
		if (dst_head != nullptr) dst_head->First()->MarkDirty();

		/* We are undoubtedly changing something in the depot and train list. */
		InvalidateWindowData(WC_VEHICLE_DEPOT, src->tile);
		InvalidateWindowClassesData(WC_TRAINS_LIST, 0);
	} else {
		/* We don't want to execute what we're just tried. */
		RestoreTrainBackup(original_src);
		RestoreTrainBackup(original_dst);
	}

	return CommandCost();
}

/**
 * Sell a (single) train wagon/engine.
 * @param flags type of operation
 * @param t     the train wagon to sell
 * @param sell_chain  the selling mode
 * - sell_chain = false: only sell the single dragged wagon/engine (and any belonging rear-engines)
 * - sell_chain = true:  sell the vehicle and all vehicles following it in the chain
 *                       if the wagon is dragged, don't delete the possibly belonging rear-engine to some front
 * @param backup_order make order backup?
 * @param user  the user for the order backup.
 * @return the cost of this operation or an error
 */
CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, bool sell_chain, bool backup_order, ClientID user)
{
	Train *v = Train::From(t)->GetFirstEnginePart();
	Train *first = v->First();

	if (v->IsRearDualheaded()) return_cmd_error(STR_ERROR_REAR_ENGINE_FOLLOW_FRONT);

	/* First make a backup of the order of the train. That way we can do
	 * whatever we want with the order and later on easily revert. */
	TrainList original;
	MakeTrainBackup(original, first);

	/* We need to keep track of the new head and the head of what we're going to sell. */
	Train *new_head = first;
	Train *sell_head = nullptr;

	/* Split the train in the wanted way. */
	ArrangeTrains(&sell_head, nullptr, &new_head, v, sell_chain);

	/* We don't need to validate the second train; it's going to be sold. */
	CommandCost ret = ValidateTrains(nullptr, nullptr, first, new_head, (flags & DC_AUTOREPLACE) == 0);
	if (ret.Failed()) {
		/* Restore the train we had. */
		RestoreTrainBackup(original);
		return ret;
	}

	if (first->orders == nullptr && !OrderList::CanAllocateItem()) {
		/* Restore the train we had. */
		RestoreTrainBackup(original);
		return_cmd_error(STR_ERROR_NO_MORE_SPACE_FOR_ORDERS);
	}

	CommandCost cost(EXPENSES_NEW_VEHICLES);
	for (Train *part = sell_head; part != nullptr; part = part->Next()) cost.AddCost(-part->value);

	/* do it? */
	if (flags & DC_EXEC) {
		/* First normalise the sub types of the chain. */
		NormaliseSubtypes(new_head);

		if (v == first && !sell_chain && new_head != nullptr && new_head->IsFrontEngine()) {
			if (v->IsEngine()) {
				/* We are selling the front engine. In this case we want to
				 * 'give' the order, unit number and such to the new head. */
				new_head->orders = first->orders;
				new_head->AddToShared(first);
				DeleteVehicleOrders(first);

				/* Copy other important data from the front engine */
				new_head->CopyVehicleConfigAndStatistics(first);
			}
			GroupStatistics::CountVehicle(new_head, 1); // after copying over the profit, if required
		} else if (v->IsPrimaryVehicle() && backup_order) {
			OrderBackup::Backup(v, user);
		}

		/* We need to update the information about the train. */
		NormaliseTrainHead(new_head);

		/* We are undoubtedly changing something in the depot and train list. */
		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
		InvalidateWindowClassesData(WC_TRAINS_LIST, 0);

		/* Actually delete the sold 'goods' */
		delete sell_head;
	} else {
		/* We don't want to execute what we're just tried. */
		RestoreTrainBackup(original);
	}

	return cost;
}

void Train::UpdateDeltaXY()
{
	/* Set common defaults. */
	this->x_offs    = -1;
	this->y_offs    = -1;
	this->x_extent  =  3;
	this->y_extent  =  3;
	this->z_extent  =  6;
	this->x_bb_offs =  0;
	this->y_bb_offs =  0;

	/* Set if flipped and engine is NOT flagged with custom flip handling. */
	int flipped = HasBit(this->flags, VRF_REVERSE_DIRECTION) && !HasBit(EngInfo(this->engine_type)->misc_flags, EF_RAIL_FLIPS);
	/* If flipped and vehicle length is odd, we need to adjust the bounding box offset slightly. */
	int flip_offs = flipped && (this->gcache.cached_veh_length & 1);

	Direction dir = this->direction;
	if (flipped) dir = ReverseDir(dir);

	if (!IsDiagonalDirection(dir)) {
		static const int _sign_table[] =
		{
			/* x, y */
			-1, -1, // DIR_N
			-1,  1, // DIR_E
			 1,  1, // DIR_S
			 1, -1, // DIR_W
		};

		int half_shorten = (VEHICLE_LENGTH - this->gcache.cached_veh_length + flipped) / 2;

		/* For all straight directions, move the bound box to the centre of the vehicle, but keep the size. */
		this->x_offs -= half_shorten * _sign_table[dir];
		this->y_offs -= half_shorten * _sign_table[dir + 1];
		this->x_extent += this->x_bb_offs = half_shorten * _sign_table[dir];
		this->y_extent += this->y_bb_offs = half_shorten * _sign_table[dir + 1];
	} else {
		switch (dir) {
				/* Shorten southern corner of the bounding box according the vehicle length
				 * and center the bounding box on the vehicle. */
			case DIR_NE:
				this->x_offs    = 1 - (this->gcache.cached_veh_length + 1) / 2 + flip_offs;
				this->x_extent  = this->gcache.cached_veh_length - 1;
				this->x_bb_offs = -1;
				break;

			case DIR_NW:
				this->y_offs    = 1 - (this->gcache.cached_veh_length + 1) / 2 + flip_offs;
				this->y_extent  = this->gcache.cached_veh_length - 1;
				this->y_bb_offs = -1;
				break;

				/* Move northern corner of the bounding box down according to vehicle length
				 * and center the bounding box on the vehicle. */
			case DIR_SW:
				this->x_offs    = 1 + (this->gcache.cached_veh_length + 1) / 2 - VEHICLE_LENGTH - flip_offs;
				this->x_extent  = VEHICLE_LENGTH - 1;
				this->x_bb_offs = VEHICLE_LENGTH - this->gcache.cached_veh_length - 1;
				break;

			case DIR_SE:
				this->y_offs    = 1 + (this->gcache.cached_veh_length + 1) / 2 - VEHICLE_LENGTH - flip_offs;
				this->y_extent  = VEHICLE_LENGTH - 1;
				this->y_bb_offs = VEHICLE_LENGTH - this->gcache.cached_veh_length - 1;
				break;

			default:
				NOT_REACHED();
		}
	}
}

/**
 * Mark a train as stuck and stop it if it isn't stopped right now.
 * @param v %Train to mark as being stuck.
 */
static void MarkTrainAsStuck(Train *v)
{
	if (!HasBit(v->flags, VRF_TRAIN_STUCK)) {
		/* It is the first time the problem occurred, set the "train stuck" flag. */
		SetBit(v->flags, VRF_TRAIN_STUCK);

		v->wait_counter = 0;

		/* Stop train */
		v->cur_speed = 0;
		v->subspeed = 0;
		v->SetLastSpeed();

		SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
	}
}

/**
 * Swap the two up/down flags in two ways:
 * - Swap values of \a swap_flag1 and \a swap_flag2, and
 * - If going up previously (#GVF_GOINGUP_BIT set), the #GVF_GOINGDOWN_BIT is set, and vice versa.
 * @param[in,out] swap_flag1 First train flag.
 * @param[in,out] swap_flag2 Second train flag.
 */
static void SwapTrainFlags(uint16_t *swap_flag1, uint16_t *swap_flag2)
{
	uint16_t flag1 = *swap_flag1;
	uint16_t flag2 = *swap_flag2;

	/* Clear the flags */
	ClrBit(*swap_flag1, GVF_GOINGUP_BIT);
	ClrBit(*swap_flag1, GVF_GOINGDOWN_BIT);
	ClrBit(*swap_flag2, GVF_GOINGUP_BIT);
	ClrBit(*swap_flag2, GVF_GOINGDOWN_BIT);

	/* Reverse the rail-flags (if needed) */
	if (HasBit(flag1, GVF_GOINGUP_BIT)) {
		SetBit(*swap_flag2, GVF_GOINGDOWN_BIT);
	} else if (HasBit(flag1, GVF_GOINGDOWN_BIT)) {
		SetBit(*swap_flag2, GVF_GOINGUP_BIT);
	}
	if (HasBit(flag2, GVF_GOINGUP_BIT)) {
		SetBit(*swap_flag1, GVF_GOINGDOWN_BIT);
	} else if (HasBit(flag2, GVF_GOINGDOWN_BIT)) {
		SetBit(*swap_flag1, GVF_GOINGUP_BIT);
	}
}

/**
 * Updates some variables after swapping the vehicle.
 * @param v swapped vehicle
 */
static void UpdateStatusAfterSwap(Train *v)
{
	/* Reverse the direction. */
	if (v->track != TRACK_BIT_DEPOT) v->direction = ReverseDir(v->direction);

	/* Call the proper EnterTile function unless we are in a wormhole. */
	if (v->track != TRACK_BIT_WORMHOLE) {
		VehicleEnterTile(v, v->tile, v->x_pos, v->y_pos);
	} else {
		/* VehicleEnter_TunnelBridge() sets TRACK_BIT_WORMHOLE when the vehicle
		 * is on the last bit of the bridge head (frame == TILE_SIZE - 1).
		 * If we were swapped with such a vehicle, we have set TRACK_BIT_WORMHOLE,
		 * when we shouldn't have. Check if this is the case. */
		TileIndex vt = TileVirtXY(v->x_pos, v->y_pos);
		if (IsTileType(vt, MP_TUNNELBRIDGE)) {
			VehicleEnterTile(v, vt, v->x_pos, v->y_pos);
			if (v->track != TRACK_BIT_WORMHOLE && IsBridgeTile(v->tile)) {
				/* We have just left the wormhole, possibly set the
				 * "goingdown" bit. UpdateInclination() can be used
				 * because we are at the border of the tile. */
				v->UpdatePosition();
				v->UpdateInclination(true, true);
				return;
			}
		}
	}

	v->UpdatePosition();
	v->UpdateViewport(true, true);
}

/**
 * Swap vehicles \a l and \a r in consist \a v, and reverse their direction.
 * @param v Consist to change.
 * @param l %Vehicle index in the consist of the first vehicle.
 * @param r %Vehicle index in the consist of the second vehicle.
 */
void ReverseTrainSwapVeh(Train *v, int l, int r)
{
	Train *a, *b;

	/* locate vehicles to swap */
	for (a = v; l != 0; l--) a = a->Next();
	for (b = v; r != 0; r--) b = b->Next();

	if (a != b) {
		/* swap the hidden bits */
		{
			uint16_t tmp = (a->vehstatus & ~VS_HIDDEN) | (b->vehstatus & VS_HIDDEN);
			b->vehstatus = (b->vehstatus & ~VS_HIDDEN) | (a->vehstatus & VS_HIDDEN);
			a->vehstatus = tmp;
		}

		Swap(a->track, b->track);
		Swap(a->direction, b->direction);
		Swap(a->x_pos, b->x_pos);
		Swap(a->y_pos, b->y_pos);
		Swap(a->tile,  b->tile);
		Swap(a->z_pos, b->z_pos);

		SwapTrainFlags(&a->gv_flags, &b->gv_flags);

		UpdateStatusAfterSwap(a);
		UpdateStatusAfterSwap(b);
	} else {
		/* Swap GVF_GOINGUP_BIT/GVF_GOINGDOWN_BIT.
		 * This is a little bit redundant way, a->gv_flags will
		 * be (re)set twice, but it reduces code duplication */
		SwapTrainFlags(&a->gv_flags, &a->gv_flags);
		UpdateStatusAfterSwap(a);
	}
}


/**
 * Check if the vehicle is a train
 * @param v vehicle on tile
 * @return v if it is a train, nullptr otherwise
 */
static Vehicle *TrainOnTileEnum(Vehicle *v, void *)
{
	return (v->type == VEH_TRAIN) ? v : nullptr;
}

/**
 * Check if a level crossing tile has a train on it
 * @param tile tile to test
 * @return true if a train is on the crossing
 * @pre tile is a level crossing
 */
bool TrainOnCrossing(TileIndex tile)
{
	assert(IsLevelCrossingTile(tile));

	return HasVehicleOnPos(tile, nullptr, &TrainOnTileEnum);
}


/**
 * Checks if a train is approaching a rail-road crossing
 * @param v vehicle on tile
 * @param data tile with crossing we are testing
 * @return v if it is approaching a crossing, nullptr otherwise
 */
static Vehicle *TrainApproachingCrossingEnum(Vehicle *v, void *data)
{
	if (v->type != VEH_TRAIN || (v->vehstatus & VS_CRASHED)) return nullptr;

	Train *t = Train::From(v);
	if (!t->IsFrontEngine()) return nullptr;

	TileIndex tile = *(TileIndex *)data;

	if (TrainApproachingCrossingTile(t) != tile) return nullptr;

	return t;
}


/**
 * Finds a vehicle approaching rail-road crossing
 * @param tile tile to test
 * @return true if a vehicle is approaching the crossing
 * @pre tile is a rail-road crossing
 */
static bool TrainApproachingCrossing(TileIndex tile)
{
	assert(IsLevelCrossingTile(tile));

	DiagDirection dir = AxisToDiagDir(GetCrossingRailAxis(tile));
	TileIndex tile_from = tile + TileOffsByDiagDir(dir);

	if (HasVehicleOnPos(tile_from, &tile, &TrainApproachingCrossingEnum)) return true;

	dir = ReverseDiagDir(dir);
	tile_from = tile + TileOffsByDiagDir(dir);

	return HasVehicleOnPos(tile_from, &tile, &TrainApproachingCrossingEnum);
}

/**
 * Check if a level crossing should be barred.
 * @param tile The tile to check.
 * @return True if the crossing should be barred, else false.
 */
static inline bool CheckLevelCrossing(TileIndex tile)
{
	/* reserved || train on crossing || train approaching crossing */
	return HasCrossingReservation(tile) || TrainOnCrossing(tile) || TrainApproachingCrossing(tile);
}

/**
 * Sets a level crossing tile to the correct state.
 * @param tile Tile to update.
 * @param sound Should we play sound?
 * @param force_barred Should we set the crossing to barred?
 * @pre tile is a rail-road crossing.
 */
static void UpdateLevelCrossingTile(TileIndex tile, bool sound, bool force_barred)
{
	assert(IsLevelCrossingTile(tile));
	bool set_barred;

	/* We force the crossing to be barred when an adjacent crossing is barred, otherwise let it decide for itself. */
	set_barred = force_barred || CheckLevelCrossing(tile);

	/* The state has changed */
	if (set_barred != IsCrossingBarred(tile)) {
		if (set_barred && sound && _settings_client.sound.ambient) SndPlayTileFx(SND_0E_LEVEL_CROSSING, tile);
		SetCrossingBarred(tile, set_barred);
		MarkTileDirtyByTile(tile);
	}
}

/**
 * Update a level crossing to barred or open (crossing may include multiple adjacent tiles).
 * @param tile Tile which causes the update.
 * @param sound Should we play sound?
 * @param force_bar Should we force the crossing to be barred?
 */
void UpdateLevelCrossing(TileIndex tile, bool sound, bool force_bar)
{
	if (!IsLevelCrossingTile(tile)) return;

	bool forced_state = force_bar;

	const Axis axis = GetCrossingRoadAxis(tile);
	const DiagDirection dir1 = AxisToDiagDir(axis);
	const DiagDirection dir2 = ReverseDiagDir(dir1);

	/* Check if an adjacent crossing is barred. */
	for (DiagDirection dir : { dir1, dir2 }) {
		for (TileIndex t = tile; !forced_state && t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, dir)) {
			forced_state |= CheckLevelCrossing(t);
		}
	}

	/* Now that we know whether all tiles in this crossing should be barred or open,
	 * we need to update those tiles. We start with the tile itself, then look along the road axis. */
	UpdateLevelCrossingTile(tile, sound, forced_state);
	for (DiagDirection dir : { dir1, dir2 }) {
		for (TileIndex t = TileAddByDiagDir(tile, dir); t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == axis; t = TileAddByDiagDir(t, dir)) {
			UpdateLevelCrossingTile(t, sound, forced_state);
		}
	}
}

/**
 * Find adjacent level crossing tiles in this multi-track crossing and mark them dirty.
 * @param tile The tile which causes the update.
 * @param road_axis The road axis.
 */
void MarkDirtyAdjacentLevelCrossingTiles(TileIndex tile, Axis road_axis)
{
	const DiagDirection dir1 = AxisToDiagDir(road_axis);
	const DiagDirection dir2 = ReverseDiagDir(dir1);
	for (DiagDirection dir : { dir1, dir2 }) {
		const TileIndex t = TileAddByDiagDir(tile, dir);
		if (t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) {
			MarkTileDirtyByTile(t);
		}
	}
}

/**
 * Update adjacent level crossing tiles in this multi-track crossing, due to removal of a level crossing tile.
 * @param tile The crossing tile which has been or is about to be removed, and which caused the update.
 * @param road_axis The road axis.
 */
void UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval(TileIndex tile, Axis road_axis)
{
	const DiagDirection dir1 = AxisToDiagDir(road_axis);
	const DiagDirection dir2 = ReverseDiagDir(dir1);
	for (DiagDirection dir : { dir1, dir2 }) {
		const TileIndexDiff diff = TileOffsByDiagDir(dir);
		bool occupied = false;
		for (TileIndex t = tile + diff; t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) {
			occupied |= CheckLevelCrossing(t);
		}
		if (occupied) {
			/* Mark the immediately adjacent tile dirty */
			const TileIndex t = tile + diff;
			if (t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) {
				MarkTileDirtyByTile(t);
			}
		} else {
			/* Unbar the crossing tiles in this direction as necessary */
			for (TileIndex t = tile + diff; t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) {
				if (IsCrossingBarred(t)) {
					/* The crossing tile is barred, unbar it and continue to check the next tile */
					SetCrossingBarred(t, false);
					MarkTileDirtyByTile(t);
				} else {
					/* The crossing tile is already unbarred, mark the tile dirty and stop checking */
					MarkTileDirtyByTile(t);
					break;
				}
			}
		}
	}
}

/**
 * Bars crossing and plays ding-ding sound if not barred already
 * @param tile tile with crossing
 * @pre tile is a rail-road crossing
 */
static inline void MaybeBarCrossingWithSound(TileIndex tile)
{
	if (!IsCrossingBarred(tile)) {
		SetCrossingReservation(tile, true);
		UpdateLevelCrossing(tile, true);
	}
}


/**
 * Advances wagons for train reversing, needed for variable length wagons.
 * This one is called before the train is reversed.
 * @param v First vehicle in chain
 */
static void AdvanceWagonsBeforeSwap(Train *v)
{
	Train *base = v;
	Train *first = base; // first vehicle to move
	Train *last = v->Last(); // last vehicle to move
	uint length = CountVehiclesInChain(v);

	while (length > 2) {
		last = last->Previous();
		first = first->Next();

		int differential = base->CalcNextVehicleOffset() - last->CalcNextVehicleOffset();

		/* do not update images now
		 * negative differential will be handled in AdvanceWagonsAfterSwap() */
		for (int i = 0; i < differential; i++) TrainController(first, last->Next());

		base = first; // == base->Next()
		length -= 2;
	}
}


/**
 * Advances wagons for train reversing, needed for variable length wagons.
 * This one is called after the train is reversed.
 * @param v First vehicle in chain
 */
static void AdvanceWagonsAfterSwap(Train *v)
{
	/* first of all, fix the situation when the train was entering a depot */
	Train *dep = v; // last vehicle in front of just left depot
	while (dep->Next() != nullptr && (dep->track == TRACK_BIT_DEPOT || dep->Next()->track != TRACK_BIT_DEPOT)) {
		dep = dep->Next(); // find first vehicle outside of a depot, with next vehicle inside a depot
	}

	Train *leave = dep->Next(); // first vehicle in a depot we are leaving now

	if (leave != nullptr) {
		/* 'pull' next wagon out of the depot, so we won't miss it (it could stay in depot forever) */
		int d = TicksToLeaveDepot(dep);

		if (d <= 0) {
			leave->vehstatus &= ~VS_HIDDEN; // move it out of the depot
			leave->track = TrackToTrackBits(GetRailDepotTrack(leave->tile));
			for (int i = 0; i >= d; i--) TrainController(leave, nullptr); // maybe move it, and maybe let another wagon leave
		}
	} else {
		dep = nullptr; // no vehicle in a depot, so no vehicle leaving a depot
	}

	Train *base = v;
	Train *first = base; // first vehicle to move
	Train *last = v->Last(); // last vehicle to move
	uint length = CountVehiclesInChain(v);

	/* We have to make sure all wagons that leave a depot because of train reversing are moved correctly
	 * they have already correct spacing, so we have to make sure they are moved how they should */
	bool nomove = (dep == nullptr); // If there is no vehicle leaving a depot, limit the number of wagons moved immediately.

	while (length > 2) {
		/* we reached vehicle (originally) in front of a depot, stop now
		 * (we would move wagons that are already moved with new wagon length). */
		if (base == dep) break;

		/* the last wagon was that one leaving a depot, so do not move it anymore */
		if (last == dep) nomove = true;

		last = last->Previous();
		first = first->Next();

		int differential = last->CalcNextVehicleOffset() - base->CalcNextVehicleOffset();

		/* do not update images now */
		for (int i = 0; i < differential; i++) TrainController(first, (nomove ? last->Next() : nullptr));

		base = first; // == base->Next()
		length -= 2;
	}
}

static bool IsWholeTrainInsideDepot(const Train *v)
{
	for (const Train *u = v; u != nullptr; u = u->Next()) {
		if (u->track != TRACK_BIT_DEPOT || u->tile != v->tile) return false;
	}
	return true;
}

/**
 * Turn a train around.
 * @param v %Train to turn around.
 */
void ReverseTrainDirection(Train *v)
{
	if (IsRailDepotTile(v->tile)) {
		if (IsWholeTrainInsideDepot(v)) return;
		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
	}

	/* Clear path reservation in front if train is not stuck. */
	if (!HasBit(v->flags, VRF_TRAIN_STUCK)) FreeTrainTrackReservation(v);

	/* Check if we were approaching a rail/road-crossing */
	TileIndex crossing = TrainApproachingCrossingTile(v);

	/* count number of vehicles */
	int r = CountVehiclesInChain(v) - 1;  // number of vehicles - 1

	AdvanceWagonsBeforeSwap(v);

	/* swap start<>end, start+1<>end-1, ... */
	int l = 0;
	do {
		ReverseTrainSwapVeh(v, l++, r--);
	} while (l <= r);

	AdvanceWagonsAfterSwap(v);

	if (IsRailDepotTile(v->tile)) {
		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
	}

	ToggleBit(v->flags, VRF_TOGGLE_REVERSE);

	ClrBit(v->flags, VRF_REVERSING);

	/* recalculate cached data */
	v->ConsistChanged(CCF_TRACK);

	/* update all images */
	for (Train *u = v; u != nullptr; u = u->Next()) u->UpdateViewport(false, false);

	/* update crossing we were approaching */
	if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing);

	/* maybe we are approaching crossing now, after reversal */
	crossing = TrainApproachingCrossingTile(v);
	if (crossing != INVALID_TILE) MaybeBarCrossingWithSound(crossing);

	/* If we are inside a depot after reversing, don't bother with path reserving. */
	if (v->track == TRACK_BIT_DEPOT) {
		/* Can't be stuck here as inside a depot is always a safe tile. */
		if (HasBit(v->flags, VRF_TRAIN_STUCK)) SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
		ClrBit(v->flags, VRF_TRAIN_STUCK);
		return;
	}

	/* VehicleExitDir does not always produce the desired dir for depots and
	 * tunnels/bridges that is needed for UpdateSignalsOnSegment. */
	DiagDirection dir = VehicleExitDir(v->direction, v->track);
	if (IsRailDepotTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE)) dir = INVALID_DIAGDIR;

	if (UpdateSignalsOnSegment(v->tile, dir, v->owner) == SIGSEG_PBS || _settings_game.pf.reserve_paths) {
		/* If we are currently on a tile with conventional signals, we can't treat the
		 * current tile as a safe tile or we would enter a PBS block without a reservation. */
		bool first_tile_okay = !(IsTileType(v->tile, MP_RAILWAY) &&
			HasSignalOnTrackdir(v->tile, v->GetVehicleTrackdir()) &&
			!IsPbsSignal(GetSignalType(v->tile, FindFirstTrack(v->track))));

		/* If we are on a depot tile facing outwards, do not treat the current tile as safe. */
		if (IsRailDepotTile(v->tile) && TrackdirToExitdir(v->GetVehicleTrackdir()) == GetRailDepotDirection(v->tile)) first_tile_okay = false;

		if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
		if (TryPathReserve(v, false, first_tile_okay)) {
			/* Do a look-ahead now in case our current tile was already a safe tile. */
			CheckNextTrainTile(v);
		} else if (v->current_order.GetType() != OT_LOADING) {
			/* Do not wait for a way out when we're still loading */
			MarkTrainAsStuck(v);
		}
	} else if (HasBit(v->flags, VRF_TRAIN_STUCK)) {
		/* A train not inside a PBS block can't be stuck. */
		ClrBit(v->flags, VRF_TRAIN_STUCK);
		v->wait_counter = 0;
	}
}

/**
 * Reverse train.
 * @param flags type of operation
 * @param veh_id train to reverse
 * @param reverse_single_veh if true, reverse a unit in a train (needs to be in a depot)
 * @return the cost of this operation or an error
 */
CommandCost CmdReverseTrainDirection(DoCommandFlag flags, VehicleID veh_id, bool reverse_single_veh)
{
	Train *v = Train::GetIfValid(veh_id);
	if (v == nullptr) return CMD_ERROR;

	CommandCost ret = CheckOwnership(v->owner);
	if (ret.Failed()) return ret;

	if (reverse_single_veh) {
		/* turn a single unit around */

		if (v->IsMultiheaded() || HasBit(EngInfo(v->engine_type)->callback_mask, CBM_VEHICLE_ARTIC_ENGINE)) {
			return_cmd_error(STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS);
		}

		Train *front = v->First();
		/* make sure the vehicle is stopped in the depot */
		if (!front->IsStoppedInDepot()) {
			return_cmd_error(STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT);
		}

		if (flags & DC_EXEC) {
			ToggleBit(v->flags, VRF_REVERSE_DIRECTION);

			front->ConsistChanged(CCF_ARRANGE);
			SetWindowDirty(WC_VEHICLE_DEPOT, front->tile);
			SetWindowDirty(WC_VEHICLE_DETAILS, front->index);
			SetWindowDirty(WC_VEHICLE_VIEW, front->index);
			SetWindowClassesDirty(WC_TRAINS_LIST);
		}
	} else {
		/* turn the whole train around */
		if (!v->IsPrimaryVehicle()) return CMD_ERROR;
		if ((v->vehstatus & VS_CRASHED) || v->breakdown_ctr != 0) return CMD_ERROR;

		if (flags & DC_EXEC) {
			/* Properly leave the station if we are loading and won't be loading anymore */
			if (v->current_order.IsType(OT_LOADING)) {
				const Vehicle *last = v;
				while (last->Next() != nullptr) last = last->Next();

				/* not a station || different station --> leave the station */
				if (!IsTileType(last->tile, MP_STATION) || GetStationIndex(last->tile) != GetStationIndex(v->tile)) {
					v->LeaveStation();
				}
			}

			/* We cancel any 'skip signal at dangers' here */
			v->force_proceed = TFP_NONE;
			SetWindowDirty(WC_VEHICLE_VIEW, v->index);

			if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && v->cur_speed != 0) {
				ToggleBit(v->flags, VRF_REVERSING);
			} else {
				v->cur_speed = 0;
				v->SetLastSpeed();
				HideFillingPercent(&v->fill_percent_te_id);
				ReverseTrainDirection(v);
			}

			/* Unbunching data is no longer valid. */
			v->ResetDepotUnbunching();
		}
	}
	return CommandCost();
}

/**
 * Force a train through a red signal
 * @param flags type of operation
 * @param veh_id train to ignore the red signal
 * @return the cost of this operation or an error
 */
CommandCost CmdForceTrainProceed(DoCommandFlag flags, VehicleID veh_id)
{
	Train *t = Train::GetIfValid(veh_id);
	if (t == nullptr) return CMD_ERROR;

	if (!t->IsPrimaryVehicle()) return CMD_ERROR;

	CommandCost ret = CheckOwnership(t->owner);
	if (ret.Failed()) return ret;


	if (flags & DC_EXEC) {
		/* If we are forced to proceed, cancel that order.
		 * If we are marked stuck we would want to force the train
		 * to proceed to the next signal. In the other cases we
		 * would like to pass the signal at danger and run till the
		 * next signal we encounter. */
		t->force_proceed = t->force_proceed == TFP_SIGNAL ? TFP_NONE : HasBit(t->flags, VRF_TRAIN_STUCK) || t->IsChainInDepot() ? TFP_STUCK : TFP_SIGNAL;
		SetWindowDirty(WC_VEHICLE_VIEW, t->index);

		/* Unbunching data is no longer valid. */
		t->ResetDepotUnbunching();
	}

	return CommandCost();
}

/**
 * Try to find a depot nearby.
 * @param v %Train that wants a depot.
 * @param max_distance Maximal search distance.
 * @return Information where the closest train depot is located.
 * @pre The given vehicle must not be crashed!
 */
static FindDepotData FindClosestTrainDepot(Train *v, int max_distance)
{
	assert(!(v->vehstatus & VS_CRASHED));

	if (IsRailDepotTile(v->tile)) return FindDepotData(v->tile, 0);

	PBSTileInfo origin = FollowTrainReservation(v);
	if (IsRailDepotTile(origin.tile)) return FindDepotData(origin.tile, 0);

	switch (_settings_game.pf.pathfinder_for_trains) {
		case VPF_NPF: return NPFTrainFindNearestDepot(v, max_distance);
		case VPF_YAPF: return YapfTrainFindNearestDepot(v, max_distance);

		default: NOT_REACHED();
	}
}

ClosestDepot Train::FindClosestDepot()
{
	FindDepotData tfdd = FindClosestTrainDepot(this, 0);
	if (tfdd.best_length == UINT_MAX) return ClosestDepot();

	return ClosestDepot(tfdd.tile, GetDepotIndex(tfdd.tile), tfdd.reverse);
}

/** Play a sound for a train leaving the station. */
void Train::PlayLeaveStationSound(bool force) const
{
	static const SoundFx sfx[] = {
		SND_04_DEPARTURE_STEAM,
		SND_0A_DEPARTURE_TRAIN,
		SND_0A_DEPARTURE_TRAIN,
		SND_47_DEPARTURE_MONORAIL,
		SND_41_DEPARTURE_MAGLEV
	};

	if (PlayVehicleSound(this, VSE_START, force)) return;

	SndPlayVehicleFx(sfx[RailVehInfo(this->engine_type)->engclass], this);
}

/**
 * Check if the train is on the last reserved tile and try to extend the path then.
 * @param v %Train that needs its path extended.
 */
static void CheckNextTrainTile(Train *v)
{
	/* Don't do any look-ahead if path_backoff_interval is 255. */
	if (_settings_game.pf.path_backoff_interval == 255) return;

	/* Exit if we are inside a depot. */
	if (v->track == TRACK_BIT_DEPOT) return;

	switch (v->current_order.GetType()) {
		/* Exit if we reached our destination depot. */
		case OT_GOTO_DEPOT:
			if (v->tile == v->dest_tile) return;
			break;

		case OT_GOTO_WAYPOINT:
			/* If we reached our waypoint, make sure we see that. */
			if (IsRailWaypointTile(v->tile) && GetStationIndex(v->tile) == v->current_order.GetDestination()) ProcessOrders(v);
			break;

		case OT_NOTHING:
		case OT_LEAVESTATION:
		case OT_LOADING:
			/* Exit if the current order doesn't have a destination, but the train has orders. */
			if (v->GetNumOrders() > 0) return;
			break;

		default:
			break;
	}
	/* Exit if we are on a station tile and are going to stop. */
	if (IsRailStationTile(v->tile) && v->current_order.ShouldStopAtStation(v, GetStationIndex(v->tile))) return;

	Trackdir td = v->GetVehicleTrackdir();

	/* On a tile with a red non-pbs signal, don't look ahead. */
	if (IsTileType(v->tile, MP_RAILWAY) && HasSignalOnTrackdir(v->tile, td) &&
			!IsPbsSignal(GetSignalType(v->tile, TrackdirToTrack(td))) &&
			GetSignalStateByTrackdir(v->tile, td) == SIGNAL_STATE_RED) return;

	CFollowTrackRail ft(v);
	if (!ft.Follow(v->tile, td)) return;

	if (!HasReservedTracks(ft.m_new_tile, TrackdirBitsToTrackBits(ft.m_new_td_bits))) {
		/* Next tile is not reserved. */
		if (KillFirstBit(ft.m_new_td_bits) == TRACKDIR_BIT_NONE) {
			if (HasPbsSignalOnTrackdir(ft.m_new_tile, FindFirstTrackdir(ft.m_new_td_bits))) {
				/* If the next tile is a PBS signal, try to make a reservation. */
				TrackBits tracks = TrackdirBitsToTrackBits(ft.m_new_td_bits);
				if (Rail90DegTurnDisallowed(GetTileRailType(ft.m_old_tile), GetTileRailType(ft.m_new_tile))) {
					tracks &= ~TrackCrossesTracks(TrackdirToTrack(ft.m_old_td));
				}
				ChooseTrainTrack(v, ft.m_new_tile, ft.m_exitdir, tracks, false, nullptr, false);
			}
		}
	}
}

/**
 * Will the train stay in the depot the next tick?
 * @param v %Train to check.
 * @return True if it stays in the depot, false otherwise.
 */
static bool CheckTrainStayInDepot(Train *v)
{
	/* bail out if not all wagons are in the same depot or not in a depot at all */
	for (const Train *u = v; u != nullptr; u = u->Next()) {
		if (u->track != TRACK_BIT_DEPOT || u->tile != v->tile) return false;
	}

	/* if the train got no power, then keep it in the depot */
	if (v->gcache.cached_power == 0) {
		v->vehstatus |= VS_STOPPED;
		SetWindowDirty(WC_VEHICLE_DEPOT, v->tile);
		return true;
	}

	/* Check if we should wait here for unbunching. */
	if (v->IsWaitingForUnbunching()) return true;

	SigSegState seg_state;

	if (v->force_proceed == TFP_NONE) {
		/* force proceed was not pressed */
		if (++v->wait_counter < 37) {
			SetWindowClassesDirty(WC_TRAINS_LIST);
			return true;
		}

		v->wait_counter = 0;

		seg_state = _settings_game.pf.reserve_paths ? SIGSEG_PBS : UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner);
		if (seg_state == SIGSEG_FULL || HasDepotReservation(v->tile)) {
			/* Full and no PBS signal in block or depot reserved, can't exit. */
			SetWindowClassesDirty(WC_TRAINS_LIST);
			return true;
		}
	} else {
		seg_state = _settings_game.pf.reserve_paths ? SIGSEG_PBS : UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner);
	}

	/* We are leaving a depot, but have to go to the exact same one; re-enter. */
	if (v->current_order.IsType(OT_GOTO_DEPOT) && v->tile == v->dest_tile) {
		/* Service when depot has no reservation. */
		if (!HasDepotReservation(v->tile)) VehicleEnterDepot(v);
		return true;
	}

	/* Only leave when we can reserve a path to our destination. */
	if (seg_state == SIGSEG_PBS && !TryPathReserve(v) && v->force_proceed == TFP_NONE) {
		/* No path and no force proceed. */
		SetWindowClassesDirty(WC_TRAINS_LIST);
		MarkTrainAsStuck(v);
		return true;
	}

	SetDepotReservation(v->tile, true);
	if (_settings_client.gui.show_track_reservation) MarkTileDirtyByTile(v->tile);

	VehicleServiceInDepot(v);
	v->LeaveUnbunchingDepot();
	v->PlayLeaveStationSound();
	SetWindowClassesDirty(WC_TRAINS_LIST);

	v->track = TRACK_BIT_X;
	if (v->direction & 2) v->track = TRACK_BIT_Y;

	v->vehstatus &= ~VS_HIDDEN;
	v->cur_speed = 0;

	v->UpdateViewport(true, true);
	v->UpdatePosition();
	UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner);
	v->UpdateAcceleration();
	InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);

	return false;
}

/**
 * Clear the reservation of \a tile that was just left by a wagon on \a track_dir.
 * @param v %Train owning the reservation.
 * @param tile Tile with reservation to clear.
 * @param track_dir Track direction to clear.
 */
static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_dir)
{
	DiagDirection dir = TrackdirToExitdir(track_dir);

	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
		/* Are we just leaving a tunnel/bridge? */
		if (GetTunnelBridgeDirection(tile) == ReverseDiagDir(dir)) {
			TileIndex end = GetOtherTunnelBridgeEnd(tile);

			if (TunnelBridgeIsFree(tile, end, v).Succeeded()) {
				/* Free the reservation only if no other train is on the tiles. */
				SetTunnelBridgeReservation(tile, false);
				SetTunnelBridgeReservation(end, false);

				if (_settings_client.gui.show_track_reservation) {
					if (IsBridge(tile)) {
						MarkBridgeDirty(tile);
					} else {
						MarkTileDirtyByTile(tile);
						MarkTileDirtyByTile(end);
					}
				}
			}
		}
	} else if (IsRailStationTile(tile)) {
		TileIndex new_tile = TileAddByDiagDir(tile, dir);
		/* If the new tile is not a further tile of the same station, we
		 * clear the reservation for the whole platform. */
		if (!IsCompatibleTrainStationTile(new_tile, tile)) {
			SetRailStationPlatformReservation(tile, ReverseDiagDir(dir), false);
		}
	} else {
		/* Any other tile */
		UnreserveRailTrack(tile, TrackdirToTrack(track_dir));
	}
}

/**
 * Free the reserved path in front of a vehicle.
 * @param v %Train owning the reserved path.
 */
void FreeTrainTrackReservation(const Train *v)
{
	assert(v->IsFrontEngine());

	TileIndex tile = v->tile;
	Trackdir  td = v->GetVehicleTrackdir();
	bool      free_tile = !(IsRailStationTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE));
	StationID station_id = IsRailStationTile(v->tile) ? GetStationIndex(v->tile) : INVALID_STATION;

	/* Can't be holding a reservation if we enter a depot. */
	if (IsRailDepotTile(tile) && TrackdirToExitdir(td) != GetRailDepotDirection(tile)) return;
	if (v->track == TRACK_BIT_DEPOT) {
		/* Front engine is in a depot. We enter if some part is not in the depot. */
		for (const Train *u = v; u != nullptr; u = u->Next()) {
			if (u->track != TRACK_BIT_DEPOT || u->tile != v->tile) return;
		}
	}
	/* Don't free reservation if it's not ours. */
	if (TracksOverlap(GetReservedTrackbits(tile) | TrackToTrackBits(TrackdirToTrack(td)))) return;

	CFollowTrackRail ft(v, GetRailTypeInfo(v->railtype)->compatible_railtypes);
	while (ft.Follow(tile, td)) {
		tile = ft.m_new_tile;
		TrackdirBits bits = ft.m_new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(tile));
		td = RemoveFirstTrackdir(&bits);
		assert(bits == TRACKDIR_BIT_NONE);

		if (!IsValidTrackdir(td)) break;

		if (IsTileType(tile, MP_RAILWAY)) {
			if (HasSignalOnTrackdir(tile, td) && !IsPbsSignal(GetSignalType(tile, TrackdirToTrack(td)))) {
				/* Conventional signal along trackdir: remove reservation and stop. */
				UnreserveRailTrack(tile, TrackdirToTrack(td));
				break;
			}
			if (HasPbsSignalOnTrackdir(tile, td)) {
				if (GetSignalStateByTrackdir(tile, td) == SIGNAL_STATE_RED) {
					/* Red PBS signal? Can't be our reservation, would be green then. */
					break;
				} else {
					/* Turn the signal back to red. */
					SetSignalStateByTrackdir(tile, td, SIGNAL_STATE_RED);
					MarkTileDirtyByTile(tile);
				}
			} else if (HasSignalOnTrackdir(tile, ReverseTrackdir(td)) && IsOnewaySignal(tile, TrackdirToTrack(td))) {
				break;
			}
		}

		/* Don't free first station/bridge/tunnel if we are on it. */
		if (free_tile || (!(ft.m_is_station && GetStationIndex(ft.m_new_tile) == station_id) && !ft.m_is_tunnel && !ft.m_is_bridge)) ClearPathReservation(v, tile, td);

		free_tile = true;
	}
}

static const byte _initial_tile_subcoord[6][4][3] = {
{{ 15, 8, 1 }, { 0, 0, 0 }, { 0, 8, 5 }, { 0,  0, 0 }},
{{  0, 0, 0 }, { 8, 0, 3 }, { 0, 0, 0 }, { 8, 15, 7 }},
{{  0, 0, 0 }, { 7, 0, 2 }, { 0, 7, 6 }, { 0,  0, 0 }},
{{ 15, 8, 2 }, { 0, 0, 0 }, { 0, 0, 0 }, { 8, 15, 6 }},
{{ 15, 7, 0 }, { 8, 0, 4 }, { 0, 0, 0 }, { 0,  0, 0 }},
{{  0, 0, 0 }, { 0, 0, 0 }, { 0, 8, 4 }, { 7, 15, 0 }},
};

/**
 * Perform pathfinding for a train.
 *
 * @param v The train
 * @param tile The tile the train is about to enter
 * @param enterdir Diagonal direction the train is coming from
 * @param tracks Usable tracks on the new tile
 * @param[out] path_found Whether a path has been found or not.
 * @param do_track_reservation Path reservation is requested
 * @param[out] dest State and destination of the requested path
 * @param[out] final_dest Final tile of the best path found
 * @return The best track the train should follow
 */
static Track DoTrainPathfind(const Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found, bool do_track_reservation, PBSTileInfo *dest, TileIndex *final_dest)
{
	if (final_dest != nullptr) *final_dest = INVALID_TILE;

	switch (_settings_game.pf.pathfinder_for_trains) {
		case VPF_NPF: return NPFTrainChooseTrack(v, path_found, do_track_reservation, dest);
		case VPF_YAPF: return YapfTrainChooseTrack(v, tile, enterdir, tracks, path_found, do_track_reservation, dest, final_dest);

		default: NOT_REACHED();
	}
}

/**
 * Extend a train path as far as possible. Stops on encountering a safe tile,
 * another reservation or a track choice.
 * @return INVALID_TILE indicates that the reservation failed.
 */
static PBSTileInfo ExtendTrainReservation(const Train *v, TrackBits *new_tracks, DiagDirection *enterdir)
{
	PBSTileInfo origin = FollowTrainReservation(v);

	CFollowTrackRail ft(v);

	TileIndex tile = origin.tile;
	Trackdir  cur_td = origin.trackdir;
	while (ft.Follow(tile, cur_td)) {
		if (KillFirstBit(ft.m_new_td_bits) == TRACKDIR_BIT_NONE) {
			/* Possible signal tile. */
			if (HasOnewaySignalBlockingTrackdir(ft.m_new_tile, FindFirstTrackdir(ft.m_new_td_bits))) break;
		}

		if (Rail90DegTurnDisallowed(GetTileRailType(ft.m_old_tile), GetTileRailType(ft.m_new_tile))) {
			ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(ft.m_old_td);
			if (ft.m_new_td_bits == TRACKDIR_BIT_NONE) break;
		}

		/* Station, depot or waypoint are a possible target. */
		bool target_seen = ft.m_is_station || (IsTileType(ft.m_new_tile, MP_RAILWAY) && !IsPlainRail(ft.m_new_tile));
		if (target_seen || KillFirstBit(ft.m_new_td_bits) != TRACKDIR_BIT_NONE) {
			/* Choice found or possible target encountered.
			 * On finding a possible target, we need to stop and let the pathfinder handle the
			 * remaining path. This is because we don't know if this target is in one of our
			 * orders, so we might cause pathfinding to fail later on if we find a choice.
			 * This failure would cause a bogous call to TryReserveSafePath which might reserve
			 * a wrong path not leading to our next destination. */
			if (HasReservedTracks(ft.m_new_tile, TrackdirBitsToTrackBits(TrackdirReachesTrackdirs(ft.m_old_td)))) break;

			/* If we did skip some tiles, backtrack to the first skipped tile so the pathfinder
			 * actually starts its search at the first unreserved tile. */
			if (ft.m_tiles_skipped != 0) ft.m_new_tile -= TileOffsByDiagDir(ft.m_exitdir) * ft.m_tiles_skipped;

			/* Choice found, path valid but not okay. Save info about the choice tile as well. */
			if (new_tracks != nullptr) *new_tracks = TrackdirBitsToTrackBits(ft.m_new_td_bits);
			if (enterdir != nullptr) *enterdir = ft.m_exitdir;
			return PBSTileInfo(ft.m_new_tile, ft.m_old_td, false);
		}

		tile = ft.m_new_tile;
		cur_td = FindFirstTrackdir(ft.m_new_td_bits);

		if (IsSafeWaitingPosition(v, tile, cur_td, true, _settings_game.pf.forbid_90_deg)) {
			bool wp_free = IsWaitingPositionFree(v, tile, cur_td, _settings_game.pf.forbid_90_deg);
			if (!(wp_free && TryReserveRailTrack(tile, TrackdirToTrack(cur_td)))) break;
			/* Safe position is all good, path valid and okay. */
			return PBSTileInfo(tile, cur_td, true);
		}

		if (!TryReserveRailTrack(tile, TrackdirToTrack(cur_td))) break;
	}

	if (ft.m_err == CFollowTrackRail::EC_OWNER || ft.m_err == CFollowTrackRail::EC_NO_WAY) {
		/* End of line, path valid and okay. */
		return PBSTileInfo(ft.m_old_tile, ft.m_old_td, true);
	}

	/* Sorry, can't reserve path, back out. */
	tile = origin.tile;
	cur_td = origin.trackdir;
	TileIndex stopped = ft.m_old_tile;
	Trackdir  stopped_td = ft.m_old_td;
	while (tile != stopped || cur_td != stopped_td) {
		if (!ft.Follow(tile, cur_td)) break;

		if (Rail90DegTurnDisallowed(GetTileRailType(ft.m_old_tile), GetTileRailType(ft.m_new_tile))) {
			ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(ft.m_old_td);
			assert(ft.m_new_td_bits != TRACKDIR_BIT_NONE);
		}
		assert(KillFirstBit(ft.m_new_td_bits) == TRACKDIR_BIT_NONE);

		tile = ft.m_new_tile;
		cur_td = FindFirstTrackdir(ft.m_new_td_bits);

		UnreserveRailTrack(tile, TrackdirToTrack(cur_td));
	}

	/* Path invalid. */
	return PBSTileInfo();
}

/**
 * Try to reserve any path to a safe tile, ignoring the vehicle's destination.
 * Safe tiles are tiles in front of a signal, depots and station tiles at end of line.
 *
 * @param v The vehicle.
 * @param tile The tile the search should start from.
 * @param td The trackdir the search should start from.
 * @param override_railtype Whether all physically compatible railtypes should be followed.
 * @return True if a path to a safe stopping tile could be reserved.
 */
static bool TryReserveSafeTrack(const Train *v, TileIndex tile, Trackdir td, bool override_railtype)
{
	switch (_settings_game.pf.pathfinder_for_trains) {
		case VPF_NPF: return NPFTrainFindNearestSafeTile(v, tile, td, override_railtype);
		case VPF_YAPF: return YapfTrainFindNearestSafeTile(v, tile, td, override_railtype);

		default: NOT_REACHED();
	}
}

/** This class will save the current order of a vehicle and restore it on destruction. */
class VehicleOrderSaver {
private:
	Train          *v;
	Order          old_order;
	TileIndex      old_dest_tile;
	StationID      old_last_station_visited;
	VehicleOrderID index;
	bool           suppress_implicit_orders;
	bool           restored;

public:
	VehicleOrderSaver(Train *_v) :
		v(_v),
		old_order(_v->current_order),
		old_dest_tile(_v->dest_tile),
		old_last_station_visited(_v->last_station_visited),
		index(_v->cur_real_order_index),
		suppress_implicit_orders(HasBit(_v->gv_flags, GVF_SUPPRESS_IMPLICIT_ORDERS)),
		restored(false)
	{
	}

	/**
	 * Restore the saved order to the vehicle.
	 */
	void Restore()
	{
		this->v->current_order = this->old_order;
		this->v->dest_tile = this->old_dest_tile;
		this->v->last_station_visited = this->old_last_station_visited;
		SB(this->v->gv_flags, GVF_SUPPRESS_IMPLICIT_ORDERS, 1, suppress_implicit_orders ? 1: 0);
		this->restored = true;
	}

	/**
	 * Restore the saved order to the vehicle, if Restore() has not already been called.
	 */
	~VehicleOrderSaver()
	{
		if (!this->restored) this->Restore();
	}

	/**
	 * Set the current vehicle order to the next order in the order list.
	 * @param skip_first Shall the first (i.e. active) order be skipped?
	 * @return True if a suitable next order could be found.
	 */
	bool SwitchToNextOrder(bool skip_first)
	{
		if (this->v->GetNumOrders() == 0) return false;

		if (skip_first) ++this->index;

		int depth = 0;

		do {
			/* Wrap around. */
			if (this->index >= this->v->GetNumOrders()) this->index = 0;

			Order *order = this->v->GetOrder(this->index);
			assert(order != nullptr);

			switch (order->GetType()) {
				case OT_GOTO_DEPOT:
					/* Skip service in depot orders when the train doesn't need service. */
					if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !this->v->NeedsServicing()) break;
					[[fallthrough]];
				case OT_GOTO_STATION:
				case OT_GOTO_WAYPOINT:
					this->v->current_order = *order;
					return UpdateOrderDest(this->v, order, 0, true);
				case OT_CONDITIONAL: {
					VehicleOrderID next = ProcessConditionalOrder(order, this->v);
					if (next != INVALID_VEH_ORDER_ID) {
						depth++;
						this->index = next;
						/* Don't increment next, so no break here. */
						continue;
					}
					break;
				}
				default:
					break;
			}
			/* Don't increment inside the while because otherwise conditional
			 * orders can lead to an infinite loop. */
			++this->index;
			depth++;
		} while (this->index != this->v->cur_real_order_index && depth < this->v->GetNumOrders());

		return false;
	}
};

/* choose a track */
static Track ChooseTrainTrack(Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool force_res, bool *got_reservation, bool mark_stuck)
{
	Track best_track = INVALID_TRACK;
	bool do_track_reservation = _settings_game.pf.reserve_paths || force_res;
	bool changed_signal = false;
	TileIndex final_dest = INVALID_TILE;

	assert((tracks & ~TRACK_BIT_MASK) == 0);

	if (got_reservation != nullptr) *got_reservation = false;

	/* Don't use tracks here as the setting to forbid 90 deg turns might have been switched between reservation and now. */
	TrackBits res_tracks = (TrackBits)(GetReservedTrackbits(tile) & DiagdirReachesTracks(enterdir));
	/* Do we have a suitable reserved track? */
	if (res_tracks != TRACK_BIT_NONE) return FindFirstTrack(res_tracks);

	/* Quick return in case only one possible track is available */
	if (KillFirstBit(tracks) == TRACK_BIT_NONE) {
		Track track = FindFirstTrack(tracks);
		/* We need to check for signals only here, as a junction tile can't have signals. */
		if (track != INVALID_TRACK && HasPbsSignalOnTrackdir(tile, TrackEnterdirToTrackdir(track, enterdir))) {
			do_track_reservation = true;
			changed_signal = true;
			SetSignalStateByTrackdir(tile, TrackEnterdirToTrackdir(track, enterdir), SIGNAL_STATE_GREEN);
		} else if (!do_track_reservation) {
			return track;
		}
		best_track = track;
	}

	PBSTileInfo   res_dest(tile, INVALID_TRACKDIR, false);
	DiagDirection dest_enterdir = enterdir;
	if (do_track_reservation) {
		res_dest = ExtendTrainReservation(v, &tracks, &dest_enterdir);
		if (res_dest.tile == INVALID_TILE) {
			/* Reservation failed? */
			if (mark_stuck) MarkTrainAsStuck(v);
			if (changed_signal) SetSignalStateByTrackdir(tile, TrackEnterdirToTrackdir(best_track, enterdir), SIGNAL_STATE_RED);
			return FindFirstTrack(tracks);
		}
		if (res_dest.okay) {
			/* Got a valid reservation that ends at a safe target, quick exit. */
			if (got_reservation != nullptr) *got_reservation = true;
			if (changed_signal) MarkTileDirtyByTile(tile);
			TryReserveRailTrack(v->tile, TrackdirToTrack(v->GetVehicleTrackdir()));
			return best_track;
		}

		/* Check if the train needs service here, so it has a chance to always find a depot.
		 * Also check if the current order is a service order so we don't reserve a path to
		 * the destination but instead to the next one if service isn't needed. */
		CheckIfTrainNeedsService(v);
		if (v->current_order.IsType(OT_DUMMY) || v->current_order.IsType(OT_CONDITIONAL) || v->current_order.IsType(OT_GOTO_DEPOT)) ProcessOrders(v);
	}

	/* Save the current train order. The destructor will restore the old order on function exit. */
	VehicleOrderSaver orders(v);

	/* If the current tile is the destination of the current order and
	 * a reservation was requested, advance to the next order.
	 * Don't advance on a depot order as depots are always safe end points
	 * for a path and no look-ahead is necessary. This also avoids a
	 * problem with depot orders not part of the order list when the
	 * order list itself is empty. */
	if (v->current_order.IsType(OT_LEAVESTATION)) {
		orders.SwitchToNextOrder(false);
	} else if (v->current_order.IsType(OT_LOADING) || (!v->current_order.IsType(OT_GOTO_DEPOT) && (
			v->current_order.IsType(OT_GOTO_STATION) ?
			IsRailStationTile(v->tile) && v->current_order.GetDestination() == GetStationIndex(v->tile) :
			v->tile == v->dest_tile))) {
		orders.SwitchToNextOrder(true);
	}

	if (res_dest.tile != INVALID_TILE && !res_dest.okay) {
		/* Pathfinders are able to tell that route was only 'guessed'. */
		bool      path_found = true;
		TileIndex new_tile = res_dest.tile;

		Track next_track = DoTrainPathfind(v, new_tile, dest_enterdir, tracks, path_found, do_track_reservation, &res_dest, &final_dest);
		if (new_tile == tile) best_track = next_track;
		v->HandlePathfindingResult(path_found);
	}

	/* No track reservation requested -> finished. */
	if (!do_track_reservation) return best_track;

	/* A path was found, but could not be reserved. */
	if (res_dest.tile != INVALID_TILE && !res_dest.okay) {
		if (mark_stuck) MarkTrainAsStuck(v);
		FreeTrainTrackReservation(v);
		return best_track;
	}

	/* No possible reservation target found, we are probably lost. */
	if (res_dest.tile == INVALID_TILE) {
		/* Try to find any safe destination. */
		PBSTileInfo origin = FollowTrainReservation(v);
		if (TryReserveSafeTrack(v, origin.tile, origin.trackdir, false)) {
			TrackBits res = GetReservedTrackbits(tile) & DiagdirReachesTracks(enterdir);
			best_track = FindFirstTrack(res);
			TryReserveRailTrack(v->tile, TrackdirToTrack(v->GetVehicleTrackdir()));
			if (got_reservation != nullptr) *got_reservation = true;
			if (changed_signal) MarkTileDirtyByTile(tile);
		} else {
			FreeTrainTrackReservation(v);
			if (mark_stuck) MarkTrainAsStuck(v);
		}
		return best_track;
	}

	if (got_reservation != nullptr) *got_reservation = true;

	/* Reservation target found and free, check if it is safe. */
	while (!IsSafeWaitingPosition(v, res_dest.tile, res_dest.trackdir, true, _settings_game.pf.forbid_90_deg)) {
		/* Extend reservation until we have found a safe position. */
		DiagDirection exitdir = TrackdirToExitdir(res_dest.trackdir);
		TileIndex     next_tile = TileAddByDiagDir(res_dest.tile, exitdir);
		TrackBits     reachable = TrackdirBitsToTrackBits((TrackdirBits)(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0))) & DiagdirReachesTracks(exitdir);
		if (Rail90DegTurnDisallowed(GetTileRailType(res_dest.tile), GetTileRailType(next_tile))) {
			reachable &= ~TrackCrossesTracks(TrackdirToTrack(res_dest.trackdir));
		}

		/* Get next order with destination. */
		if (orders.SwitchToNextOrder(true)) {
			PBSTileInfo cur_dest;
			bool path_found;
			DoTrainPathfind(v, next_tile, exitdir, reachable, path_found, true, &cur_dest, nullptr);
			if (cur_dest.tile != INVALID_TILE) {
				res_dest = cur_dest;
				if (res_dest.okay) continue;
				/* Path found, but could not be reserved. */
				FreeTrainTrackReservation(v);
				if (mark_stuck) MarkTrainAsStuck(v);
				if (got_reservation != nullptr) *got_reservation = false;
				changed_signal = false;
				break;
			}
		}
		/* No order or no safe position found, try any position. */
		if (!TryReserveSafeTrack(v, res_dest.tile, res_dest.trackdir, true)) {
			FreeTrainTrackReservation(v);
			if (mark_stuck) MarkTrainAsStuck(v);
			if (got_reservation != nullptr) *got_reservation = false;
			changed_signal = false;
		}
		break;
	}

	TryReserveRailTrack(v->tile, TrackdirToTrack(v->GetVehicleTrackdir()));

	if (changed_signal) MarkTileDirtyByTile(tile);

	orders.Restore();
	if (v->current_order.IsType(OT_GOTO_DEPOT) &&
			(v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) &&
			final_dest != INVALID_TILE && IsRailDepotTile(final_dest)) {
		v->current_order.SetDestination(GetDepotIndex(final_dest));
		v->dest_tile = final_dest;
		SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
	}

	return best_track;
}

/**
 * Try to reserve a path to a safe position.
 *
 * @param v The vehicle
 * @param mark_as_stuck Should the train be marked as stuck on a failed reservation?
 * @param first_tile_okay True if no path should be reserved if the current tile is a safe position.
 * @return True if a path could be reserved.
 */
bool TryPathReserve(Train *v, bool mark_as_stuck, bool first_tile_okay)
{
	assert(v->IsFrontEngine());

	/* We have to handle depots specially as the track follower won't look
	 * at the depot tile itself but starts from the next tile. If we are still
	 * inside the depot, a depot reservation can never be ours. */
	if (v->track == TRACK_BIT_DEPOT) {
		if (HasDepotReservation(v->tile)) {
			if (mark_as_stuck) MarkTrainAsStuck(v);
			return false;
		} else {
			/* Depot not reserved, but the next tile might be. */
			TileIndex next_tile = TileAddByDiagDir(v->tile, GetRailDepotDirection(v->tile));
			if (HasReservedTracks(next_tile, DiagdirReachesTracks(GetRailDepotDirection(v->tile)))) return false;
		}
	}

	Vehicle *other_train = nullptr;
	PBSTileInfo origin = FollowTrainReservation(v, &other_train);
	/* The path we are driving on is already blocked by some other train.
	 * This can only happen in certain situations when mixing path and
	 * block signals or when changing tracks and/or signals.
	 * Exit here as doing any further reservations will probably just
	 * make matters worse. */
	if (other_train != nullptr && other_train->index != v->index) {
		if (mark_as_stuck) MarkTrainAsStuck(v);
		return false;
	}
	/* If we have a reserved path and the path ends at a safe tile, we are finished already. */
	if (origin.okay && (v->tile != origin.tile || first_tile_okay)) {
		/* Can't be stuck then. */
		if (HasBit(v->flags, VRF_TRAIN_STUCK)) SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
		ClrBit(v->flags, VRF_TRAIN_STUCK);
		return true;
	}

	/* If we are in a depot, tentatively reserve the depot. */
	if (v->track == TRACK_BIT_DEPOT) {
		SetDepotReservation(v->tile, true);
		if (_settings_client.gui.show_track_reservation) MarkTileDirtyByTile(v->tile);
	}

	DiagDirection exitdir = TrackdirToExitdir(origin.trackdir);
	TileIndex     new_tile = TileAddByDiagDir(origin.tile, exitdir);
	TrackBits     reachable = TrackdirBitsToTrackBits(TrackStatusToTrackdirBits(GetTileTrackStatus(new_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTrackdirs(exitdir));

	if (Rail90DegTurnDisallowed(GetTileRailType(origin.tile), GetTileRailType(new_tile))) reachable &= ~TrackCrossesTracks(TrackdirToTrack(origin.trackdir));

	bool res_made = false;
	ChooseTrainTrack(v, new_tile, exitdir, reachable, true, &res_made, mark_as_stuck);

	if (!res_made) {
		/* Free the depot reservation as well. */
		if (v->track == TRACK_BIT_DEPOT) SetDepotReservation(v->tile, false);
		return false;
	}

	if (HasBit(v->flags, VRF_TRAIN_STUCK)) {
		v->wait_counter = 0;
		SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
	}
	ClrBit(v->flags, VRF_TRAIN_STUCK);
	return true;
}


static bool CheckReverseTrain(const Train *v)
{
	if (_settings_game.difficulty.line_reverse_mode != 0 ||
			v->track == TRACK_BIT_DEPOT || v->track == TRACK_BIT_WORMHOLE ||
			!(v->direction & 1)) {
		return false;
	}

	assert(v->track != TRACK_BIT_NONE);

	switch (_settings_game.pf.pathfinder_for_trains) {
		case VPF_NPF: return NPFTrainCheckReverse(v);
		case VPF_YAPF: return YapfTrainCheckReverse(v);

		default: NOT_REACHED();
	}
}

/**
 * Get the location of the next station to visit.
 * @param station Next station to visit.
 * @return Location of the new station.
 */
TileIndex Train::GetOrderStationLocation(StationID station)
{
	if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION;

	const Station *st = Station::Get(station);
	if (!(st->facilities & FACIL_TRAIN)) {
		/* The destination station has no trainstation tiles. */
		this->IncrementRealOrderIndex();
		return 0;
	}

	return st->xy;
}

/** Goods at the consist have changed, update the graphics, cargo, and acceleration. */
void Train::MarkDirty()
{
	Train *v = this;
	do {
		v->colourmap = PAL_NONE;
		v->UpdateViewport(true, false);
	} while ((v = v->Next()) != nullptr);

	/* need to update acceleration and cached values since the goods on the train changed. */
	this->CargoChanged();
	this->UpdateAcceleration();
}

/**
 * This function looks at the vehicle and updates its speed (cur_speed
 * and subspeed) variables. Furthermore, it returns the distance that
 * the train can drive this tick. #Vehicle::GetAdvanceDistance() determines
 * the distance to drive before moving a step on the map.
 * @return distance to drive.
 */
int Train::UpdateSpeed()
{
	switch (_settings_game.vehicle.train_acceleration_model) {
		default: NOT_REACHED();
		case AM_ORIGINAL:
			return this->DoUpdateSpeed(this->acceleration * (this->GetAccelerationStatus() == AS_BRAKE ? -4 : 2), 0, this->GetCurrentMaxSpeed());

		case AM_REALISTIC:
			return this->DoUpdateSpeed(this->GetAcceleration(), this->GetAccelerationStatus() == AS_BRAKE ? 0 : 2, this->GetCurrentMaxSpeed());
	}
}

/**
 * Trains enters a station, send out a news item if it is the first train, and start loading.
 * @param v Train that entered the station.
 * @param station Station visited.
 */
static void TrainEnterStation(Train *v, StationID station)
{
	v->last_station_visited = station;

	/* check if a train ever visited this station before */
	Station *st = Station::Get(station);
	if (!(st->had_vehicle_of_type & HVOT_TRAIN)) {
		st->had_vehicle_of_type |= HVOT_TRAIN;
		SetDParam(0, st->index);
		AddVehicleNewsItem(
			STR_NEWS_FIRST_TRAIN_ARRIVAL,
			v->owner == _local_company ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
			v->index,
			st->index
		);
		AI::NewEvent(v->owner, new ScriptEventStationFirstVehicle(st->index, v->index));
		Game::NewEvent(new ScriptEventStationFirstVehicle(st->index, v->index));
	}

	v->force_proceed = TFP_NONE;
	SetWindowDirty(WC_VEHICLE_VIEW, v->index);

	v->BeginLoading();

	TriggerStationRandomisation(st, v->tile, SRT_TRAIN_ARRIVES);
	TriggerStationAnimation(st, v->tile, SAT_TRAIN_ARRIVES);
}

/* Check if the vehicle is compatible with the specified tile */
static inline bool CheckCompatibleRail(const Train *v, TileIndex tile)
{
	return IsTileOwner(tile, v->owner) &&
			(!v->IsFrontEngine() || HasBit(v->compatible_railtypes, GetRailType(tile)));
}

/** Data structure for storing engine speed changes of an acceleration type. */
struct AccelerationSlowdownParams {
	byte small_turn; ///< Speed change due to a small turn.
	byte large_turn; ///< Speed change due to a large turn.
	byte z_up;       ///< Fraction to remove when moving up.
	byte z_down;     ///< Fraction to add when moving down.
};

/** Speed update fractions for each acceleration type. */
static const AccelerationSlowdownParams _accel_slowdown[] = {
	/* normal accel */
	{256 / 4, 256 / 2, 256 / 4, 2}, ///< normal
	{256 / 4, 256 / 2, 256 / 4, 2}, ///< monorail
	{0,       256 / 2, 256 / 4, 2}, ///< maglev
};

/**
 * Modify the speed of the vehicle due to a change in altitude.
 * @param v %Train to update.
 * @param old_z Previous height.
 */
static inline void AffectSpeedByZChange(Train *v, int old_z)
{
	if (old_z == v->z_pos || _settings_game.vehicle.train_acceleration_model != AM_ORIGINAL) return;

	const AccelerationSlowdownParams *asp = &_accel_slowdown[GetRailTypeInfo(v->railtype)->acceleration_type];

	if (old_z < v->z_pos) {
		v->cur_speed -= (v->cur_speed * asp->z_up >> 8);
	} else {
		uint16_t spd = v->cur_speed + asp->z_down;
		if (spd <= v->gcache.cached_max_track_speed) v->cur_speed = spd;
	}
}

static bool TrainMovedChangeSignals(TileIndex tile, DiagDirection dir)
{
	if (IsTileType(tile, MP_RAILWAY) &&
			GetRailTileType(tile) == RAIL_TILE_SIGNALS) {
		TrackdirBits tracks = TrackBitsToTrackdirBits(GetTrackBits(tile)) & DiagdirReachesTrackdirs(dir);
		Trackdir trackdir = FindFirstTrackdir(tracks);
		if (UpdateSignalsOnSegment(tile,  TrackdirToExitdir(trackdir), GetTileOwner(tile)) == SIGSEG_PBS && HasSignalOnTrackdir(tile, trackdir)) {
			/* A PBS block with a non-PBS signal facing us? */
			if (!IsPbsSignal(GetSignalType(tile, TrackdirToTrack(trackdir)))) return true;
		}
	}
	return false;
}

/** Tries to reserve track under whole train consist. */
void Train::ReserveTrackUnderConsist() const
{
	for (const Train *u = this; u != nullptr; u = u->Next()) {
		switch (u->track) {
			case TRACK_BIT_WORMHOLE:
				TryReserveRailTrack(u->tile, DiagDirToDiagTrack(GetTunnelBridgeDirection(u->tile)));
				break;
			case TRACK_BIT_DEPOT:
				break;
			default:
				TryReserveRailTrack(u->tile, TrackBitsToTrack(u->track));
				break;
		}
	}
}

/**
 * The train vehicle crashed!
 * Update its status and other parts around it.
 * @param flooded Crash was caused by flooding.
 * @return Number of people killed.
 */
uint Train::Crash(bool flooded)
{
	uint pass = 0;
	if (this->IsFrontEngine()) {
		pass += 2; // driver

		/* Remove the reserved path in front of the train if it is not stuck.
		 * Also clear all reserved tracks the train is currently on. */
		if (!HasBit(this->flags, VRF_TRAIN_STUCK)) FreeTrainTrackReservation(this);
		for (const Train *v = this; v != nullptr; v = v->Next()) {
			ClearPathReservation(v, v->tile, v->GetVehicleTrackdir());
			if (IsTileType(v->tile, MP_TUNNELBRIDGE)) {
				/* ClearPathReservation will not free the wormhole exit
				 * if the train has just entered the wormhole. */
				SetTunnelBridgeReservation(GetOtherTunnelBridgeEnd(v->tile), false);
			}
		}

		/* we may need to update crossing we were approaching,
		 * but must be updated after the train has been marked crashed */
		TileIndex crossing = TrainApproachingCrossingTile(this);
		if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing);

		/* Remove the loading indicators (if any) */
		HideFillingPercent(&this->fill_percent_te_id);
	}

	pass += this->GroundVehicleBase::Crash(flooded);

	this->crash_anim_pos = flooded ? 4000 : 1; // max 4440, disappear pretty fast when flooded
	return pass;
}

/**
 * Marks train as crashed and creates an AI event.
 * Doesn't do anything if the train is crashed already.
 * @param v first vehicle of chain
 * @return number of victims (including 2 drivers; zero if train was already crashed)
 */
static uint TrainCrashed(Train *v)
{
	uint num = 0;

	/* do not crash train twice */
	if (!(v->vehstatus & VS_CRASHED)) {
		num = v->Crash();
		AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN));
		Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN));
	}

	/* Try to re-reserve track under already crashed train too.
	 * Crash() clears the reservation! */
	v->ReserveTrackUnderConsist();

	return num;
}

/** Temporary data storage for testing collisions. */
struct TrainCollideChecker {
	Train *v; ///< %Vehicle we are testing for collision.
	uint num; ///< Total number of victims if train collided.
};

/**
 * Collision test function.
 * @param v %Train vehicle to test collision with.
 * @param data %Train being examined.
 * @return \c nullptr (always continue search)
 */
static Vehicle *FindTrainCollideEnum(Vehicle *v, void *data)
{
	TrainCollideChecker *tcc = (TrainCollideChecker*)data;

	/* not a train or in depot */
	if (v->type != VEH_TRAIN || Train::From(v)->track == TRACK_BIT_DEPOT) return nullptr;

	/* do not crash into trains of another company. */
	if (v->owner != tcc->v->owner) return nullptr;

	/* get first vehicle now to make most usual checks faster */
	Train *coll = Train::From(v)->First();

	/* can't collide with own wagons */
	if (coll == tcc->v) return nullptr;

	int x_diff = v->x_pos - tcc->v->x_pos;
	int y_diff = v->y_pos - tcc->v->y_pos;

	/* Do fast calculation to check whether trains are not in close vicinity
	 * and quickly reject trains distant enough for any collision.
	 * Differences are shifted by 7, mapping range [-7 .. 8] into [0 .. 15]
	 * Differences are then ORed and then we check for any higher bits */
	uint hash = (y_diff + 7) | (x_diff + 7);
	if (hash & ~15) return nullptr;

	/* Slower check using multiplication */
	int min_diff = (Train::From(v)->gcache.cached_veh_length + 1) / 2 + (tcc->v->gcache.cached_veh_length + 1) / 2 - 1;
	if (x_diff * x_diff + y_diff * y_diff > min_diff * min_diff) return nullptr;

	/* Happens when there is a train under bridge next to bridge head */
	if (abs(v->z_pos - tcc->v->z_pos) > 5) return nullptr;

	/* crash both trains */
	tcc->num += TrainCrashed(tcc->v);
	tcc->num += TrainCrashed(coll);

	return nullptr; // continue searching
}

/**
 * Checks whether the specified train has a collision with another vehicle. If
 * so, destroys this vehicle, and the other vehicle if its subtype has TS_Front.
 * Reports the incident in a flashy news item, modifies station ratings and
 * plays a sound.
 * @param v %Train to test.
 */
static bool CheckTrainCollision(Train *v)
{
	/* can't collide in depot */
	if (v->track == TRACK_BIT_DEPOT) return false;

	assert(v->track == TRACK_BIT_WORMHOLE || TileVirtXY(v->x_pos, v->y_pos) == v->tile);

	TrainCollideChecker tcc;
	tcc.v = v;
	tcc.num = 0;

	/* find colliding vehicles */
	if (v->track == TRACK_BIT_WORMHOLE) {
		FindVehicleOnPos(v->tile, &tcc, FindTrainCollideEnum);
		FindVehicleOnPos(GetOtherTunnelBridgeEnd(v->tile), &tcc, FindTrainCollideEnum);
	} else {
		FindVehicleOnPosXY(v->x_pos, v->y_pos, &tcc, FindTrainCollideEnum);
	}

	/* any dead -> no crash */
	if (tcc.num == 0) return false;

	SetDParam(0, tcc.num);
	AddTileNewsItem(STR_NEWS_TRAIN_CRASH, NT_ACCIDENT, v->tile);

	ModifyStationRatingAround(v->tile, v->owner, -160, 30);
	if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_13_TRAIN_COLLISION, v);
	return true;
}

static Vehicle *CheckTrainAtSignal(Vehicle *v, void *data)
{
	if (v->type != VEH_TRAIN || (v->vehstatus & VS_CRASHED)) return nullptr;

	Train *t = Train::From(v);
	DiagDirection exitdir = *(DiagDirection *)data;

	/* not front engine of a train, inside wormhole or depot, crashed */
	if (!t->IsFrontEngine() || !(t->track & TRACK_BIT_MASK)) return nullptr;

	if (t->cur_speed > 5 || VehicleExitDir(t->direction, t->track) != exitdir) return nullptr;

	return t;
}

/**
 * Move a vehicle chain one movement stop forwards.
 * @param v First vehicle to move.
 * @param nomove Stop moving this and all following vehicles.
 * @param reverse Set to false to not execute the vehicle reversing. This does not change any other logic.
 * @return True if the vehicle could be moved forward, false otherwise.
 */
bool TrainController(Train *v, Vehicle *nomove, bool reverse)
{
	Train *first = v->First();
	Train *prev;
	bool direction_changed = false; // has direction of any part changed?

	/* For every vehicle after and including the given vehicle */
	for (prev = v->Previous(); v != nomove; prev = v, v = v->Next()) {
		DiagDirection enterdir = DIAGDIR_BEGIN;
		bool update_signals_crossing = false; // will we update signals or crossing state?

		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
		if (v->track != TRACK_BIT_WORMHOLE) {
			/* Not inside tunnel */
			if (gp.old_tile == gp.new_tile) {
				/* Staying in the old tile */
				if (v->track == TRACK_BIT_DEPOT) {
					/* Inside depot */
					gp.x = v->x_pos;
					gp.y = v->y_pos;
				} else {
					/* Not inside depot */

					/* Reverse when we are at the end of the track already, do not move to the new position */
					if (v->IsFrontEngine() && !TrainCheckIfLineEnds(v, reverse)) return false;

					uint32_t r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
					if (HasBit(r, VETS_CANNOT_ENTER)) {
						goto invalid_rail;
					}
					if (HasBit(r, VETS_ENTERED_STATION)) {
						/* The new position is the end of the platform */
						TrainEnterStation(v, r >> VETS_STATION_ID_OFFSET);
					}
				}
			} else {
				/* A new tile is about to be entered. */

				/* Determine what direction we're entering the new tile from */
				enterdir = DiagdirBetweenTiles(gp.old_tile, gp.new_tile);
				assert(IsValidDiagDirection(enterdir));

				/* Get the status of the tracks in the new tile and mask
				 * away the bits that aren't reachable. */
				TrackStatus ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL, 0, ReverseDiagDir(enterdir));
				TrackdirBits reachable_trackdirs = DiagdirReachesTrackdirs(enterdir);

				TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts) & reachable_trackdirs;
				TrackBits red_signals = TrackdirBitsToTrackBits(TrackStatusToRedSignals(ts) & reachable_trackdirs);

				TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
				if (Rail90DegTurnDisallowed(GetTileRailType(gp.old_tile), GetTileRailType(gp.new_tile)) && prev == nullptr) {
					/* We allow wagons to make 90 deg turns, because forbid_90_deg
					 * can be switched on halfway a turn */
					bits &= ~TrackCrossesTracks(FindFirstTrack(v->track));
				}

				if (bits == TRACK_BIT_NONE) goto invalid_rail;

				/* Check if the new tile constrains tracks that are compatible
				 * with the current train, if not, bail out. */
				if (!CheckCompatibleRail(v, gp.new_tile)) goto invalid_rail;

				TrackBits chosen_track;
				if (prev == nullptr) {
					/* Currently the locomotive is active. Determine which one of the
					 * available tracks to choose */
					chosen_track = TrackToTrackBits(ChooseTrainTrack(v, gp.new_tile, enterdir, bits, false, nullptr, true));
					assert(chosen_track & (bits | GetReservedTrackbits(gp.new_tile)));

					if (v->force_proceed != TFP_NONE && IsPlainRailTile(gp.new_tile) && HasSignals(gp.new_tile)) {
						/* For each signal we find decrease the counter by one.
						 * We start at two, so the first signal we pass decreases
						 * this to one, then if we reach the next signal it is
						 * decreased to zero and we won't pass that new signal. */
						Trackdir dir = FindFirstTrackdir(trackdirbits);
						if (HasSignalOnTrackdir(gp.new_tile, dir) ||
								(HasSignalOnTrackdir(gp.new_tile, ReverseTrackdir(dir)) &&
								GetSignalType(gp.new_tile, TrackdirToTrack(dir)) != SIGTYPE_PBS)) {
							/* However, we do not want to be stopped by PBS signals
							 * entered via the back. */
							v->force_proceed = (v->force_proceed == TFP_SIGNAL) ? TFP_STUCK : TFP_NONE;
							SetWindowDirty(WC_VEHICLE_VIEW, v->index);
						}
					}

					/* Check if it's a red signal and that force proceed is not clicked. */
					if ((red_signals & chosen_track) && v->force_proceed == TFP_NONE) {
						/* In front of a red signal */
						Trackdir i = FindFirstTrackdir(trackdirbits);

						/* Don't handle stuck trains here. */
						if (HasBit(v->flags, VRF_TRAIN_STUCK)) return false;

						if (!HasSignalOnTrackdir(gp.new_tile, ReverseTrackdir(i))) {
							v->cur_speed = 0;
							v->subspeed = 0;
							v->progress = 255; // make sure that every bit of acceleration will hit the signal again, so speed stays 0.
							if (!_settings_game.pf.reverse_at_signals || ++v->wait_counter < _settings_game.pf.wait_oneway_signal * Ticks::DAY_TICKS * 2) return false;
						} else if (HasSignalOnTrackdir(gp.new_tile, i)) {
							v->cur_speed = 0;
							v->subspeed = 0;
							v->progress = 255; // make sure that every bit of acceleration will hit the signal again, so speed stays 0.
							if (!_settings_game.pf.reverse_at_signals || ++v->wait_counter < _settings_game.pf.wait_twoway_signal * Ticks::DAY_TICKS * 2) {
								DiagDirection exitdir = TrackdirToExitdir(i);
								TileIndex o_tile = TileAddByDiagDir(gp.new_tile, exitdir);

								exitdir = ReverseDiagDir(exitdir);

								/* check if a train is waiting on the other side */
								if (!HasVehicleOnPos(o_tile, &exitdir, &CheckTrainAtSignal)) return false;
							}
						}

						/* If we would reverse but are currently in a PBS block and
						 * reversing of stuck trains is disabled, don't reverse.
						 * This does not apply if the reason for reversing is a one-way
						 * signal blocking us, because a train would then be stuck forever. */
						if (!_settings_game.pf.reverse_at_signals && !HasOnewaySignalBlockingTrackdir(gp.new_tile, i) &&
								UpdateSignalsOnSegment(v->tile, enterdir, v->owner) == SIGSEG_PBS) {
							v->wait_counter = 0;
							return false;
						}
						goto reverse_train_direction;
					} else {
						TryReserveRailTrack(gp.new_tile, TrackBitsToTrack(chosen_track), false);
					}
				} else {
					/* The wagon is active, simply follow the prev vehicle. */
					if (prev->tile == gp.new_tile) {
						/* Choose the same track as prev */
						if (prev->track == TRACK_BIT_WORMHOLE) {
							/* Vehicles entering tunnels enter the wormhole earlier than for bridges.
							 * However, just choose the track into the wormhole. */
							assert(IsTunnel(prev->tile));
							chosen_track = bits;
						} else {
							chosen_track = prev->track;
						}
					} else {
						/* Choose the track that leads to the tile where prev is.
						 * This case is active if 'prev' is already on the second next tile, when 'v' just enters the next tile.
						 * I.e. when the tile between them has only space for a single vehicle like
						 *  1) horizontal/vertical track tiles and
						 *  2) some orientations of tunnel entries, where the vehicle is already inside the wormhole at 8/16 from the tile edge.
						 *     Is also the train just reversing, the wagon inside the tunnel is 'on' the tile of the opposite tunnel entry.
						 */
						static const TrackBits _connecting_track[DIAGDIR_END][DIAGDIR_END] = {
							{TRACK_BIT_X,     TRACK_BIT_LOWER, TRACK_BIT_NONE,  TRACK_BIT_LEFT },
							{TRACK_BIT_UPPER, TRACK_BIT_Y,     TRACK_BIT_LEFT,  TRACK_BIT_NONE },
							{TRACK_BIT_NONE,  TRACK_BIT_RIGHT, TRACK_BIT_X,     TRACK_BIT_UPPER},
							{TRACK_BIT_RIGHT, TRACK_BIT_NONE,  TRACK_BIT_LOWER, TRACK_BIT_Y    }
						};
						DiagDirection exitdir = DiagdirBetweenTiles(gp.new_tile, prev->tile);
						assert(IsValidDiagDirection(exitdir));
						chosen_track = _connecting_track[enterdir][exitdir];
					}
					chosen_track &= bits;
				}

				/* Make sure chosen track is a valid track */
				assert(
						chosen_track == TRACK_BIT_X     || chosen_track == TRACK_BIT_Y ||
						chosen_track == TRACK_BIT_UPPER || chosen_track == TRACK_BIT_LOWER ||
						chosen_track == TRACK_BIT_LEFT  || chosen_track == TRACK_BIT_RIGHT);

				/* Update XY to reflect the entrance to the new tile, and select the direction to use */
				const byte *b = _initial_tile_subcoord[FindFirstBit(chosen_track)][enterdir];
				gp.x = (gp.x & ~0xF) | b[0];
				gp.y = (gp.y & ~0xF) | b[1];
				Direction chosen_dir = (Direction)b[2];

				/* Call the landscape function and tell it that the vehicle entered the tile */
				uint32_t r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
				if (HasBit(r, VETS_CANNOT_ENTER)) {
					goto invalid_rail;
				}

				if (!HasBit(r, VETS_ENTERED_WORMHOLE)) {
					Track track = FindFirstTrack(chosen_track);
					Trackdir tdir = TrackDirectionToTrackdir(track, chosen_dir);
					if (v->IsFrontEngine() && HasPbsSignalOnTrackdir(gp.new_tile, tdir)) {
						SetSignalStateByTrackdir(gp.new_tile, tdir, SIGNAL_STATE_RED);
						MarkTileDirtyByTile(gp.new_tile);
					}

					/* Clear any track reservation when the last vehicle leaves the tile */
					if (v->Next() == nullptr) ClearPathReservation(v, v->tile, v->GetVehicleTrackdir());

					v->tile = gp.new_tile;

					if (GetTileRailType(gp.new_tile) != GetTileRailType(gp.old_tile)) {
						v->First()->ConsistChanged(CCF_TRACK);
					}

					v->track = chosen_track;
					assert(v->track);
				}

				/* We need to update signal status, but after the vehicle position hash
				 * has been updated by UpdateInclination() */
				update_signals_crossing = true;

				if (chosen_dir != v->direction) {
					if (prev == nullptr && _settings_game.vehicle.train_acceleration_model == AM_ORIGINAL) {
						const AccelerationSlowdownParams *asp = &_accel_slowdown[GetRailTypeInfo(v->railtype)->acceleration_type];
						DirDiff diff = DirDifference(v->direction, chosen_dir);
						v->cur_speed -= (diff == DIRDIFF_45RIGHT || diff == DIRDIFF_45LEFT ? asp->small_turn : asp->large_turn) * v->cur_speed >> 8;
					}
					direction_changed = true;
					v->direction = chosen_dir;
				}

				if (v->IsFrontEngine()) {
					v->wait_counter = 0;

					/* If we are approaching a crossing that is reserved, play the sound now. */
					TileIndex crossing = TrainApproachingCrossingTile(v);
					if (crossing != INVALID_TILE && HasCrossingReservation(crossing) && _settings_client.sound.ambient) SndPlayTileFx(SND_0E_LEVEL_CROSSING, crossing);

					/* Always try to extend the reservation when entering a tile. */
					CheckNextTrainTile(v);
				}

				if (HasBit(r, VETS_ENTERED_STATION)) {
					/* The new position is the location where we want to stop */
					TrainEnterStation(v, r >> VETS_STATION_ID_OFFSET);
				}
			}
		} else {
			if (IsTileType(gp.new_tile, MP_TUNNELBRIDGE) && HasBit(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
				/* Perform look-ahead on tunnel exit. */
				if (v->IsFrontEngine()) {
					TryReserveRailTrack(gp.new_tile, DiagDirToDiagTrack(GetTunnelBridgeDirection(gp.new_tile)));
					CheckNextTrainTile(v);
				}
				/* Prevent v->UpdateInclination() being called with wrong parameters.
				 * This could happen if the train was reversed inside the tunnel/bridge. */
				if (gp.old_tile == gp.new_tile) {
					gp.old_tile = GetOtherTunnelBridgeEnd(gp.old_tile);
				}
			} else {
				v->x_pos = gp.x;
				v->y_pos = gp.y;
				v->UpdatePosition();
				if ((v->vehstatus & VS_HIDDEN) == 0) v->Vehicle::UpdateViewport(true);
				continue;
			}
		}

		/* update image of train, as well as delta XY */
		v->UpdateDeltaXY();

		v->x_pos = gp.x;
		v->y_pos = gp.y;
		v->UpdatePosition();

		/* update the Z position of the vehicle */
		int old_z = v->UpdateInclination(gp.new_tile != gp.old_tile, false);

		if (prev == nullptr) {
			/* This is the first vehicle in the train */
			AffectSpeedByZChange(v, old_z);
		}

		if (update_signals_crossing) {
			if (v->IsFrontEngine()) {
				if (TrainMovedChangeSignals(gp.new_tile, enterdir)) {
					/* We are entering a block with PBS signals right now, but
					 * not through a PBS signal. This means we don't have a
					 * reservation right now. As a conventional signal will only
					 * ever be green if no other train is in the block, getting
					 * a path should always be possible. If the player built
					 * such a strange network that it is not possible, the train
					 * will be marked as stuck and the player has to deal with
					 * the problem. */
					if ((!HasReservedTracks(gp.new_tile, v->track) &&
							!TryReserveRailTrack(gp.new_tile, FindFirstTrack(v->track))) ||
							!TryPathReserve(v)) {
						MarkTrainAsStuck(v);
					}
				}
			}

			/* Signals can only change when the first
			 * (above) or the last vehicle moves. */
			if (v->Next() == nullptr) {
				TrainMovedChangeSignals(gp.old_tile, ReverseDiagDir(enterdir));
				if (IsLevelCrossingTile(gp.old_tile)) UpdateLevelCrossing(gp.old_tile);
			}
		}

		/* Do not check on every tick to save some computing time. */
		if (v->IsFrontEngine() && v->tick_counter % _settings_game.pf.path_backoff_interval == 0) CheckNextTrainTile(v);
	}

	if (direction_changed) first->tcache.cached_max_curve_speed = first->GetCurveSpeedLimit();

	return true;

invalid_rail:
	/* We've reached end of line?? */
	if (prev != nullptr) FatalError("Disconnecting train");

reverse_train_direction:
	if (reverse) {
		v->wait_counter = 0;
		v->cur_speed = 0;
		v->subspeed = 0;
		ReverseTrainDirection(v);
	}

	return false;
}

/**
 * Collect trackbits of all crashed train vehicles on a tile
 * @param v Vehicle passed from Find/HasVehicleOnPos()
 * @param data trackdirbits for the result
 * @return nullptr to iterate over all vehicles on the tile.
 */
static Vehicle *CollectTrackbitsFromCrashedVehiclesEnum(Vehicle *v, void *data)
{
	TrackBits *trackbits = (TrackBits *)data;

	if (v->type == VEH_TRAIN && (v->vehstatus & VS_CRASHED) != 0) {
		TrackBits train_tbits = Train::From(v)->track;
		if (train_tbits == TRACK_BIT_WORMHOLE) {
			/* Vehicle is inside a wormhole, v->track contains no useful value then. */
			*trackbits |= DiagDirToDiagTrackBits(GetTunnelBridgeDirection(v->tile));
		} else if (train_tbits != TRACK_BIT_DEPOT) {
			*trackbits |= train_tbits;
		}
	}

	return nullptr;
}

static bool IsRailStationPlatformOccupied(TileIndex tile)
{
	TileIndexDiff delta = (GetRailStationAxis(tile) == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));

	for (TileIndex t = tile; IsCompatibleTrainStationTile(t, tile); t -= delta) {
		if (HasVehicleOnPos(t, nullptr, &TrainOnTileEnum)) return true;
	}
	for (TileIndex t = tile + delta; IsCompatibleTrainStationTile(t, tile); t += delta) {
		if (HasVehicleOnPos(t, nullptr, &TrainOnTileEnum)) return true;
	}

	return false;
}

/**
 * Deletes/Clears the last wagon of a crashed train. It takes the engine of the
 * train, then goes to the last wagon and deletes that. Each call to this function
 * will remove the last wagon of a crashed train. If this wagon was on a crossing,
 * or inside a tunnel/bridge, recalculate the signals as they might need updating
 * @param v the Vehicle of which last wagon is to be removed
 */
static void DeleteLastWagon(Train *v)
{
	Train *first = v->First();

	/* Go to the last wagon and delete the link pointing there
	 * *u is then the one-before-last wagon, and *v the last
	 * one which will physically be removed */
	Train *u = v;
	for (; v->Next() != nullptr; v = v->Next()) u = v;
	u->SetNext(nullptr);

	if (first != v) {
		/* Recalculate cached train properties */
		first->ConsistChanged(CCF_ARRANGE);
		/* Update the depot window if the first vehicle is in depot -
		 * if v == first, then it is updated in PreDestructor() */
		if (first->track == TRACK_BIT_DEPOT) {
			SetWindowDirty(WC_VEHICLE_DEPOT, first->tile);
		}
		v->last_station_visited = first->last_station_visited; // for PreDestructor
	}

	/* 'v' shouldn't be accessed after it has been deleted */
	TrackBits trackbits = v->track;
	TileIndex tile = v->tile;
	Owner owner = v->owner;

	delete v;
	v = nullptr; // make sure nobody will try to read 'v' anymore

	if (trackbits == TRACK_BIT_WORMHOLE) {
		/* Vehicle is inside a wormhole, v->track contains no useful value then. */
		trackbits = DiagDirToDiagTrackBits(GetTunnelBridgeDirection(tile));
	}

	Track track = TrackBitsToTrack(trackbits);
	if (HasReservedTracks(tile, trackbits)) {
		UnreserveRailTrack(tile, track);

		/* If there are still crashed vehicles on the tile, give the track reservation to them */
		TrackBits remaining_trackbits = TRACK_BIT_NONE;
		FindVehicleOnPos(tile, &remaining_trackbits, CollectTrackbitsFromCrashedVehiclesEnum);

		/* It is important that these two are the first in the loop, as reservation cannot deal with every trackbit combination */
		assert(TRACK_BEGIN == TRACK_X && TRACK_Y == TRACK_BEGIN + 1);
		for (Track t : SetTrackBitIterator(remaining_trackbits)) TryReserveRailTrack(tile, t);
	}

	/* check if the wagon was on a road/rail-crossing */
	if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile);

	if (IsRailStationTile(tile)) {
		bool occupied = IsRailStationPlatformOccupied(tile);
		DiagDirection dir = AxisToDiagDir(GetRailStationAxis(tile));
		SetRailStationPlatformReservation(tile, dir, occupied);
		SetRailStationPlatformReservation(tile, ReverseDiagDir(dir), occupied);
	}

	/* Update signals */
	if (IsTileType(tile, MP_TUNNELBRIDGE) || IsRailDepotTile(tile)) {
		UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, owner);
	} else {
		SetSignalsOnBothDir(tile, track, owner);
	}
}

/**
 * Rotate all vehicles of a (crashed) train chain randomly to animate the crash.
 * @param v First crashed vehicle.
 */
static void ChangeTrainDirRandomly(Train *v)
{
	static const DirDiff delta[] = {
		DIRDIFF_45LEFT, DIRDIFF_SAME, DIRDIFF_SAME, DIRDIFF_45RIGHT
	};

	do {
		/* We don't need to twist around vehicles if they're not visible */
		if (!(v->vehstatus & VS_HIDDEN)) {
			v->direction = ChangeDir(v->direction, delta[GB(Random(), 0, 2)]);
			/* Refrain from updating the z position of the vehicle when on
			 * a bridge, because UpdateInclination() will put the vehicle under
			 * the bridge in that case */
			if (v->track != TRACK_BIT_WORMHOLE) {
				v->UpdatePosition();
				v->UpdateInclination(false, true);
			} else {
				v->UpdateViewport(false, true);
			}
		}
	} while ((v = v->Next()) != nullptr);
}

/**
 * Handle a crashed train.
 * @param v First train vehicle.
 * @return %Vehicle chain still exists.
 */
static bool HandleCrashedTrain(Train *v)
{
	int state = ++v->crash_anim_pos;

	if (state == 4 && !(v->vehstatus & VS_HIDDEN)) {
		CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
	}

	uint32_t r;
	if (state <= 200 && Chance16R(1, 7, r)) {
		int index = (r * 10 >> 16);

		Vehicle *u = v;
		do {
			if (--index < 0) {
				r = Random();

				CreateEffectVehicleRel(u,
					GB(r,  8, 3) + 2,
					GB(r, 16, 3) + 2,
					GB(r,  0, 3) + 5,
					EV_EXPLOSION_SMALL);
				break;
			}
		} while ((u = u->Next()) != nullptr);
	}

	if (state <= 240 && !(v->tick_counter & 3)) ChangeTrainDirRandomly(v);

	if (state >= 4440 && !(v->tick_counter & 0x1F)) {
		bool ret = v->Next() != nullptr;
		DeleteLastWagon(v);
		return ret;
	}

	return true;
}

/** Maximum speeds for train that is broken down or approaching line end */
static const uint16_t _breakdown_speeds[16] = {
	225, 210, 195, 180, 165, 150, 135, 120, 105, 90, 75, 60, 45, 30, 15, 15
};


/**
 * Train is approaching line end, slow down and possibly reverse
 *
 * @param v front train engine
 * @param signal not line end, just a red signal
 * @param reverse Set to false to not execute the vehicle reversing. This does not change any other logic.
 * @return true iff we did NOT have to reverse
 */
static bool TrainApproachingLineEnd(Train *v, bool signal, bool reverse)
{
	/* Calc position within the current tile */
	uint x = v->x_pos & 0xF;
	uint y = v->y_pos & 0xF;

	/* for diagonal directions, 'x' will be 0..15 -
	 * for other directions, it will be 1, 3, 5, ..., 15 */
	switch (v->direction) {
		case DIR_N : x = ~x + ~y + 25; break;
		case DIR_NW: x = y;            [[fallthrough]];
		case DIR_NE: x = ~x + 16;      break;
		case DIR_E : x = ~x + y + 9;   break;
		case DIR_SE: x = y;            break;
		case DIR_S : x = x + y - 7;    break;
		case DIR_W : x = ~y + x + 9;   break;
		default: break;
	}

	/* Do not reverse when approaching red signal. Make sure the vehicle's front
	 * does not cross the tile boundary when we do reverse, but as the vehicle's
	 * location is based on their center, use half a vehicle's length as offset.
	 * Multiply the half-length by two for straight directions to compensate that
	 * we only get odd x offsets there. */
	if (!signal && x + (v->gcache.cached_veh_length + 1) / 2 * (IsDiagonalDirection(v->direction) ? 1 : 2) >= TILE_SIZE) {
		/* we are too near the tile end, reverse now */
		v->cur_speed = 0;
		if (reverse) ReverseTrainDirection(v);
		return false;
	}

	/* slow down */
	v->vehstatus |= VS_TRAIN_SLOWING;
	uint16_t break_speed = _breakdown_speeds[x & 0xF];
	if (break_speed < v->cur_speed) v->cur_speed = break_speed;

	return true;
}


/**
 * Determines whether train would like to leave the tile
 * @param v train to test
 * @return true iff vehicle is NOT entering or inside a depot or tunnel/bridge
 */
static bool TrainCanLeaveTile(const Train *v)
{
	/* Exit if inside a tunnel/bridge or a depot */
	if (v->track == TRACK_BIT_WORMHOLE || v->track == TRACK_BIT_DEPOT) return false;

	TileIndex tile = v->tile;

	/* entering a tunnel/bridge? */
	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
		DiagDirection dir = GetTunnelBridgeDirection(tile);
		if (DiagDirToDir(dir) == v->direction) return false;
	}

	/* entering a depot? */
	if (IsRailDepotTile(tile)) {
		DiagDirection dir = ReverseDiagDir(GetRailDepotDirection(tile));
		if (DiagDirToDir(dir) == v->direction) return false;
	}

	return true;
}


/**
 * Determines whether train is approaching a rail-road crossing
 *   (thus making it barred)
 * @param v front engine of train
 * @return TileIndex of crossing the train is approaching, else INVALID_TILE
 * @pre v in non-crashed front engine
 */
static TileIndex TrainApproachingCrossingTile(const Train *v)
{
	assert(v->IsFrontEngine());
	assert(!(v->vehstatus & VS_CRASHED));

	if (!TrainCanLeaveTile(v)) return INVALID_TILE;

	DiagDirection dir = VehicleExitDir(v->direction, v->track);
	TileIndex tile = v->tile + TileOffsByDiagDir(dir);

	/* not a crossing || wrong axis || unusable rail (wrong type or owner) */
	if (!IsLevelCrossingTile(tile) || DiagDirToAxis(dir) == GetCrossingRoadAxis(tile) ||
			!CheckCompatibleRail(v, tile)) {
		return INVALID_TILE;
	}

	return tile;
}


/**
 * Checks for line end. Also, bars crossing at next tile if needed
 *
 * @param v vehicle we are checking
 * @param reverse Set to false to not execute the vehicle reversing. This does not change any other logic.
 * @return true iff we did NOT have to reverse
 */
static bool TrainCheckIfLineEnds(Train *v, bool reverse)
{
	/* First, handle broken down train */

	int t = v->breakdown_ctr;
	if (t > 1) {
		v->vehstatus |= VS_TRAIN_SLOWING;

		uint16_t break_speed = _breakdown_speeds[GB(~t, 4, 4)];
		if (break_speed < v->cur_speed) v->cur_speed = break_speed;
	} else {
		v->vehstatus &= ~VS_TRAIN_SLOWING;
	}

	if (!TrainCanLeaveTile(v)) return true;

	/* Determine the non-diagonal direction in which we will exit this tile */
	DiagDirection dir = VehicleExitDir(v->direction, v->track);
	/* Calculate next tile */
	TileIndex tile = v->tile + TileOffsByDiagDir(dir);

	/* Determine the track status on the next tile */
	TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir));
	TrackdirBits reachable_trackdirs = DiagdirReachesTrackdirs(dir);

	TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts) & reachable_trackdirs;
	TrackdirBits red_signals = TrackStatusToRedSignals(ts) & reachable_trackdirs;

	/* We are sure the train is not entering a depot, it is detected above */

	/* mask unreachable track bits if we are forbidden to do 90deg turns */
	TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
	if (Rail90DegTurnDisallowed(GetTileRailType(v->tile), GetTileRailType(tile))) {
		bits &= ~TrackCrossesTracks(FindFirstTrack(v->track));
	}

	/* no suitable trackbits at all || unusable rail (wrong type or owner) */
	if (bits == TRACK_BIT_NONE || !CheckCompatibleRail(v, tile)) {
		return TrainApproachingLineEnd(v, false, reverse);
	}

	/* approaching red signal */
	if ((trackdirbits & red_signals) != 0) return TrainApproachingLineEnd(v, true, reverse);

	/* approaching a rail/road crossing? then make it red */
	if (IsLevelCrossingTile(tile)) MaybeBarCrossingWithSound(tile);

	return true;
}


static bool TrainLocoHandler(Train *v, bool mode)
{
	/* train has crashed? */
	if (v->vehstatus & VS_CRASHED) {
		return mode ? true : HandleCrashedTrain(v); // 'this' can be deleted here
	}

	if (v->force_proceed != TFP_NONE) {
		ClrBit(v->flags, VRF_TRAIN_STUCK);
		SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
	}

	/* train is broken down? */
	if (v->HandleBreakdown()) return true;

	if (HasBit(v->flags, VRF_REVERSING) && v->cur_speed == 0) {
		ReverseTrainDirection(v);
	}

	/* exit if train is stopped */
	if ((v->vehstatus & VS_STOPPED) && v->cur_speed == 0) return true;

	bool valid_order = !v->current_order.IsType(OT_NOTHING) && v->current_order.GetType() != OT_CONDITIONAL;
	if (ProcessOrders(v) && CheckReverseTrain(v)) {
		v->wait_counter = 0;
		v->cur_speed = 0;
		v->subspeed = 0;
		ClrBit(v->flags, VRF_LEAVING_STATION);
		ReverseTrainDirection(v);
		return true;
	} else if (HasBit(v->flags, VRF_LEAVING_STATION)) {
		/* Try to reserve a path when leaving the station as we
		 * might not be marked as wanting a reservation, e.g.
		 * when an overlength train gets turned around in a station. */
		DiagDirection dir = VehicleExitDir(v->direction, v->track);
		if (IsRailDepotTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE)) dir = INVALID_DIAGDIR;

		if (UpdateSignalsOnSegment(v->tile, dir, v->owner) == SIGSEG_PBS || _settings_game.pf.reserve_paths) {
			TryPathReserve(v, true, true);
		}
		ClrBit(v->flags, VRF_LEAVING_STATION);
	}

	v->HandleLoading(mode);

	if (v->current_order.IsType(OT_LOADING)) return true;

	if (CheckTrainStayInDepot(v)) return true;

	if (!mode) v->ShowVisualEffect();

	/* We had no order but have an order now, do look ahead. */
	if (!valid_order && !v->current_order.IsType(OT_NOTHING)) {
		CheckNextTrainTile(v);
	}

	/* Handle stuck trains. */
	if (!mode && HasBit(v->flags, VRF_TRAIN_STUCK)) {
		++v->wait_counter;

		/* Should we try reversing this tick if still stuck? */
		bool turn_around = v->wait_counter % (_settings_game.pf.wait_for_pbs_path * Ticks::DAY_TICKS) == 0 && _settings_game.pf.reverse_at_signals;

		if (!turn_around && v->wait_counter % _settings_game.pf.path_backoff_interval != 0 && v->force_proceed == TFP_NONE) return true;
		if (!TryPathReserve(v)) {
			/* Still stuck. */
			if (turn_around) ReverseTrainDirection(v);

			if (HasBit(v->flags, VRF_TRAIN_STUCK) && v->wait_counter > 2 * _settings_game.pf.wait_for_pbs_path * Ticks::DAY_TICKS) {
				/* Show message to player. */
				if (_settings_client.gui.lost_vehicle_warn && v->owner == _local_company) {
					SetDParam(0, v->index);
					AddVehicleAdviceNewsItem(STR_NEWS_TRAIN_IS_STUCK, v->index);
				}
				v->wait_counter = 0;
			}
			/* Exit if force proceed not pressed, else reset stuck flag anyway. */
			if (v->force_proceed == TFP_NONE) return true;
			ClrBit(v->flags, VRF_TRAIN_STUCK);
			v->wait_counter = 0;
			SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
		}
	}

	if (v->current_order.IsType(OT_LEAVESTATION)) {
		v->current_order.Free();
		SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
		return true;
	}

	int j = v->UpdateSpeed();

	/* we need to invalidate the widget if we are stopping from 'Stopping 0 km/h' to 'Stopped' */
	if (v->cur_speed == 0 && (v->vehstatus & VS_STOPPED)) {
		/* If we manually stopped, we're not force-proceeding anymore. */
		v->force_proceed = TFP_NONE;
		SetWindowDirty(WC_VEHICLE_VIEW, v->index);
	}

	int adv_spd = v->GetAdvanceDistance();
	if (j < adv_spd) {
		/* if the vehicle has speed 0, update the last_speed field. */
		if (v->cur_speed == 0) v->SetLastSpeed();
	} else {
		TrainCheckIfLineEnds(v);
		/* Loop until the train has finished moving. */
		for (;;) {
			j -= adv_spd;
			TrainController(v, nullptr);
			/* Don't continue to move if the train crashed. */
			if (CheckTrainCollision(v)) break;
			/* Determine distance to next map position */
			adv_spd = v->GetAdvanceDistance();

			/* No more moving this tick */
			if (j < adv_spd || v->cur_speed == 0) break;

			OrderType order_type = v->current_order.GetType();
			/* Do not skip waypoints (incl. 'via' stations) when passing through at full speed. */
			if ((order_type == OT_GOTO_WAYPOINT || order_type == OT_GOTO_STATION) &&
						(v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) &&
						IsTileType(v->tile, MP_STATION) &&
						v->current_order.GetDestination() == GetStationIndex(v->tile)) {
				ProcessOrders(v);
			}
		}
		v->SetLastSpeed();
	}

	for (Train *u = v; u != nullptr; u = u->Next()) {
		if ((u->vehstatus & VS_HIDDEN) != 0) continue;

		u->UpdateViewport(false, false);
	}

	if (v->progress == 0) v->progress = j; // Save unused spd for next time, if TrainController didn't set progress

	return true;
}

/**
 * Get running cost for the train consist.
 * @return Yearly running costs.
 */
Money Train::GetRunningCost() const
{
	Money cost = 0;
	const Train *v = this;

	do {
		const Engine *e = v->GetEngine();
		if (e->u.rail.running_cost_class == INVALID_PRICE) continue;

		uint cost_factor = GetVehicleProperty(v, PROP_TRAIN_RUNNING_COST_FACTOR, e->u.rail.running_cost);
		if (cost_factor == 0) continue;

		/* Halve running cost for multiheaded parts */
		if (v->IsMultiheaded()) cost_factor /= 2;

		cost += GetPrice(e->u.rail.running_cost_class, cost_factor, e->GetGRF());
	} while ((v = v->GetNextVehicle()) != nullptr);

	return cost;
}

/**
 * Update train vehicle data for a tick.
 * @return True if the vehicle still exists, false if it has ceased to exist (front of consists only).
 */
bool Train::Tick()
{
	this->tick_counter++;

	if (this->IsFrontEngine()) {
		PerformanceAccumulator framerate(PFE_GL_TRAINS);

		if (!(this->vehstatus & VS_STOPPED) || this->cur_speed > 0) this->running_ticks++;

		this->current_order_time++;

		if (!TrainLocoHandler(this, false)) return false;

		return TrainLocoHandler(this, true);
	} else if (this->IsFreeWagon() && (this->vehstatus & VS_CRASHED)) {
		/* Delete flooded standalone wagon chain */
		if (++this->crash_anim_pos >= 4400) {
			delete this;
			return false;
		}
	}

	return true;
}

/**
 * Check whether a train needs service, and if so, find a depot or service it.
 * @return v %Train to check.
 */
static void CheckIfTrainNeedsService(Train *v)
{
	if (Company::Get(v->owner)->settings.vehicle.servint_trains == 0 || !v->NeedsAutomaticServicing()) return;
	if (v->IsChainInDepot()) {
		VehicleServiceInDepot(v);
		return;
	}

	uint max_penalty;
	switch (_settings_game.pf.pathfinder_for_trains) {
		case VPF_NPF:  max_penalty = _settings_game.pf.npf.maximum_go_to_depot_penalty;  break;
		case VPF_YAPF: max_penalty = _settings_game.pf.yapf.maximum_go_to_depot_penalty; break;
		default: NOT_REACHED();
	}

	FindDepotData tfdd = FindClosestTrainDepot(v, max_penalty);
	/* Only go to the depot if it is not too far out of our way. */
	if (tfdd.best_length == UINT_MAX || tfdd.best_length > max_penalty) {
		if (v->current_order.IsType(OT_GOTO_DEPOT)) {
			/* If we were already heading for a depot but it has
			 * suddenly moved farther away, we continue our normal
			 * schedule? */
			v->current_order.MakeDummy();
			SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
		}
		return;
	}

	DepotID depot = GetDepotIndex(tfdd.tile);

	if (v->current_order.IsType(OT_GOTO_DEPOT) &&
			v->current_order.GetDestination() != depot &&
			!Chance16(3, 16)) {
		return;
	}

	SetBit(v->gv_flags, GVF_SUPPRESS_IMPLICIT_ORDERS);
	v->current_order.MakeGoToDepot(depot, ODTFB_SERVICE, ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS, ODATFB_NEAREST_DEPOT);
	v->dest_tile = tfdd.tile;
	SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
}

/** Calendar day handler. */
void Train::OnNewCalendarDay()
{
	AgeVehicle(this);
}

/** Economy day handler. */
void Train::OnNewEconomyDay()
{
	if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this);

	if (this->IsFrontEngine()) {
		CheckVehicleBreakdown(this);

		CheckIfTrainNeedsService(this);

		CheckOrders(this);

		/* update destination */
		if (this->current_order.IsType(OT_GOTO_STATION)) {
			TileIndex tile = Station::Get(this->current_order.GetDestination())->train_station.tile;
			if (tile != INVALID_TILE) this->dest_tile = tile;
		}

		if (this->running_ticks != 0) {
			/* running costs */
			CommandCost cost(EXPENSES_TRAIN_RUN, this->GetRunningCost() * this->running_ticks / (CalendarTime::DAYS_IN_YEAR  * Ticks::DAY_TICKS));

			this->profit_this_year -= cost.GetCost();
			this->running_ticks = 0;

			SubtractMoneyFromCompanyFract(this->owner, cost);

			SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
			SetWindowClassesDirty(WC_TRAINS_LIST);
		}
	}
}

/**
 * Get the tracks of the train vehicle.
 * @return Current tracks of the vehicle.
 */
Trackdir Train::GetVehicleTrackdir() const
{
	if (this->vehstatus & VS_CRASHED) return INVALID_TRACKDIR;

	if (this->track == TRACK_BIT_DEPOT) {
		/* We'll assume the train is facing outwards */
		return DiagDirToDiagTrackdir(GetRailDepotDirection(this->tile)); // Train in depot
	}

	if (this->track == TRACK_BIT_WORMHOLE) {
		/* train in tunnel or on bridge, so just use its direction and assume a diagonal track */
		return DiagDirToDiagTrackdir(DirToDiagDir(this->direction));
	}

	return TrackDirectionToTrackdir(FindFirstTrack(this->track), this->direction);
}

uint16_t Train::GetMaxWeight() const
{
	uint16_t weight = CargoSpec::Get(this->cargo_type)->WeightOfNUnitsInTrain(this->GetEngine()->DetermineCapacity(this));

	/* Vehicle weight is not added for articulated parts. */
	if (!this->IsArticulatedPart()) {
		weight += GetVehicleProperty(this, PROP_TRAIN_WEIGHT, RailVehInfo(this->engine_type)->weight);
	}

	/* Powered wagons have extra weight added. */
	if (HasBit(this->flags, VRF_POWEREDWAGON)) {
		weight += RailVehInfo(this->gcache.first_engine)->pow_wag_weight;
	}

	return weight;
}