426/3075(13%) line coverage

      
10
20
30
40
50
60
70
80
90
100
110
120
130
140
150
160
170
180
190
200
210
220
230
240
250
260
270
280
290
300
310
320
330
340
350
360
370
380
390
400
410
420
430
440
450
460
470
480
490
500
510
520
530
540
550
560
570
580
590
600
610
620
630
640
650
660
670
680
690
700
710
720
730
740
750
760
770
780
790
800
810
820
830
840
850
860
870
880
890
900
910
920
930
940
950
960
970
980
990
1000
1010
1020
1030
1040
1050
1060
1070
1080
1090
1100
1110
1120
1130
1140
1150
1160
1170
1180
1190
1200
1211
1220
1230
1240
1250
1260
1270
1280
1290
1300
1310
1320
1330
1340
1350
1360
1370
1380
1390
1400
1411
1420
1431
1441
1450
1461
1470
1480
1490
1500
1512928
1520
1530
1540
1550
1561464
1571464
1580
1591464
1600
161471
162471
163471
1640
165130
166130
167130
1680
169130
170130
171130
1720
1731
1741
1751
1760
1770
1780
1790
1800
1810
1820
1830
1840
185732
186732
1870
1880
1890
1900
1910
1920
1930
1940
1950
1960
1970
1980
1990
2000
2010
2020
2030
2040
2050
2060
2070
2080
2090
2100
2110
2120
2130
2140
2150
2160
2170
2180
2190
2200
2210
2220
2230
2240
2250
2260
2270
2280
2290
2300
2310
2320
233732
2340
2350
2360
2370
2380
2390
2400
2410
2420
2430
2440
2450
2460
2470
2480
2490
2507473
2510
252732
2530
254732
255732
256732
257732
2580
2590
2600
2610
2620
2630
2640
2650
2660
2670
2680
2690
2700
2710
2720
2730
2740
275157
2760
2770
2780
2790
2800
2810
2820
2830
2840
2850
2860
2870
2880
2890
2900
2910
2920
2930
2940
2950
2960
2970
2980
2990
3000
3010
3020
3030
3040
3050
3060
3070
3080
3090
3100
3110
3120
3130
3140
3150
3160
3170
3180
3190
3200
3210
3220
3230
3240
3250
3260
3270
3280
3290
3300
3310
3320
3330
3340
3350
3360
3370
3380
3390
3400
3410
3420
3430
3440
3450
3460
3470
3480
3490
3500
3510
3520
3530
3540
3550
3560
3570
3580
3590
3600
3610
3620
3630
3640
3650
3660
3670
3680
3690
3700
3710
3720
3730
3740
3750
3760
3770
3780
3790
3800
3810
3820
3830
3840
3850
3860
3870
3880
3890
3900
3910
3920
3930
3940
3950
3960
3970
3980
3990
4000
4010
4020
4030
4040
4050
4060
4070
4080
4090
4100
4110
4120
4130
4140
4150
4160
4170
4180
4190
4200
4210
4220
4230
4240
4250
4260
4270
4280
4290
4300
4310
4320
4330
4340
4350
4360
4370
4380
4390
4400
4410
4420
4430
4440
4450
4460
4470
4481
4490
4501
4511
4520
4530
4540
4550
4560
4570
4580
4590
4600
4619
4629
4630
4640
4650
4660
4670
4680
4690
4700
4710
4720
4730
4740
4750
4760
4770
4780
479130
4800
4810
482130
4830
4840
485130
4860
487130
4880
4890
4900
4910
4920
4930
4940
4950
4960
4970
4980
4990
5000
5010
5020
5030
5040
5050
5061
5070
5080
5090
5100
5111
5120
5131
5141
5150
5161
5170
5180
5190
5200
5211
5220
5230
5240
5250
5261
5270
5281
5290
5300
5311
5320
5331
5340
5350
5360
5371
5380
5391
5400
5410
5420
5430
5440
5450
5460
5470
5480
5490
5500
5510
5520
5530
5540
5550
5560
5570
5580
5590
5600
5610
5620
5630
5640
5650
5660
5670
5680
5690
5700
5710
5720
5730
5740
5752
5761
5771
5780
5790
5800
5810
5820
5833
5840
5850
5860
5870
5880
5890
5900
5910
5920
5930
5940
5950
5960
5970
5980
5990
6000
6010
6020
6030
6040
6050
6060
6070
6080
6090
6100
6110
6120
6130
6140
6150
6160
6170
6180
6190
6200
6210
6220
6230
6240
6250
6260
6270
6280
6290
6300
6310
6320
6330
6340
6350
6360
6370
6380
6390
6400
6410
6420
6430
6440
6450
6460
6470
6480
6490
6500
6510
6520
6530
6540
6550
6560
6570
6580
6590
6600
6610
6620
6630
6640
6650
6660
6670
6680
6690
6700
6710
6720
6730
6740
6750
6760
6770
6780
6790
6800
6810
6820
6830
6840
6850
6860
6870
6880
6890
6900
6910
6920
6930
6940
6950
6960
6970
6980
6990
7000
7010
7020
7030
7040
7050
7060
7070
7080
7090
7100
7110
7120
7130
7140
7150
7160
7170
7180
7190
7200
7210
7220
7230
7240
7250
7260
7270
7280
7290
7300
7310
7320
7330
7340
7350
7360
7370
7380
7390
7400
7410
7420
7430
7440
7450
7460
7470
7480
7490
7500
7510
7520
7530
7540
7550
7560
7570
7580
7590
7600
7610
7620
7630
7640
7650
7660
7670
7680
7690
7700
7710
7720
7730
7740
7750
7760
7770
7780
7790
7800
7810
7820
7830
7840
7850
7860
7870
7880
7890
7900
7910
7920
7930
7940
7950
7960
7970
7980
7990
8000
8010
8020
8030
8040
8050
8060
8070
8080
8090
8100
8110
8120
8130
8140
8150
8160
8170
8180
8190
8200
8210
8220
8230
8240
8250
8260
8270
8280
8290
8300
8310
8320
8330
8340
8350
8360
8370
8380
8390
8400
8410
8420
8430
8440
8450
8460
8470
8480
8490
8500
8510
8520
8530
8540
8550
8560
8570
8580
8590
8600
8610
8620
8630
8640
8650
8660
8670
8680
8690
8700
8710
8720
8730
8740
8750
8760
8770
8780
8790
8800
8810
8820
8830
8840
8850
8860
8870
8880
8890
8900
8910
8920
8930
8940
8950
8960
8970
8980
8990
9000
9010
9020
9030
9040
9050
9060
9070
9080
9090
9100
9110
9120
9130
9140
9150
9160
9170
9180
9190
9200
9210
9220
9230
9240
9250
9260
9270
9280
9290
9300
9310
9320
9330
9340
9350
9360
9370
9380
9390
9400
9410
9420
9430
9440
9450
9460
9470
9480
9490
9500
9510
9520
9530
9540
9550
9560
9570
9580
9590
9600
9610
9620
9630
9640
9650
9660
9670
9680
9690
9700
9710
9720
9730
9740
9750
9760
9770
9780
9790
9800
9810
9820
9830
9840
9850
9860
9870
9880
9890
9900
9910
9920
9930
9940
9950
9960
9970
9980
9990
10000
10010
10020
10030
10040
10050
10060
10070
10080
10090
10100
10110
10120
10130
10140
10150
10160
10170
10180
10190
10200
10210
10220
10230
10240
10250
10260
10270
10280
10290
10300
10310
10320
10330
10340
10350
10360
10370
10380
10390
10400
10410
10420
10430
10440
10450
10460
10470
10480
10490
10500
10510
10520
10530
10540
10550
10560
10570
10580
10590
10600
10610
10620
10630
10640
10650
10660
10670
10680
10690
10700
10710
10720
10730
10740
10750
10760
10770
10780
10790
10800
10810
10820
10830
10840
10850
10860
10870
10880
10890
10900
10910
10920
10930
10940
10950
10960
10970
10980
10990
11000
11010
11020
11030
11040
11050
11060
11070
11080
11090
11100
11110
11120
11130
11140
11150
11160
11170
11180
11190
11200
11210
11220
11230
11240
11250
11260
11270
11280
11290
11300
11310
11320
11330
11340
11350
11360
11370
11380
11390
11400
11410
11420
11430
11440
11450
11460
11470
11480
11490
11500
11510
11520
11530
11540
11550
11560
11570
11580
11590
11600
11610
11620
11630
11640
11650
11660
11670
11680
11690
11700
11710
11720
11730
11740
11750
11760
11770
11780
11790
11800
11810
11820
11830
11840
11850
11860
11870
11880
11890
11900
11910
11920
11930
11940
11950
11960
11970
11980
11990
12000
12010
12020
12030
12040
12050
12060
12070
12080
12090
12100
12110
12120
12130
12140
12150
12160
12170
12180
12190
12200
12210
12220
12230
12240
12250
12260
12270
12280
12290
12300
12310
12320
12330
12340
12350
12360
12370
12380
12390
12400
12410
12420
12430
12440
12450
12460
12470
12480
12490
12500
12510
12520
12530
12540
12550
12560
12570
12580
12590
12600
12610
12620
12630
12640
12650
12660
12670
12680
12690
12700
12710
12720
12730
12740
12750
12760
12770
12780
12790
12800
12810
12820
12830
12840
12850
12860
12870
12880
12890
12900
12910
12920
12930
12940
12950
12960
12970
12980
12990
13000
13010
13020
13030
13040
13050
13060
13070
13080
13090
13100
13110
13120
13130
13140
13150
13160
13170
13180
13190
13200
13210
13220
13230
13240
13250
13260
13270
13280
13290
13300
13310
13320
13330
13340
13350
13360
13370
13380
13390
13400
13410
13420
13430
13440
13450
13460
13470
13480
13490
13500
13510
13520
13530
13540
13550
13560
13570
13580
13590
13600
13610
13620
13630
13640
13650
13660
13670
13680
13690
13700
13710
13720
13730
13740
13750
13760
13770
13780
13790
13800
13810
13820
13830
13840
13850
13860
13870
13880
13890
13900
13910
13920
13930
13940
13950
13960
13970
13980
13990
14000
14010
14020
14030
14040
14050
14060
14070
14080
14090
14100
14110
14120
14130
14140
14150
14160
14170
14180
14190
14200
14210
14220
14230
14240
14250
14260
14270
14280
14290
14300
14310
14320
14330
14340
14350
14360
14370
14380
14390
14400
14410
14420
14430
14440
14450
14460
14470
14480
14490
14500
14510
14520
14530
14540
14550
14560
14570
14580
14590
14600
14610
14620
14630
14640
14650
14660
14670
14680
14690
14700
14710
14720
14730
14740
14750
14760
14770
14780
14790
14800
14810
14820
14830
14840
14850
14860
14870
14880
14890
14900
14910
14920
14930
14940
14950
14960
14970
14980
14990
15000
15010
15020
15030
15040
15050
15060
15070
15080
15090
15100
15110
15120
15130
15140
15150
15160
15170
15180
15190
15200
15210
15220
15230
15240
15250
15260
15270
15280
15290
15300
15310
15320
15330
15340
15350
15360
15370
15380
15390
15400
15410
15420
15430
15440
15450
15460
15470
15480
15490
15500
15510
15520
15530
15540
15550
15560
15570
15580
15590
15600
15610
15620
15630
15640
15650
15660
15670
15680
15690
15700
15710
15720
15730
15740
15750
15760
15770
15780
15790
15800
15810
15820
15830
15840
15850
15860
15870
15880
15890
15900
15910
15920
15930
15940
15950
15960
15970
15980
15990
16000
16010
16020
16030
16040
16050
16060
16070
16080
16090
16100
16110
16120
16130
16140
16150
16160
16170
16180
16190
16200
16210
16220
16230
16240
16250
16260
16270
16280
16290
16300
16310
16320
16330
16340
16350
16360
16370
16380
16390
16400
16410
16420
16430
16440
16450
16460
16470
16480
16490
16500
16510
16520
16530
16540
16550
16560
16570
16580
16590
16600
16610
16620
16630
16640
16650
16660
16670
16680
16690
16700
16710
16720
16730
16740
16750
16760
16770
16780
16790
16800
16810
16820
16830
16840
16850
16860
16870
16880
16890
16900
16910
16920
16930
16940
16950
16960
16970
16980
16990
17000
17010
17020
17030
17040
17050
17060
17070
17080
17090
17100
17110
17120
17130
17140
17150
17160
17170
17180
17190
17200
17210
17220
17230
17240
17250
17260
17270
17280
17290
17300
17310
17320
17330
17340
17350
17360
17370
17380
17390
17400
17410
17420
17430
17440
17450
17460
17470
17480
17490
17500
17510
17520
17530
17540
17550
17560
17570
17580
17590
17600
17610
17620
17630
17640
17650
17660
17670
17680
17690
17700
17710
17720
17730
17740
17750
17760
17770
17780
17790
17800
17810
17820
17830
17840
17850
17860
17870
17880
17890
17900
17910
17920
17930
17940
17950
17960
17970
17980
17990
18000
18010
18020
18030
18040
18050
18060
18070
18080
18090
18100
18110
18120
18130
18140
18150
18160
18171
18180
18191
18201
18210
18220
18230
18240
18250
18260
18270
18280
18290
18300
18310
1832299
18330
18340
18350
18360
18370
1838299
18390
1840299
18410
1842154
1843154
1844154
18450
1846130
1847130
1848130
1849130
18500
18510
18520
18530
18540
18550
18560
18570
18580
18590
18600
186115
186215
18630
18640
18650
18660
18670
18680
18690
18700
18719
18720
18739
18749
18759
18760
18779
18780
18799
18809
18810
188272
18830
188415
188515
188615
18870
18880
18899
18900
18910
18920
18930
1894130
18950
1896130
18970
18989
18990
19000
19010
1902121
19030
19040
1905130
19060
1907130
19080
19090
1910130
19110
19120
19130
19140
1915130
19160
19170
19180
19190
19200
1921130
19220
1923130
19240
19250
19260
19270
19280
19290
19300
19310
19320
19330
19340
19350
19360
19370
19380
19390
19400
19410
19420
19430
19440
19450
19460
19470
19480
19490
19500
19510
19520
19530
19540
19550
19560
19570
19580
19590
19600
19610
19620
19630
19640
19650
19660
19670
19680
19690
19700
19710
19720
19730
19740
19750
19760
19770
19780
19790
19800
19810
19820
19830
19840
19850
19860
19870
19880
19890
19900
19910
19920
19930
19940
19950
19960
19970
19980
19990
20000
20010
20020
20030
20040
20050
20060
20070
20080
20090
20100
20110
20120
20130
20140
20150
20160
20170
20180
20190
20200
20210
20220
20230
20240
20250
20260
20270
20280
20290
20300
20310
20320
20330
20340
20350
20360
20370
20380
20390
20400
20410
20420
20430
20440
20450
20460
20470
20480
20490
20500
20510
20520
20530
20540
20550
20560
20570
20580
20590
20600
20610
20620
20630
20640
20650
20660
20670
20680
20690
20700
20710
20720
20730
20740
20750
20760
20770
20780
20790
20800
20810
20820
20830
20840
20850
20860
20870
20880
20890
20900
20910
20920
20930
20940
20950
20960
20970
20980
20990
21000
21010
21020
21030
21040
21050
21060
21070
21080
21090
21100
21110
21120
21130
21140
21150
21160
21170
21180
21190
21200
21210
21220
21230
21240
21250
21260
21270
21280
21290
21300
21310
21320
21330
21340
21350
21360
21370
21380
21390
21400
21410
21420
21430
21440
21450
21460
21470
21480
21490
21500
21510
21520
21530
21540
21550
21560
21570
21580
21590
21600
21610
21620
21630
21640
21650
21660
21670
21680
21690
21700
21710
21720
21730
21740
21750
21760
21770
21780
21790
21800
21810
21820
21830
21840
21850
21860
21870
21880
21890
21900
21910
21920
21930
21940
21950
21960
21970
21980
21990
22000
22010
22020
22030
22040
22050
22060
22070
22080
22090
22100
22110
22120
22130
22140
22150
22160
22170
22180
22190
22200
22210
22220
22230
22240
22250
22260
22270
22280
22290
22300
22310
22320
22330
22340
22350
22360
22370
22380
22390
22400
22410
22420
22430
22440
22450
22460
22470
22480
22490
22500
22510
22520
22530
22540
22550
22560
22570
22580
22590
22600
22610
22620
22630
22640
22650
22661
22677
22680
22691
22700
22710
22721
22730
22740
22750
22760
22770
22780
22792
22801
22811
22821
22830
22840
22850
22860
22870
22880
22890
22900
22910
22920
22930
22940
22950
22960
22970
22980
22990
23000
23010
23020
23030
23040
23050
23060
23070
23080
23090
23100
23110
23120
23130
23140
23150
23160
23170
23180
23190
23200
23211
23221
23231
23240
23250
23260
23270
23280
23290
23300
23310
23320
23330
23340
23350
23360
23370
23380
23390
23400
23410
23420
23430
23440
23450
23460
23470
23480
23490
23500
23510
23520
23530
23540
23550
23560
23570
23580
23590
23600
23610
23620
23630
23640
23650
23660
23670
23680
23690
23700
23710
23720
23730
23740
23750
23760
23770
23780
23790
23800
23810
23820
23830
23840
23850
23860
23870
23880
23890
23900
23910
23920
23930
23940
23950
23960
23970
23980
23990
24000
24010
24020
24030
24040
24050
24060
24070
24080
24090
24100
24110
24120
24130
24140
24150
24160
24170
24180
24190
24200
24210
24220
24230
24240
24250
24260
24271
24280
24291
24300
24311
24320
24330
24340
24351
24360
24371
24380
2439393
2440130
24410
24420
24431
24441
24450
24461
24470
24480
24490
24500
24511
24520
24530
24540
24550
2456279
24570
24580
24590
24600
24610
24620
24630
24640
24650
24660
24670
24680
24690
24700
24710
24720
24730
24740
24750
24760
24770
24780
24790
24800
24810
24820
24830
24840
24850
24860
24870
24880
24890
24900
24910
24922
24930
24940
24950
24960
24970
24981
24992
25000
25010
25020
25032
25045
25050
25060
25070
25082
25095
25100
25110
25120
25131
25142
25150
25160
25170
25181
25190
25200
25210
25221
25232
25240
25250
25260
25271
25282
25290
25300
25310
25320
25330
25340
25350
25360
25370
25380
2539261
25400
25410
25420
25430
25443
25450
25460
25470
25480
25493
25500
25510
25520
25530
255427
25550
25560
25570
25580
255927
25600
25610
25620
25630
2564130
2565650
25660
25670
25680
25690
2570130
2571650
25720
25730
25740
25750
25760
25770
25780
25790
25800
25810
25820
25830
25840
25850
25860
25870
2588130
25890
25900
25910
25920
25931
25940
25950
25960
25970
25981
25990
26000
26010
26020
26030
26040
26050
26060
26070
26080
26090
26100
26110
26120
26130
26140
26150
26160
26170
26180
26190
26200
26210
26220
26230
26240
26251
26260
26270
26280
26290
26300
26310
26320
26330
26340
26350
26360
26370
26380
26390
26400
26410
26420
26430
26440
26450
26460
26470
26480
26490
26500
26510
26520
26530
26540
26550
26560
26570
26580
26590
26600
26610
26620
26630
26640
26650
26661
26671
26681
26691
26701
26711
26721
26730
26740
26750
26760
26770
26780
26790
26800
26810
26820
26830
26840
26850
26860
26870
26880
26890
26900
26910
26920
26930
26940
26950
26960
26970
26980
26990
27000
27010
27020
27030
27040
27050
27060
27070
27080
27090
27100
27110
27120
27130
27140
27150
27160
27170
27180
27190
27200
27210
27220
27230
27240
27250
27260
27270
27280
27290
27300
27310
27320
27330
27340
27350
27360
27370
27380
27390
27400
27410
27420
27430
27440
27450
27460
27470
27480
27490
27500
27510
27520
27530
27540
27550
27560
27570
27580
27590
27600
27610
27620
27630
27640
27650
27660
27670
27680
27690
27700
27710
27720
27730
27740
27750
27760
27770
27780
27790
27800
27810
27820
27830
27840
27850
27860
27870
27880
27890
27900
27910
27920
27930
27940
27950
27960
27970
27980
27990
28000
28010
28020
28030
28040
28050
28060
28070
28080
28090
28100
28110
28120
28130
28140
28150
28160
28170
28180
28190
28200
28210
28220
28230
28240
28250
28260
28270
28280
28290
28300
28310
28320
28330
28340
28350
28360
28370
28380
28390
28400
28410
28420
28430
28440
28450
28460
28470
28480
28490
28500
28510
28520
28530
28540
28550
2856130
2857130
28580
28590
28600
2861130
2862130
2863130
2864130
2865130
28660
28670
28680
28690
28700
28710
28720
28730
28740
28750
28760
28770
28780
28790
28800
28810
28820
2883130
28840
2885130
2886130
2887130
2888130
2889130
28900
2891130
28920
28930
28940
28950
28960
28970
28980
28990
29000
29010
29020
29030
29040
29050
29060
29070
29080
29090
29100
29110
29120
29130
29140
29150
29160
29171
29181
29191
29201
29210
29220
29230
29249
29259
29269
29279
29280
29290
29300
29310
29320
29330
29340
29350
29360
29370
29380
29390
29400
29410
29420
29430
29440
29450
29460
29470
29480
29490
29500
29510
29520
29530
29540
29550
29560
2957130
2958130
2959130
29600
29610
29620
29630
29640
29650
29660
29670
29680
29690
29700
29710
29720
29730
29740
29750
29760
29770
29780
29790
29800
29810
29820
29830
29840
29850
29860
29870
29880
29890
29900
29910
29920
29930
29940
29950
29960
29970
29980
29990
30000
3001130
30020
3003130
3004130
30050
30060
30070
30080
30090
30100
30110
30120
30130
30140
30150
30160
30170
30180
30190
30200
30210
30220
30230
30240
30250
30260
30270
30280
30290
30300
30310
30320
30330
30340
30350
30360
30370
30380
30390
30400
30410
30420
30430
30440
30450
30460
30470
30480
30490
30500
30510
30520
30530
30540
30550
30560
30570
30580
30590
30600
30610
30620
30630
30640
30650
30660
30670
30680
30690
30700
30710
30720
30730
30740
30750
30760
30770
30780
30790
30800
30810
30820
30830
30840
30850
30860
30870
30880
30890
30900
30910
30920
30930
30940
30950
30960
30970
30980
30990
31000
31010
31020
31030
31040
31050
31060
31070
31080
31090
31100
31110
31120
31130
31140
31150
31160
31170
31180
31190
31200
31210
31220
31230
31240
31251
31260
31270
31280
31290
31300
31310
31320
31330
31340
31350
31360
31370
31380
31390
31400
31410
31420
31430
31440
31450
31460
31470
31480
31490
31500
31510
31520
31530
31540
31550
31560
31570
31580
31590
31600
31610
31620
31630
31640
31650
31660
31670
31680
31690
31700
31710
31720
31730
31740
31750
31760
31770
31780
31790
31800
31810
31820
31830
31840
31850
31860
31870
31880
31890
31900
31910
31920
31930
31940
31950
31960
31970
31980
31990
32000
32010
32020
32030
32040
32050
32060
32070
32080
32090
32100
32110
32120
32130
32140
32150
32160
32170
32180
32190
32200
32210
32220
32230
32240
32250
32260
32270
32280
32290
32300
32310
32320
32330
32340
32350
32360
32370
32380
32390
32400
32410
32420
32430
32440
32450
32460
32470
32480
32490
32500
32510
32520
32530
32540
32550
32560
32570
32580
32590
32600
32610
32620
32630
32640
32650
32660
32670
32680
32690
32700
32710
32720
32730
32740
32750
32760
32770
32780
32790
32800
32810
32820
32830
32840
32850
32860
32870
32880
32890
32900
32910
32920
32930
32940
32950
32960
32970
32980
32990
33000
33010
33020
33030
33040
33050
33060
33070
33080
33090
33100
33110
33120
33130
33140
33150
33160
33170
33180
33190
33200
33210
33220
33230
33240
33250
33260
33270
33280
33290
33300
33310
33320
33330
33340
33350
33360
33370
33380
33390
33400
33410
33420
33430
33440
33450
33460
33470
33480
33490
33500
33510
33520
33530
33540
33550
33560
33570
33580
33590
33600
33610
33620
33630
33640
33650
33660
33670
33680
33690
33700
33710
33720
33730
33740
33750
33760
33770
33780
33790
33800
33810
33820
33830
33840
33850
33860
33870
33880
33890
33900
33910
33920
33930
33940
33950
33960
33970
33980
33990
34000
34010
34020
34030
34040
34050
34060
34070
34080
34090
34100
34110
34120
34130
34140
34150
34160
34170
34180
34190
34200
34210
34220
34230
34240
34250
34260
34270
34280
34290
34300
34310
34320
34330
34340
34350
34360
34370
34380
34390
34400
34410
34420
34430
34440
34450
34460
34470
34480
34490
34500
34510
34520
34530
34540
34550
34560
34570
34581
34591
34600
34610
34620
34630
34640
34650
34660
34670
34680
34690
34700
34710
34720
34730
34740
34750
34760
34770
34780
34790
34800
34810
34820
34830
34840
34850
34860
34870
34880
34890
34900
34910
34921
34930
34940
34950
34960
34970
34981
34990
35000
35010
35020
35031
35041
35051
35060
35070
35080
35090
35100
35110
3512130
3513130
3514130
35150
3516130
35170
3518130
3519130
35200
3521130
35220
35230
35240
3525130
3526130
35270
35280
35290
35300
35310
35320
35330
35340
35350
35360
3537130
35380
3539130
35400
35410
35420
35430
35440
35450
3546130
3547130
35480
3549130
35500
35519
35520
35538
35548
35558
35560
35570
35589
35599
35600
35610
3562130
3563130
3564130
3565130
35660
3567130
35680
35690
35700
35710
35720
35730
35740
35750
35760
35770
35780
35790
35800
35810
35820
35830
35840
35850
35860
35870
35880
35890
35900
35910
35920
35930
35940
35950
35960
35970
35980
35990
36000
36010
36020
360399486
36040
360531282
36060
36070
360868204
36090
36102032
36110
36120
3613132344
36140
361516
36160
36170
3618132220
36190
3620200
36210
36220
362365956
36240
36250
36260
36270
36280
36290
36300
36310
36320
36330
363412344
36350
36362887
36370
36382933
36390
36400
3641947
36420
36430
364411397
36450
36468
36478
36480
364940
365032
36510
3652120
36530
365432
365532
36560
36570
36580
36590
36600
366148
366240
36630
366472
366532
36660
36670
36688
36690
36700
367111389
36720
36730
36740
36750
3676796
36770
3678148
36790
36800
36810
36820
368387008
36840
368543504
36860
368712184
36880
36890
369031320
36910
369230173
36930
36940
36952202
36960
36971055
36980
36990
370092
37010
37020
37030
37040
370568
37060
370799554
370899486
370955914
37100
371168
371268
37130
3714130716
37150
371687008
37170
371831228
37190
37200
37210
372212276
372312276
37240
37250
37260
372768
37280
372968
37300
37310
373268
37330
37340
37350
37360
37370
37380
37390
37400
37410
37420
37430
37440
37450
37460
37470
37480
374919
37500
37510
37520
37530
37540
37550
37560
37570
37580
37590
37600
37610
37620
37630
37640
37650
37660
37670
37680
37690
37700
37710
37720
37730
37740
37750
37760
37770
37780
37790
37800
37810
37820
37830
37840
37850
37860
37870
37880
37890
37900
37910
37920
37930
37940
37950
37960
37970
37980
37990
38000
38010
38020
38030
38040
38050
38060
38070
38080
38090
38100
38110
38120
38130
38140
38150
38160
38170
38180
38190
38200
38210
38220
38230
38240
38250
38260
38270
38280
38290
38300
38310
38320
38330
38340
38350
38360
38370
38380
38390
38400
38410
38420
38430
38440
38450
38460
38470
38480
38490
38500
38510
38520
38530
38540
38550
38560
38570
3858130
3859130
38600
386156
38620
38630
38640
386556
38660
38670
38680
3869130
38700
3871204
38720
38730
38740
387574
38760
387774
387874
38790
38800
38810
38820
38830
38840
38850
3886130
38870
38880
38890
38900
3891204
3892204
38930
3894408
38950
38960
38970
38980
38990
39000
39010
39020
39030
39040
39050
3906130
39070
3908130
3909130
39100
39110
39120
3913130
39140
39150
39160
39170
39180
39190
3920130
39210
39220
39230
39240
3925130
39260
392756
39280
39290
39300
39310
39320
39330
39340
3935130
39360
39370
39380
39390
39400
394168
39420
3943130
39440
3945130
3946130
39470
39480
3949130
39500
3951130
39520
39530
39540
39550
39560
39570
395868
39590
39600
39610
3962347
39630
39640
39650
39660
39670
396858
39690
397058
39710
39720
39730
39740
39750
39760
39770
39780
39790
39800
39810
39820
39830
39840
39850
39860
39870
39880
39890
39900
39910
39920
39930
39940
39950
39960
39970
39980
39990
40000
40010
40020
40030
40040
40050
40060
40070
40080
40090
40100
40110
40120
40130
40140
40150
40160
40170
40180
40190
40200
40210
40220
40230
40240
40250
40260
40270
40280
40290
40300
40310
40320
40330
40340
40350
40360
40370
40380
40390
40400
40410
40420
40430
40440
40450
40460
40470
40480
40490
40500
40510
40520
40530
40540
40550
40560
40570
40580
40590
40600
40610
40620
40630
40640
40650
40660
40670
40680
40690
40700
40710
40720
40730
40740
40750
40760
40770
40780
40790
40800
40810
40820
40830
40840
40850
40860
40870
40880
40890
40900
40910
40920
40930
40940
40950
40960
40970
40980
40990
41000
41010
41020
41030
41040
41050
41060
41070
41080
41090
41100
41110
41120
41130
41140
41150
41160
41170
41180
41190
41200
41210
41220
41230
41240
41250
41260
41270
41280
41290
41300
41310
41320
41330
41340
41350
41360
41370
41380
41390
41400
41410
41420
41430
41440
41450
41460
41470
41480
41490
41500
41510
41520
41530
41540
41550
41560
41570
41580
41590
41600
41610
41620
41630
41640
41650
41660
41670
41680
41690
41700
41710
41720
41730
41740
41750
41760
41770
41780
41790
41800
41810
41820
41830
41840
41850
41860
41870
41880
41890
41900
41910
41920
41930
41940
41950
41960
41970
41980
41990
42000
42010
42020
42030
42040
42050
42060
42070
42080
42090
42100
42110
42120
42130
42140
42150
42160
42170
42180
42190
42200
42210
42220
42230
42240
42250
42260
42270
42280
42290
42300
42310
42320
42330
42340
42350
42360
42370
42380
42390
42400
42410
42420
42430
42440
42450
42460
42470
42480
42490
42500
42510
42520
42530
42540
42550
42560
42570
42580
42590
42600
42610
42620
42630
42640
42650
42660
42670
42680
42690
42700
42710
42720
42730
42740
42750
42760
42770
42780
42790
42800
42810
42820
42830
42840
42850
42860
42870
42880
42890
42900
42910
42920
42930
42940
42950
42960
42970
42980
42990
43000
43010
43020
43030
43040
43050
43060
43070
43080
43090
43100
43110
43120
43130
43140
43150
43160
43170
43180
43190
43200
43210
43220
43230
43240
43250
43260
43270
43280
43290
43300
43310
43320
43330
43340
43350
43360
43370
43380
43390
43400
43410
43420
43430
43440
43450
43460
43470
43480
43490
43500
43510
43520
43530
43540
43550
43560
43570
43580
43590
43600
43610
43620
43630
43640
43650
43660
43670
43680
43690
43700
43710
43720
43730
43740
43750
43760
43770
43780
43790
43800
43810
43820
43830
43840
43850
43860
43870
43880
43890
43900
43910
43920
43930
43940
43950
43960
43970
43980
43990
44000
44010
44020
44030
44040
44050
44060
44070
44080
44090
44100
44110
44120
44130
44140
44150
44160
44170
44180
44190
44200
44210
44220
44230
44240
44250
44260
44270
44280
44290
44300
44310
44320
44330
44340
44350
44360
44370
44380
44390
44400
44410
44420
44430
44440
44450
44460
44470
44480
44490
44500
44510
44520
44530
44540
44550
44560
44570
44580
44590
44600
44610
44620
44630
44640
44650
44660
44670
44680
44690
44700
44710
44720
44730
44740
44750
44760
44770
44780
44790
44800
44810
44820
44830
44840
44850
44860
44870
44880
44890
44900
44910
44920
44930
44940
44950
44960
44970
44980
44990
45000
45010
45020
45030
45040
45050
45060
45070
45080
45090
45100
45110
45120
45130
45140
45150
45160
45170
45180
45190
45200
45210
45220
45230
45240
45250
45260
45270
45280
45290
45300
45310
45320
45330
45340
45350
45360
45370
45380
45390
45400
45410
45420
45430
45440
45450
45460
45470
45480
45490
45500
45510
45520
45530
45540
45550
45560
45570
45580
45590
45600
45610
45620
45630
45640
45650
45660
45670
45680
45690
45700
45710
45720
45730
45740
45750
45760
45770
45780
45790
45800
45810
45820
45830
45840
45850
45860
45870
45880
45890
45900
45910
45920
45930
45940
45950
45960
45970
45980
45990
46000
46010
46020
46030
46040
46050
46060
46070
46080
46090
46100
46110
46120
46130
46140
46150
46160
46170
46180
46190
46200
46210
46220
46230
46240
46250
46260
46270
46280
46290
46300
46310
46320
46330
46340
46350
46360
46370
46380
46390
46400
46410
46420
46430
46440
46450
46460
46470
46480
46490
46500
46510
46520
46530
46540
46550
46560
46570
46580
46590
46600
46610
46620
46630
46640
46650
46660
46670
46680
46690
46700
46710
46720
46730
46740
46750
46760
46770
46780
46790
46800
46810
46820
46830
46840
46850
46860
46870
46880
46890
46900
46910
46920
46930
46940
46950
46960
46970
46980
46990
47000
47010
47020
47030
47040
47050
47060
47070
47080
47090
47100
47110
47120
47130
47140
47150
47160
47170
47180
47190
47200
47210
47220
47230
47240
47250
47260
47270
47280
47290
47300
47310
47320
47330
47340
47350
47360
47370
47380
47390
47400
47410
47420
47430
47440
47450
47460
47470
47480
47490
47500
47510
47520
47530
47540
47550
47560
47570
47580
47590
47600
47610
47620
47630
47640
47650
47660
47670
47680
47690
47700
47710
47720
47730
47740
47750
47760
47770
47780
47790
47800
47810
47820
47830
47840
47850
47860
47870
47880
47890
47900
47910
47920
47930
47940
47950
47960
47970
47980
47990
48000
48010
48020
48030
48040
48050
48060
48070
48080
48090
48100
48110
48120
48130
48140
48150
48160
48170
48180
48190
48200
48210
48220
48230
48240
48250
48260
48270
48280
48290
48300
48310
48320
48330
48340
48350
48360
48370
48380
48390
48400
48410
48420
48430
48440
48450
48460
48470
48480
48490
48500
48510
48520
48530
48540
48550
48560
48570
48580
48590
48600
48610
48620
48630
48640
48650
48660
48670
48680
48690
48700
48710
48720
48730
48740
48750
48760
48770
48780
48790
48800
48810
48820
48830
48840
48850
48860
48870
48880
48890
48900
48910
48920
48930
48940
48950
48960
48970
48980
48990
49000
49010
49020
49030
49040
49050
49060
49070
49080
49090
49100
49110
49120
49130
49140
49150
49160
49170
49180
49190
49200
49210
49220
49230
49240
49250
49260
49270
49280
49290
49300
49310
49320
49330
49340
49350
49360
49370
49380
49390
49400
49410
49420
49430
49440
49450
49460
49470
49480
49490
49500
49510
49520
49530
49540
49550
49560
49570
49580
49590
49600
49610
49620
49630
49640
49650
49660
49670
49680
49690
49700
49710
49720
49730
49740
49750
49760
49770
49780
49790
49800
49810
49820
49830
49840
49850
49860
49870
49880
49890
49900
49910
49920
49930
49940
49950
49960
49970
49980
49990
50000
50010
50020
50030
50040
50050
50060
50070
50080
50090
50100
50110
50120
50130
50140
50150
50160
50170
50180
50190
50200
50210
50220
50230
50240
50250
50260
50270
50280
50290
50300
50310
50320
50330
50340
50350
50360
50370
50380
50390
50400
50410
50420
50430
50440
50450
50460
50470
50480
50490
50500
50510
50520
50530
50540
50550
50560
50570
50580
50590
50600
50610
50620
50630
50640
50650
50660
50670
50680
50690
50700
50710
50720
50730
50740
50750
50760
50770
50780
50790
50800
50810
50820
50830
50840
50850
50860
50870
50880
50890
50900
50910
50920
50930
50940
50950
50960
50970
50980
50990
51000
51010
51020
51030
51040
51050
51060
51070
51080
51090
51100
51110
51120
51130
51140
51150
51160
51170
51180
51190
51200
51210
51220
51230
51240
51250
51260
51270
51280
51290
51300
51310
51320
51330
51340
51350
51360
51370
51380
51390
51400
51410
51420
51430
51440
51450
51460
51470
51480
51490
51500
51510
51520
51530
51540
51550
51560
51570
51580
51590
51600
51610
51620
51630
51640
51650
51660
51670
51680
51690
51700
51710
51720
51730
51740
51750
51760
51770
51780
51790
51800
51810
51820
51830
51840
51850
51860
51870
51880
51890
51900
51910
51920
51930
51940
51950
51960
51970
51980
51990
52000
52010
52020
52030
52040
52050
52060
52070
52080
52090
52100
52110
52120
52130
52140
52150
52160
52170
52180
52190
52200
52210
52220
52230
52240
52250
52260
52270
52280
52290
52300
52310
52320
52330
52340
52350
52360
52370
52380
52390
52400
52410
52420
52430
52440
52450
52460
52470
52480
52490
52500
52510
52520
52530
52540
52550
52560
52570
52580
52590
52600
52610
52620
52630
52640
52650
52660
52670
52680
52690
52700
52710
52720
52730
52740
52750
52760
52770
52780
52790
52800
52810
52820
52830
52840
52850
52860
52870
52880
52890
52900
52910
52920
52930
52940
52950
52960
52970
52980
52990
53000
53010
53020
53030
53040
53050
53060
53070
53080
53090
53100
53110
53120
53130
53140
53150
53160
53170
53180
53190
53200
53210
53220
53230
53240
53250
53260
53270
53280
53290
53300
53310
53320
53330
53340
53350
53360
53370
53380
53390
53400
53410
53420
53430
53440
53450
53460
53470
53480
53490
53500
53510
53520
53530
53540
53550
53560
53570
53580
53590
53600
53610
53620
53630
53640
53650
53660
53670
53680
53690
53700
53710
53720
53730
53740
53750
53760
53770
53780
53790
53800
53810
53820
53830
53840
53850
53860
53870
53880
53890
53900
53910
53920
53930
53940
53950
53960
53970
53980
53990
54000
54010
54020
54030
54040
54050
54060
54070
54080
54090
54100
54110
54120
54130
54140
54150
54160
54170
54180
54190
54200
54210
54220
54230
54240
54250
54260
54270
54280
54290
54300
54310
54320
54330
54340
54350
54360
54370
54380
54390
54400
54410
54420
54430
54440
54450
54460
54470
54480
54490
54500
54510
54520
54530
54540
54550
54560
54570
54580
54590
54600
54610
54620
54630
54640
54650
54660
54670
54680
54690
54700
54710
54720
54730
54740
54750
54760
54770
54780
54790
54800
54810
54820
54830
54840
54850
54860
54870
54880
54890
54900
54910
54920
54930
54940
54950
54960
54970
54980
54990
55000
55010
55020
55030
55040
55050
55060
55070
55080
55090
55100
55110
55120
55130
55140
55150
55160
55170
55180
55190
55200
55210
55220
55230
55240
55250
55260
55270
55280
55290
55301
55310
55320
55330
55340
55351
55360
55371
55380
55390
55400
55410
55420
55430
55440
55450
55460
55470
55480
55490
55500
55510
55520
55530
55540
55550
55560
55570
55580
55590
55600
55610
55620
55630
55640
55650
55660
55670
55680
55690
55700
55710
55720
55730
55740
55750
55760
55770
55780
55790
55800
55810
55820
55830
55840
55850
55860
55870
55880
55890
55900
55910
55920
55930
55940
55950
55960
55970
55980
55990
56000
56010
56020
56030
56040
56050
56060
56070
56080
56090
56100
56110
56120
56130
56140
56150
56160
56170
56180
56190
56200
56210
56220
56230
56240
56250
56260
56270
56280
56290
56300
56310
56320
56330
56340
56350
56360
56370
56380
56390
56400
56410
56420
56430
56440
56450
56460
56470
56480
56490
56500
56510
56520
56530
56540
56550
56560
56570
56580
56590
56600
56610
56620
56630
56640
56650
56660
56670
56680
56690
56700
56710
56720
56730
56740
56750
56760
56770
56780
56790
56800
56810
56820
56830
56840
56850
56860
56870
56880
56890
56900
56910
56920
56930
56940
56950
56960
56970
56980
56990
57000
57010
57020
57030
57040
57050
57060
57070
57080
57090
57100
57110
57120
57130
57140
57150
57160
57170
57180
57190
57200
57210
57220
57230
57240
57250
57260
57270
57280
57290
57300
57310
57320
57330
57340
57350
57360
57370
57380
57390
57400
57410
57420
57430
57440
57450
57460
57470
57480
57490
57500
57510
57520
57530
57540
57550
57560
57570
57580
57590
57600
57610
57620
57630
57640
57650
57660
57670
57680
57690
57700
57710
57720
57730
57740
57750
57760
57770
57780
57790
57800
57810
57820
57830
57840
57850
57860
57870
57880
57890
57900
57910
57920
57930
57940
57950
57960
57970
57980
57990
58000
58010
58020
58030
58040
58050
58060
58070
58080
58090
58100
58110
58120
58130
58140
58150
58160
58170
58180
58190
58200
58210
58220
58230
58240
58250
58260
58270
58280
58290
58300
58310
58320
58330
58340
58350
58360
58370
58380
58390
58400
58410
58420
58430
58440
58450
58460
58470
58480
58490
58500
58510
58520
58530
58540
58550
58560
58570
58580
58590
58600
58610
58620
58630
58640
58650
58660
58670
58680
58690
58700
58710
58720
58730
58740
58750
58760
58770
58780
58790
58800
58810
58820
58830
58840
58850
58860
58870
58880
58890
58900
58910
58920
58930
58940
58950
58960
58970
58980
58990
59000
59010
59020
59030
59040
59050
59060
59070
59080
59090
59100
59110
59120
59130
59140
59150
59160
59170
59180
59190
59200
59210
59220
59230
59240
59250
59260
59270
59280
59290
59300
59310
59320
59330
59340
59350
59360
59370
59380
59390
59400
59410
59420
59430
59440
59450
59460
59470
59480
59490
59500
59510
59520
59530
59540
59550
59560
59570
59580
59590
59600
59610
59620
59630
59640
59650
59660
59670
59680
59690
59700
59710
59720
59730
59740
59750
59760
59770
59780
59790
59800
59810
59820
59830
59840
59850
59860
59870
59880
59890
59900
59910
59920
59930
59940
59950
59960
59970
59980
59990
60000
60010
60020
60030
60040
60050
60060
60070
60080
60090
60100
60110
60120
60130
60140
60150
60160
60170
60180
60190
60200
60210
60220
60230
60240
60250
60260
60270
60280
60290
60300
60310
60320
60330
60340
60350
60360
60370
60380
60390
60400
60410
60420
60430
60440
60450
60460
60470
60480
60490
60500
60510
60520
60530
60540
60550
60560
60570
60580
60590
60600
60610
60620
60630
60640
60650
60660
60670
60680
60690
60700
60710
60720
60730
60740
60750
60760
60770
60780
60790
60800
60810
60820
60830
60840
60850
60860
60870
60880
60890
60900
60910
60920
60930
60940
60950
60960
60970
60980
60990
61000
61010
61020
61030
61040
61050
61060
61070
61080
61090
61100
61110
61120
61130
61140
61150
61160
61170
61180
61190
61200
61210
61220
61230
61240
61250
61260
61270
61280
61290
61300
61310
61320
61330
61340
61350
61360
61370
61380
61390
61400
61410
61420
61430
61440
61450
61460
61470
61480
61490
61500
61510
61520
61530
61540
61550
61560
61570
61580
61590
61600
61610
61620
61630
61640
61650
61660
61670
61680
61690
61700
61710
61720
61730
61740
61750
61760
61770
61780
61790
61800
61810
61820
61830
61840
61850
61860
61870
61880
61890
61900
61910
61920
61930
61940
61950
61960
61970
61980
61990
62000
62010
62020
62030
62040
62050
62060
62070
62080
62090
62100
62110
62120
62130
62140
62150
62160
62170
62180
62190
62200
62210
62220
62230
62240
62250
62260
62270
62280
62290
62300
62310
62320
62330
62340
62350
62360
62370
62380
62390
62400
62410
62420
62430
62440
62450
62460
62470
62480
62490
62500
62510
62520
62530
62540
62550
62560
62570
62580
62590
62600
62610
62620
62630
62640
62650
62660
62670
62680
62690
62700
62710
62720
62730
62740
62750
62760
62770
62780
62790
62800
62810
62820
62830
62840
62850
62860
62870
62880
62890
62900
62910
62920
62930
62940
62950
62960
62970
62980
62990
63000
63010
63020
63030
63040
63050
63060
63070
63080
63090
63100
63110
63120
63130
63140
63150
63160
63170
63180
63190
63200
63210
63220
63230
63240
63250
63260
63270
63280
63290
63300
63310
63320
63330
63340
63350
63360
63370
63380
63390
63400
63410
63420
63430
63440
63450
63460
63470
63480
63490
63500
63510
63520
63530
63540
63550
63560
63570
63580
63590
63600
63610
63620
63630
63640
63650
63660
63670
63680
63690
63700
63710
63720
63730
63740
63750
63760
63770
63780
63790
63800
63810
63820
63830
63840
63850
63860
63870
63880
63890
63900
63910
63920
63930
63940
63950
63960
63970
63980
63990
64000
64010
64020
64030
64040
64050
64060
64070
64080
64090
64100
64110
64120
64130
64140
64150
64160
64170
64180
64190
64200
64210
64220
64230
64240
64250
64260
64270
64280
64290
64300
64310
64320
64330
64340
64350
64360
64370
64380
64390
64400
64410
64420
64430
64440
64450
64460
64470
64480
64490
64500
64510
64520
64530
64540
64550
64560
64570
64580
64590
64600
64610
64620
64630
64640
64650
64660
64670
64680
64690
64700
64710
64720
64730
64741
647512
64763
64770
64780
64791
64800
64810
64820
64830
64840
64850
64860
64870
64880
64890
64900
64910
64920
64930
64940
64950
64960
64970
64981
64991
65000
65011
65020
65031
650433
650515
65060
650718
650818
650918
651017
65110
6512204
651350
65140
651518
65160
65170
65181
6519143
652015
652115
65220
6523128
652410
6525118
6526118
6527100
6528118
65290
6530118
653118
65320
65330
65341
6535432
6536143
65370
65380
65390
65400
65410
65420
65430
65440
65450
65460
65470
65481
65491
65500
65511
65521
65531
65540
65550
65560
65570
65580
65590
65600
65610
65620
65630
65640
65650
65660
65670
65680
65690
65700
65710
65720
65730
65741
65751
65761
65770
65780
65791
65801
65810
65823
65830
65840
65850
65860
65870
65880
65890
65900
65910
65920
65930
65940
65950
65960
65970
65980
65990
66000
66010
66020
66030
66040
66050
66060
66070
66080
66090
66100
66110
66120
66130
66140
66150
66160
66170
66180
66190
66200
66210
66220
66230
66240
66250
66260
66270
66280
66290
66300
66310
66320
66330
66340
66350
66360
66370
66380
66390
66400
66410
66420
66430
66440
66450
66460
66470
66480
66490
66500
66510
66520
66530
66540
66550
66560
66570
66580
66590
66600
66610
66620
66630
66640
66650
66660
66670
66680
66690
66700
66710
66720
66730
66740
66750
66760
66770
66780
66790
66800
66810
66820
66830
66840
66850
66860
66870
66880
66890
66900
66910
66920
66930
66940
66950
66960
66970
66980
66990
67000
67010
67020
67030
67040
67050
67060
67070
67080
67090
67100
67110
67120
67130
67140
67150
67160
67170
67180
67190
67200
67210
67220
67230
67240
67250
67260
67270
67280
67290
67300
67310
67320
67330
67340
67350
67360
67370
67380
67390
67400
67410
67420
67430
67440
67450
67460
67470
67480
67490
67500
67510
67520
67530
67540
67550
67560
67570
67581
67591
67601
67611
67621
67630
67641
67650
67661
67670
67680
67690
67700
67711
67720
67730
67740
67750
67760
67771
67780
67790
67800
67810
67820
67830
67840
67850
67860
67870
67880
67890
67900
67910
67920
67930
67940
67950
67960
67970
67980
67990
68000
68010
68020
68030
68040
68050
68060
68070
68080
68090
68100
68110
68120
68130
68140
68150
68160
68170
68180
68190
68200
68210
68220
68230
68240
68250
68260
68270
68280
68290
68300
68310
68320
68330
68340
68350
68360
68370
68380
68390
68400
68410
68420
68430
68440
68450
68460
68470
68480
68490
68500
68510
68520
68530
68540
68550
68560
68570
68580
68590
68600
68610
68620
68630
68640
68650
68660
68670
68680
68690
68700
68710
68720
68730
68740
68750
68760
68770
68780
68790
68800
68810
68820
68830
68840
68850
68860
68870
68880
68890
68900
68910
68920
68930
68940
68950
68960
68970
68980
68990
69000
69010
69020
69030
69040
69050
69060
69070
69080
69090
69100
69110
69120
69130
69140
69150
69160
69170
69180
69190
69200
69210
6922732
69230
69240
69250
69260
69270
69280
69290
69300
69310
69320
69330
69340
69350
69360
69370
69380
69390
69400
69410
69420
69430
69440
69450
69460
69470
69480
69490
69500
69510
69520
69530
69540
69550
69560
69570
69580
6959732
6960732
69610
6962732
69630
6964732
6965732
69660
69670
69680
69692196
6970732
69711464
69720
69730
6974732
69750
69760
69770
69780
69790
6980732
6981732
6982732
69830
69840
69850
69860
69870
69880
69890
69900
69910
69920
69930
69940
69950
69960
69970
69980
69990
70000
70010
70020
70030
70040
70050
70060
70070
7008732
70090
7010732
7011732
7012732
7013732
70140
70150
70160
70170
70180
70190
70200
70210
70220
70230
70240
70251
70260
70270
70280
70290
70300
70310
70320
70330
70340
70350
70360
70370
70380
70390
70400
70410
70420
70430
70440
70450
70460
70470
70480
70490
70500
70510
70520
70530
70540
70550
70560
70570
70580
70590
70600
70610
70620
70630
70640
70650
70660
70670
70680
70690
70700
70710
70720
70730
70740
70750
70760
70770
70780
70790
70800
70810
70820
70830
70840
70850
70860
70870
70880
70890
70900
70910
70920
70930
70940
70950
70960
70970
70980
70990
71000
71010
71020
71030
71040
71050
71060
71070
71080
71090
71100
71110
71120
71130
71140
71150
71160
71170
71180
71190
71200
71210
71220
71231464
71240
71250
71260
71271464
71280
71290
71301464
71310
71322928
71331464
71341464
71350
71361464
71370
71380
71390
71400
71410
71420
71430
71440
71450
71460
71470
71480
71490
71500
71510
71520
71530
71540
71550
71560
71570
71580
71590
71600
71610
71620
71630
71640
71650
716614004
716714004
716814004
716914004
71700
71710
71720
71730
71740
717514004
717614004
717714004
71780
71790
71800
71810
71820
71830
71840
71857002
71867002
71877002
71880
71890
71900
71910
71927002
71937002
71947002
71950
71960
71970
71980
71990
72000
72010
72020
72030
72040
72050
72060
72070
72080
72090
72100
72110
72120
7213732
7214732
7215732
72160
72170
7218732
72190
72200
72210
72220
72230
72240
72250
72260
72270
72280
72290
72300
72310
72320
723323202
72347002
7235158
7236158
7237158
7238158
72390
72400
72410
72420
72430
72440
72450
72466844
72476844
72486452
72490
72500
725114004
72526452
72536452
72540
72550
72567002
72570
72580
72590
72600
72610
7262732
72630
72640
72650
72660
72670
72680
72690
72700
72710
72720
72730
72740
72752196
72760
72770
72780
72790
72800
72810
72820
72830
72840
72850
72860
72870
72880
72890
72900
72910
72920
72930
72940
72950
72960
72970
72980
72990
73000
73010
73020
73030
73040
73050
73060
73070
73080
73090
73100
73110
73120
73130
73140
73150
73160
73170
73180
73190
73200
73210
73220
73230
73240
73250
73260
73270
73280
73290
73300
73310
73320
73330
73340
73350
73360
73370
73380
73390
73400
73410
73420
73430
73440
73450
73460
73470
73480
73490
73500
73510
73520
73530
73540
73550
73560
73570
73580
73590
73600
73610
73620
73630
73640
73650
73660
73670
73680
73690
73700
73710
73720
73730
73740
73750
73760
73770
73780
73790
73800
73810
73820
73830
73840
73850
73860
73870
73880
73890
73900
73910
73920
73930
73940
73950
73960
73970
73980
73990
74000
74010
74020
74030
74040
74050
74060
74070
74080
74090
74100
74110
74120
74130
74140
74150
74160
74170
74180
74190
74200
74210
74220
74230
74240
74250
74260
74270
74280
74290
74300
74310
74320
74330
74340
74350
74360
74370
74380
74390
74400
74410
74420
74430
74440
74450
74460
74470
74480
74490
74500
74510
74520
74530
74540
74550
74560
74570
74580
74590
74600
74610
74620
74630
74640
74650
74660
74670
74680
74690
74700
74710
74720
74730
74740
74750
74760
74770
74780
74790
74800
74810
74820
74830
74840
74850
74860
74870
74880
74890
74900
74910
74920
74930
74940
74950
74960
74970
74980
74990
75000
75010
75020
75030
75040
75050
75060
75070
75080
75090
75100
75110
75120
75130
75140
75150
75160
75170
75180
75190
75200
75210
75220
75230
75240
75250
75260
75270
75280
75290
75300
75310
75320
75330
75340
75350
75360
75370
75380
75390
75400
75410
75420
75430
75440
75450
75460
75470
75480
75490
75500
75510
75520
75530
75540
75550
75560
75570
75580
75590
75600
75610
75620
75630
75640
75650
75660
75670
75680
75690
75700
75710
75720
75730
75740
75750
75760
75770
75780
75790
75800
75810
75820
75830
75840
75850
75860
75870
75880
75890
75900
75910
75920
75930
75940
75950
75960
75970
75980
75990
76000
76010
76020
76030
76040
76050
76060
76070
76080
76090
76100
76110
76120
76130
76140
76150
76160
76170
76180
76190
76200
76210
76220
76230
76240
76250
76260
76270
76280
76290
76300
76310
76320
76330
76340
76350
76360
76370
76380
76390
76400
76410
76420
76430
76440
76450
76460
76470
76480
76490
76500
76510
76520
76530
76540
76550
76560
76570
76580
76590
76600
76610
76620
76630
76640
76650
76660
76670
76680
76690
76700
76710
76720
76730
76740
76750
76760
76770
76780
76790
76800
76810
76820
76830
76840
76850
76860
76870
76880
76890
76900
76910
76920
76930
76940
76950
76960
76970
76980
76990
77000
77010
77020
77030
77040
77050
77060
77070
77080
77090
77100
77110
77120
77130
77140
77150
77160
77170
77180
77190
77200
77210
77220
77230
77240
77250
77260
77270
77280
77290
77300
77310
77320
77330
77340
77350
77360
77370
77380
77390
77400
77410
77420
77430
77440
77450
77460
77470
77480
77490
77500
77510
77520
77530
77540
77550
77560
77570
77580
77590
77600
77610
77620
77630
77640
77650
77660
77670
77680
77690
77700
77710
77720
77730
77740
77750
77760
77770
77780
77790
77800
77810
77820
77830
77840
77850
77860
77870
77880
77890
77900
77910
77920
77930
77940
77950
77960
77970
77980
77990
78000
78010
78020
78030
78040
78050
78060
78070
78080
78090
78100
78110
78120
78130
78140
78150
78160
78170
78180
78190
78200
78210
78220
78230
78240
78250
78260
78270
78280
78290
78300
78310
78320
78330
78340
78350
78360
78370
78380
78390
78400
78410
78420
78430
78440
78450
78460
78470
78480
78490
78500
78510
78520
78530
78540
78550
78560
78570
78580
78590
78600
78610
78620
78630
78640
78650
78660
78670
78680
78690
78700
78710
78720
78730
78740
78750
78760
78770
78780
78790
78800
78810
78820
78830
78840
78850
78860
78870
78880
78890
78900
78910
78920
78930
78940
78950
78960
78970
78980
78990
79000
79010
79020
79030
79040
79050
79060
79070
79080
79090
79100
79110
79120
79130
79140
79150
79160
79170
79180
79190
79200
79210
79220
79230
79240
79250
79260
79270
79280
79290
79300
79310
79320
79330
79340
79350
79360
79370
79380
79390
79400
79410
79420
79430
79440
79450
79460
79470
79480
79490
79500
79510
79520
79530
79540
79550
79560
79570
79580
79590
79600
79610
79620
79630
79640
79650
79660
79670
79680
79690
79700
79710
79720
79730
79740
79750
79760
79770
79780
79790
79800
79810
79820
79830
79840
79850
79860
79870
79880
79890
79900
79910
79920
79930
79940
79950
79960
79970
79980
79990
80000
80010
80020
80030
80040
80050
80060
80070
80080
80090
80100
80110
80120
80130
80140
80150
80160
80170
80180
80190
80200
80210
80220
80230
80240
80250
80260
80270
80280
80290
80300
80310
80320
80330
80340
80350
80360
80370
80380
80390
80400
80410
80420
80430
80440
80450
80460
80470
80480
80490
80500
80510
80520
80530
80540
80550
80560
80570
80580
80590
80600
80610
80620
80630
80640
80650
80660
80670
80680
80690
80700
80710
80720
80730
80740
80750
80760
80770
80780
80790
80800
80810
80820
80830
80840
80850
80860
80870
80880
80890
80900
80910
80920
80930
80940
80950
80960
80970
80980
80990
81000
81010
81020
81030
81040
81050
81060
81070
81080
81090
81100
81110
81120
81130
81140
81150
81160
81170
81180
81190
81200
81210
81220
81230
81240
81250
81260
81270
81280
81290
81300
81310
81320
81330
81340
81350
81360
81370
81380
81390
81400
81410
81420
81430
81440
81450
81460
81470
81480
81490
81500
81510
81520
81530
81540
81550
81560
81570
81580
81590
81600
81610
81620
81630
81640
81650
81660
81670
81680
81690
81700
81710
81720
81730
81740
81750
81760
81770
81780
81790
81800
81810
81820
81830
81840
81850
81860
81870
81880
81890
81900
81910
81920
81930
81940
81950
81960
81970
81980
81990
82000
82010
82020
82030
82040
82050
82060
82070
82080
82090
82100
82110
82120
82130
82140
82150
82160
82170
82180
82190
82200
82210
82220
82230
82240
82250
82260
82270
82280
82290
82300
82310
82320
82330
82340
82350
82360
82370
82380
82390
82400
82410
82420
82430
82440
82450
82460
82470
82480
82490
82500
82510
82520
82530
82540
82550
82560
82570
82580
82590
82600
82610
82620
82630
82640
82650
82660
82670
82680
82690
82700
82710
82720
82730
82740
82750
82760
82770
82780
82790
82800
82810
82820
82830
82840
82850
82860
82870
82880
82890
82900
82910
82920
82930
82940
82950
82960
82970
82980
82990
83000
83010
83020
83030
83040
83050
83060
83070
83080
83090
83100
83110
83120
83130
83140
83150
83160
83170
83180
83190
83200
83210
83220
83230
83240
83250
83260
83270
83280
83290
83300
83310
83320
83330
83340
83350
83360
83370
83380
83390
83400
83410
83420
83430
83440
83450
83460
83470
83480
83490
83500
83510
83520
83530
83540
83550
83560
83570
83580
83590
83600
83610
83620
83630
83640
83650
83660
83670
83680
83690
83700
83710
83720
83730
83740
83750
83760
83770
83780
83790
83800
83810
83820
83830
83840
83850
83860
83870
83880
83890
83900
83910
83920
83930
83940
83950
83960
83970
83980
83990
84000
84010
84020
84030
84040
84050
84060
84070
84080
84090
84100
84110
84120
84130
84140
84150
84160
84170
84180
84190
84200
84210
84220
84230
84240
84250
84260
84270
84280
84290
84300
84310
84320
84330
84340
84350
84360
84370
84380
84390
84400
84410
84420
84430
84440
84450
84460
84470
84480
84490
84500
84510
84520
84530
84540
84550
84560
84570
84580
84590
84600
84610
84620
84630
84640
84650
84660
84670
84680
84690
84700
84710
84720
84730
84740
84750
84760
84770
84780
84790
84800
84810
84820
84830
84840
84850
84860
84870
84880
84890
84900
84910
84920
84930
84940
84950
84960
84970
84980
84990
85000
85010
85020
85030
85040
85050
85060
85070
85080
85090
85100
85110
85120
85130
85140
85150
85160
85170
85180
85190
85200
85210
85220
85230
85240
85250
85260
85270
85280
85290
85300
85310
85320
85330
85340
85350
85360
85370
85380
85390
85400
85410
85420
85430
85440
85450
85460
85470
85480
85490
85500
85510
85520
85530
85540
85550
85560
85570
85580
85590
85600
85610
85620
85630
85640
85650
85660
85670
85680
85690
85700
85710
85720
85730
85740
85750
85760
85770
85780
85790
85800
85810
85820
85830
85840
85850
85860
85870
85880
85890
85900
85910
85920
85930
85940
85950
85960
85970
85980
85990
86000
86010
86020
86030
86040
86050
86060
86070
86080
86090
86100
86110
86120
86130
86140
86150
86160
86170
86180
86190
86200
86210
86220
86230
86240
86250
86260
86270
86280
86290
86300
86310
86320
86330
86340
86350
86360
86370
86380
86390
86400
86410
86420
86430
86440
86450
86460
86470
86480
86490
86500
86510
86520
86530
86540
86550
86560
86570
86580
86590
86600
86610
86620
86630
86640
86650
86660
86670
86680
86690
86700
86710
86720
86730
86740
86750
86760
86770
86780
86790
86800
86810
86820
86830
86840
86850
86860
86870
86880
86890
86900
86910
86920
86930
86940
86950
86960
86970
86980
86990
87000
87010
87020
87030
87040
87050
87060
87070
87080
87090
87100
87110
87120
87130
87140
87150
87160
87170
87180
87190
87200
87210
87220
87230
87240
87250
87260
87270
87280
87290
87300
87310
87320
87330
87340
87350
87360
87370
87380
87390
87400
87410
87420
87430
87440
87450
87460
87470
87480
87490
87500
87510
87520
87530
87540
87550
87560
87570
87580
87590
87600
87610
87620
87630
87640
87650
87660
87670
87680
87690
87700
87710
87720
87730
87740
87750
87760
87770
87780
87790
87800
87810
87820
87830
87840
87850
87860
87870
87880
87890
87900
87910
87920
87930
87940
87950
87960
87970
87980
87990
88000
88010
88020
88030
88040
88050
88060
88070
88080
88090
88100
88110
88120
88130
88140
88150
88160
88170
88180
88190
88200
88210
88220
88230
88240
88250
88260
88270
88280
88290
88300
88310
88320
88330
88340
88350
88360
88370
88380
88390
88400
88410
88420
88430
88440
88450
88460
88470
88480
88490
88500
88510
88520
88530
88540
88550
88560
88570
88580
88590
88600
88610
88620
88630
88640
88650
88660
88670
88680
88690
88700
88710
88720
88730
88740
88750
88760
88770
88780
88790
88800
88810
88820
88830
88840
88850
88860
88870
88880
88890
88900
88910
88920
88930
88940
88950
88960
88970
88980
88990
89000
89010
89020
89030
89040
89050
89060
89070
89080
89090
89100
89110
89120
89130
89140
89150
89160
89170
89180
89190
89200
89210
89220
89230
89240
89250
89260
89270
89280
89290
89300
89310
89320
89330
89340
89350
89360
89370
89380
89390
89400
89410
89420
89430
89440
89450
89460
89470
89480
89490
89500
89510
89520
89530
89540
89550
89560
89570
89580
89590
89600
89610
89620
89630
89640
89650
89660
89670
89680
89690
89700
89710
89720
89730
89740
89750
89760
89770
89780
89790
89800
89810
89820
89830
89840
89850
89860
89870
89880
89890
89900
89910
89920
89930
89940
89950
89960
89970
89980
89990
90000
90010
90020
90030
90040
90050
90060
90070
90080
90090
90100
90110
90120
90130
90140
90150
90160
90170
90180
90190
90200
90210
90220
90230
90240
90250
90260
90270
90280
90290
90300
90310
90320
90330
90340
90350
90360
90370
90380
90390
90400
90410
90420
90430
90440
90450
90460
90470
90480
90490
90500
90510
90520
90530
90540
90550
90560
90570
90580
90590
90600
90610
90620
90630
90640
90650
90660
90670
90680
90690
90700
90710
90720
90730
90740
90750
90760
90770
90780
90790
90800
90810
90820
90830
90840
90850
90860
90870
90880
90890
90900
90910
90920
90930
90940
90950
90960
90970
90980
90990
91000
91010
91020
91030
91040
91050
91060
91070
91080
91090
91100
91110
91120
91130
91140
91150
91160
91170
91180
91190
91200
91210
91220
91230
91240
91250
91260
91270
91280
91290
91300
91310
91320
91330
91340
91350
91360
91370
91380
91390
91400
91410
91420
91430
91440
91450
91460
91470
91480
91490
91500
91510
91520
91530
91540
91550
91560
91570
91580
91590
91600
91610
91620
91630
91640
91650
91660
91670
91680
91690
91700
91710
91720
91730
91740
91750
91760
91770
91780
91790
91800
91810
91820
91830
91840
91850
91860
91870
91880
91890
91900
91910
91920
91930
91940
91950
91960
91970
91980
91990
92000
92010
92020
92030
92040
92050
92060
92070
92080
92090
92100
92110
92120
92130
92140
92150
92160
92170
92180
92190
92200
92210
92220
92230
92240
92250
92260
92270
92280
92290
92300
92310
92320
92330
92340
92350
92360
92370
92380
92390
92400
92410
92420
92430
92440
92450
92460
92470
92480
92490
92500
92510
92520
92530
92540
92550
92560
92570
92580
92590
92600
92610
92620
92630
92640
92650
92660
92670
92680
92690
92700
92710
92720
92730
92740
92750
92760
92770
92780
92790
92800
92810
92820
92830
92840
92850
92860
92870
92880
92890
92900
92910
92920
92930
92940
92950
92960
92970
92980
92990
93000
93010
93020
93030
93040
93050
93060
93070
93080
93090
93100
93110
93120
93130
93140
93150
93160
93170
93180
93190
93200
93210
93220
93230
93240
93250
93260
93270
93280
93290
93300
93310
93320
93330
93340
93350
93360
93370
93380
93390
93400
93410
93420
93430
93440
93450
93460
93470
93480
93490
93500
93510
93520
93530
93540
93550
93560
93570
93580
93590
93600
93610
93620
93630
93640
93650
93660
93670
93680
93690
93700
93710
93720
93730
93740
93750
93760
93770
93780
93790
93800
93810
93820
93830
93840
93850
93860
93870
93880
93890
93900
93910
93920
93930
93940
93950
93960
93970
93980
93990
94000
94010
94020
94030
94040
94050
94060
94070
94080
94090
94100
94110
94120
94130
94140
94150
94160
94170
94180
94190
94200
94210
94220
94230
94240
94250
94260
94270
94280
94290
94300
94310
94320
94330
94340
94350
94360
94370
94380
94390
94400
94410
94420
94430
94440
94450
94460
94470
94480
94490
94500
94510
94520
94530
94540
94550
94560
94570
94580
94590
94600
94610
94620
94630
94640
94650
94660
94670
94680
94690
94700
94710
94720
94730
94740
94750
94760
94770
94780
94790
94800
94810
94820
94830
94840
94850
94860
94870
94880
94890
94900
94910
94920
94930
94940
94950
94960
94970
94980
94990
95000
95010
95020
95030
95040
95050
95060
95070
95080
95090
95100
95110
95120
95130
95140
95150
95160
95170
95180
95190
95200
95210
95220
95230
95240
95250
95260
95270
95280
95290
95300
95310
95320
95330
95340
95350
95360
95370
95380
95390
95400
95410
95420
95430
95440
95450
95460
95470
95480
95490
95500
95510
95520
95530
95540
95550
95560
95570
95580
95590
95600
95610
95620
95630
95640
95650
95660
95670
95680
95690
95700
95710
95720
95730
95740
95750
95760
95770
95780
95790
95800
95810
95820
95830
95840
95850
95860
95870
95880
95890
95900
95910
95920
95930
95940
95950
95960
95970
95980
95990
96000
96010
96020
96030
96040
96050
96060
96070
96080
96090
96100
96110
96120
96130
96140
96150
96160
96170
96180
96190
96200
96210
96220
96230
96240
96250
96260
96270
96280
96290
96300
96310
96320
96330
96340
96350
96360
96370
96380
96390
96400
96410
96420
96430
96440
96450
96460
96470
96480
96490
96500
96510
96520
96530
96540
96550
96560
96570
96580
96590
96600
96610
96620
96630
96640
96650
96660
96670
96680
96690
96700
96710
96720
96730
96740
96750
96760
96770
96780
96790
96800
96810
96820
96830
96840
96850
96860
96870
96880
96890
96900
96910
96920
96930
96940
96950
96960
96970
96980
96990
97000
97010
97020
97030
97040
97050
97060
97070
97080
97090
97100
97110
97120
97130
97140
97150
97160
97170
97180
97190
97200
97210
97220
97230
97240
97250
97260
97270
97280
97290
97300
97310
97320
97330
97340
97350
97360
97370
97380
97390
97400
97410
97420
97430
97440
97450
97460
97470
97480
97490
97500
97510
97520
97530
97540
97550
97560
97570
97580
97590
97600
97610
97620
97630
97640
97650
97660
97670
97680
97690
97700
97710
97720
97730
97740
97750
97760
97770
97780
97790
97800
97810
97820
97830
97840
97850
97860
97870
97880
97890
97900
97910
97920
97930
97940
97950
97960
97970
97980
97990
98000
98010
98020
98030
98040
98050
98060
98070
98080
98090
98100
98110
98120
98130
98140
98150
98160
98170
98180
98190
98200
98210
98220
98230
98240
98250
98260
98270
98280
98290
98300
98310
98320
98330
98340
98350
98360
98370
98380
98390
98400
98410
98420
98430
98440
98450
98460
98470
98480
98490
98500
98510
98520
98530
98540
98550
98560
98570
98580
98590
98600
98610
98620
98630
98640
98650
98660
98670
98680
98690
98700
98710
98720
98730
98740
98750
98760
98770
98780
98790
98800
98810
98820
98830
98840
98850
98860
98870
98880
98890
98900
98910
98920
98930
98940
98950
98960
98970
98980
98990
99000
99010
99020
99030
99040
99050
99060
99070
99080
99090
99100
99110
99120
99130
99140
99150
99160
99170
99180
99190
99200
99210
99220
99230
99240
99250
99260
99270
99280
99290
99300
99310
99320
99330
99340
99350
99360
99370
99380
99390
99400
99410
99420
99430
99440
99450
99460
99470
99480
99490
99500
99510
99520
99530
99540
99550
99560
99570
99580
99590
99600
99610
99620
99630
99640
99650
99660
99670
99680
99690
99700
99710
99720
99730
99740
99750
99760
99770
99780
99790
99800
99810
99820
99830
99840
99850
99860
99870
99880
99890
99900
99910
99920
99930
99940
99950
99960
99970
99980
99990
100000
100010
100020
100030
100040
100050
100060
100070
100080
100090
100100
100110
100120
100130
100140
100150
100160
100170
100180
100190
100200
100210
100220
100230
100240
100250
100260
100270
100280
100290
100300
100310
100320
100330
100340
100350
100360
100370
100380
100390
100400
100410
100420
100430
100440
100450
100460
100470
100480
100490
100500
100510
100520
100530
100540
100550
100560
100570
100580
100590
100600
100610
100620
100630
100640
100650
100660
100670
100680
100690
100700
100710
100720
100730
100740
100750
100760
100770
100780
100790
100800
100810
100820
100830
100840
100850
100860
100870
100880
100890
100900
100910
100920
100930
100940
100950
100960
100970
100980
100990
101000
101010
101020
101030
101040
101050
101060
101070
101080
101090
101100
101110
101120
101130
101140
101150
101160
101170
101180
101190
101200
101210
101220
101230
101240
101250
101260
101270
101280
101290
101300
101310
101320
101330
101340
101350
101360
101370
101380
101390
101400
101410
101420
101430
101440
101450
101460
101470
101480
101490
101500
101510
101520
101530
101540
101550
101560
101570
101580
101590
101600
101610
101620
101630
101640
101650
101660
101670
101680
101690
101700
101710
101720
101730
101740
101750
101760
101770
101780
101790
101800
101810
101820
101830
101840
101850
101860
101870
101880
101890
101900
101910
101920
101930
101940
101950
101960
101970
101980
101990
102000
102010
102020
102030
102040
102050
102060
102070
102080
102090
102100
102110
102120
102130
102140
102150
102160
102170
102180
102190
102200
102210
102220
102230
102240
102250
102260
102270
102280
102290
102300
102310
102320
102330
102340
102350
102360
102370
102380
102390
102400
102410
102420
102430
102440
102450
102460
102470
102480
102490
102500
102510
102520
102530
102540
102550
102560
102570
102580
102590
102600
102610
102620
102630
102640
102650
102660
102670
102680
102690
102700
102710
102720
102730
102740
102750
102760
102770
102780
102790
102800
102810
102820
102830
102840
102850
102860
102870
102880
102890
102900
102910
102920
102930
102940
102950
102960
102970
102980
102990
103000
103010
103020
103030
103040
103050
103060
103070
103080
103090
103100
103110
103120
103130
103140
103150
103160
103170
103180
103190
103200
103210
103220
103230
103240
103250
103261
103270
103281
103291
103301
103311
103321
103331
103341
103351
103361
103371
103381
103390
103401
103410
103420
103432
103440
103450
103460
103470
103481
103491
103501
103510
103520
103532
103540
103550
103560
103570
103580
103590
103602
103610
version = is_trial_embeded; import std.stdio; import std.algorithm; import std.string; ReportWriter defaultWriter; interface ReportWriter { enum Context { active, inactive, success, info, warning, danger, _default } void goTo(int); void write(string, Context = Context.active); void writeReverse(string, Context = Context.active); void writeln(string, Context = Context.active); void showCursor(); void hideCursor(); uint width(); } class ConsoleWriter : ReportWriter { void goTo(int) { } void write(string text, Context) { std.stdio.write(text); } void writeReverse(string text, Context) { std.stdio.write(text); } void writeln(string text, Context) { std.stdio.writeln(text); } void showCursor() { } void hideCursor() { } uint width() { return 80; } } shared static this() { version(windows) { import core.sys.windows.windows; SetConsoleCP(65001); SetConsoleOutputCP(65001); } defaultWriter = new ColorConsoleWriter; } class ColorConsoleWriter : ReportWriter { private { int[string] cues; Terminal terminal; int lines = 0; bool movedToBottom = false; Context currentContext = Context._default; bool isReversed = false; } this() { this.terminal = Terminal(ConsoleOutputType.linear); this.terminal._suppressDestruction = true; lines = this.terminal.cursorY; } void setColor(Context context) { if (!isReversed && context == currentContext) { return; } isReversed = false; currentContext = context; switch (context) { case Context.active: terminal.color(Color.white | Bright, Color.DEFAULT); break; case Context.inactive: terminal.color(Color.black | Bright, Color.DEFAULT); break; case Context.success: terminal.color(Color.green | Bright, Color.DEFAULT); break; case Context.info: terminal.color(Color.cyan, Color.DEFAULT); break; case Context.warning: terminal.color(Color.yellow, Color.DEFAULT); break; case Context.danger: terminal.color(Color.red, Color.DEFAULT); break; default: terminal.reset(); } } void setColorReverse(Context context) { if (!isReversed && context == currentContext) { return; } currentContext = context; isReversed = true; switch (context) { case Context.active: terminal.color(Color.DEFAULT, Color.white | Bright); break; case Context.inactive: terminal.color(Color.DEFAULT, Color.black | Bright); break; case Context.success: terminal.color(Color.DEFAULT, Color.green | Bright); break; case Context.info: terminal.color(Color.DEFAULT, Color.cyan); break; case Context.warning: terminal.color(Color.DEFAULT, Color.yellow); break; case Context.danger: terminal.color(Color.DEFAULT, Color.red); break; default: terminal.reset(); } } void resetColor() { setColor(Context._default); } void goTo(int y) { if (!movedToBottom) { movedToBottom = true; terminal.moveTo(0, terminal.height - 1); } terminal.moveTo(0, terminal.cursorY - y, ForceOption.alwaysSend); } void write(string text, Context context) { lines += text.count!(a => a == '\n'); setColor(context); terminal.write(text); terminal.flush; resetColor; terminal.flush; } void writeReverse(string text, Context context) { lines += text.count!(a => a == '\n'); setColorReverse(context); terminal.write(text); resetColor; terminal.flush; } void writeln(string text, Context context) { this.write(text ~ "\n", context); } void showCursor() { terminal.showCursor; } void hideCursor() { terminal.hideCursor; } uint width() { return terminal.width; } } class BufferedWriter : ReportWriter { string buffer = ""; private { size_t line = 0; size_t charPos = 0; bool replace; string[] screen; } void goTo(int y) { line = line - y; charPos = 0; } uint width() { return 80; } void write(string text, Context) { auto lines = text.count!(a => a == '\n'); auto pieces = buffer.split("\n"); auto newLines = text.split("\n"); for (auto i = line; i < line + newLines.length; i++) { if (i != line) { charPos = 0; } while (i >= screen.length) { screen ~= ""; } auto newLine = newLines[i - line]; if (charPos + newLine.length >= screen[i].length) { screen[i] = screen[i][0 .. charPos] ~ newLine; } else { screen[i] = screen[i][0 .. charPos] ~ newLine ~ screen[i][charPos + newLine.length .. $]; } charPos = charPos + newLine.length; } buffer = screen.join("\n"); screen = buffer.split("\n"); line += lines; } void writeReverse(string text, Context c) { write(text, c); } void writeln(string text, Context c) { write(text ~ '\n', c); } void showCursor() { } void hideCursor() { } } import std.stdio; import std.array; import std.conv; import std.datetime; version(Have_fluent_asserts_core) { import fluentasserts.core.base; import fluentasserts.core.results; } struct TestResultGlyphs { version(Windows) { string error = "x"; } else { string error = "✖"; } } string testResultGlyphsToCode(TestResultGlyphs glyphs) { return "TestResultGlyphs(`" ~ glyphs.error ~ "`)"; } class ResultReporter : ILifecycleListener, ITestCaseLifecycleListener, ISuiteLifecycleListener, IStepLifecycleListener { private { TestResultGlyphs glyphs; int suites; int tests; int pending; int failedTests; SysTime beginTime; ReportWriter writer; Throwable[] exceptions; string[] failedTestNames; string currentSuite; } this() { writer = defaultWriter; } this(TestResultGlyphs glyphs) { writer = defaultWriter; this.glyphs = glyphs; } this(ReportWriter writer) { this.writer = writer; } void begin(ref SuiteResult suite) { suites++; currentSuite = suite.name; } void end(ref SuiteResult suite) { } void update() { } void begin(string suite, ref TestResult test) { } void end(string suite, ref TestResult test) { if(test.status == TestResult.Status.pending) { pending++; } else { tests++; } if (test.status != TestResult.Status.failure) { return; } exceptions ~= test.throwable; failedTestNames ~= currentSuite ~ " " ~ test.name; failedTests++; } void begin(string suite, string test, ref StepResult step) { } void end(string suite, string test, ref StepResult step) { } void begin(ulong) { beginTime = Clock.currTime; } void end(SuiteResult[] results) { auto diff = Clock.currTime - beginTime; writer.writeln(""); writer.writeln(""); if (tests == 0) { reportNoTest; } if (tests == 1) { reportOneTestResult; } if (tests > 1) { reportTestsResult; } if(pending == 1) { reportOnePendingTest; } else if(pending > 1) { reportManyPendingTests; } writer.writeln(""); reportExceptions; } private { void reportNoTest() { writer.write("There are no tests to run."); } void reportOnePendingTest() { writer.write("There is a pending test.\n", ReportWriter.Context.info); } void reportManyPendingTests() { writer.write("There are " ~ pending.to!string ~ " pending tests.\n", ReportWriter.Context.info); } void reportOneTestResult() { auto timeDiff = Clock.currTime - beginTime; if (failedTests > 0) { writer.write(glyphs.error ~ " The test failed in " ~ timeDiff.to!string ~ ":", ReportWriter.Context.danger); return; } writer.write("The test succeeded in " ~ timeDiff.to!string ~ "!\n", ReportWriter.Context.info); } void reportTestsResult() { string suiteText = suites == 1 ? "1 suite" : suites.to!string ~ " suites"; auto timeDiff = Clock.currTime - beginTime; writer.write("Executed " ~ tests.to!string ~ " tests in " ~ suiteText ~ " in " ~ timeDiff.to!string ~ ".\n", ReportWriter.Context.info); } void reportExceptions() { foreach (size_t i, t; exceptions) { writer.writeln(""); writer.writeln(i.to!string ~ ") " ~ failedTestNames[i] ~ ":", ReportWriter.Context.danger); version(Have_fluent_asserts_core) { TestException e = cast(TestException) t; if (e is null) { writer.writeln(t.to!string); } else { e.print(new TrialResultPrinter(defaultWriter)); } } else { writer.writeln(t.to!string); } writer.writeln(""); } } } } version(Have_fluent_asserts_core) { class TrialResultPrinter : ResultPrinter { ReportWriter writer; this(ReportWriter writer) { this.writer = writer; } void primary(string text) { writer.write(text, ReportWriter.Context._default); writer.write(""); } void info(string text) { writer.write(text, ReportWriter.Context.info); writer.write(""); } void danger(string text) { writer.write(text, ReportWriter.Context.danger); writer.write(""); } void success(string text) { writer.write(text, ReportWriter.Context.success); writer.write(""); } void dangerReverse(string text) { writer.writeReverse(text, ReportWriter.Context.danger); writer.write(""); } void successReverse(string text) { writer.writeReverse(text, ReportWriter.Context.success); writer.write(""); } } } import std.algorithm; import std.string; import std.conv; import std.exception; import std.array; import std.datetime; import std.stdio; import std.file; import std.path; struct Stat { string name; SysTime begin; SysTime end; TestResult.Status status = TestResult.Status.unknown; } class StatStorage { Stat[] values; } Stat find(StatStorage storage, const(string) name) { auto res = storage.values.filter!(a => a.name == name); if (res.empty) { return Stat("", SysTime.min, SysTime.min); } return res.front; } class StatsReporter : ILifecycleListener, ITestCaseLifecycleListener, ISuiteLifecycleListener, IStepLifecycleListener { private { immutable string destination; StatStorage storage; string[][string] path; } this(StatStorage storage, string destination) { this.storage = storage; this.destination = destination; } this(string destination) { this(new StatStorage, destination); } private { auto lastItem(string key) { enforce(path[key].length > 0, "There is no defined path"); return path[key][path.length - 1]; } } void update() { } void begin(ref SuiteResult suite) { } void end(ref SuiteResult suite) { storage.values ~= Stat(suite.name, suite.begin, Clock.currTime); } void begin(string suite, ref TestResult test) { } void end(string suite, ref TestResult test) { storage.values ~= Stat(suite ~ "." ~ test.name, test.begin, Clock.currTime, test.status); } void begin(string suite, string test, ref StepResult step) { string key = suite ~ "." ~ test; path[key] ~= step.name; } void end(string suite, string test, ref StepResult step) { string key = suite ~ "." ~ test; enforce(lastItem(key) == step.name, "Invalid step name"); storage.values ~= Stat(key ~ "." ~ path[key].join('.'), step.begin, Clock.currTime); path[key] = path[key][0 .. $ - 1]; } void begin(ulong) { } void end(SuiteResult[]) { auto parent = buildPath(pathSplitter(destination).array[0..$-1]); if(parent != "" && !parent.exists) { mkdirRecurse(parent); } std.file.write(destination, storage.toCsv); auto attachment = const Attachment("stats", destination, "text/csv"); if(LifeCycleListeners.instance !is null) { LifeCycleListeners.instance.attach(attachment); } } } string toCsv(const(StatStorage) storage) { return storage.values.map!(a => [a.name, a.begin.toISOExtString, a.end.toISOExtString, a.status.to!string]).map!(a => a.join(',')).join('\n'); } StatStorage toStatStorage(const(string) data) { auto stat = new StatStorage; stat.values = data.split('\n').map!(a => a.split(',')).map!(a => Stat(a[0], SysTime.fromISOExtString(a[1]), SysTime.fromISOExtString(a[2]), a[3].to!(TestResult.Status))).array; return stat; } StatStorage statsFromFile(string fileName) { if (!fileName.exists) { return new StatStorage(); } return fileName.readText.toStatStorage; } import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; struct DotMatrixGlyphs { string success = "."; string failure = "!"; string unknown = "?"; string pending = "-"; } string dotMatrixGlyphsToCode(DotMatrixGlyphs glyphs) { return "DotMatrixGlyphs(`"~ glyphs.success ~"`,`"~ glyphs.failure ~"`,`"~ glyphs.unknown ~"`)"; } class DotMatrixReporter : ITestCaseLifecycleListener { private { ReportWriter writer; DotMatrixGlyphs glyphs; } this(DotMatrixGlyphs glyphs) { writer = defaultWriter; this.glyphs = glyphs; } this(ReportWriter writer) { this.writer = writer; } void begin(string suite, ref TestResult test) { } void end(string suite, ref TestResult test) { switch (test.status) { case TestResult.Status.success: writer.write(glyphs.success, ReportWriter.Context.inactive); break; case TestResult.Status.failure: writer.write(glyphs.failure, ReportWriter.Context.danger); break; case TestResult.Status.pending: writer.write(glyphs.pending, ReportWriter.Context.info); break; default: writer.write(glyphs.unknown, ReportWriter.Context.warning); } } } import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; import std.file; class HtmlReporter : ILifecycleListener { string header = `<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <meta charset="UTF-8"> <title>Test Result</title> </head> <body>`; string footer = `</body></html>`; private { bool success = true; } this(string destination) { } void begin(ulong) { } void update() { } void end(SuiteResult[] results) { string content = header; string escapeHtml(string text) { return text.replace("<", "<").replace(">", ">"); } string duration(T)(T item) pure { return ` <span class="duration">` ~ (item.end - item.begin).to!string ~ `</span> `; } string testStatus(T)(T item) { if (item.status == TestResult.Status.success) { return `<span class="label label-success">` ~ item.status.to!string ~ `</span>`; } if (item.status == TestResult.Status.failure) { return `<span class="label label-danger">` ~ item.status.to!string ~ `</span>`; } return `<span class="label label-info">` ~ item.status.to!string ~ `</span>`; } content ~= `<div class="container-fluid">`; string details; double passes = 0; double failures = 0; double pending = 0; double other = 0; Duration totalDuration = Duration.zero; foreach (result; results) { details ~= "\n<h1>" ~ escapeHtml(result.name) ~ "<small>" ~ duration( result) ~ "</small></h1>\n"; totalDuration += result.end - result.begin; foreach (test; result.tests) { details ~= `<div class="row">`; details ~= `<div class="col-sm-4"><strong class='test-name'>` ~ escapeHtml( test.name) ~ `</strong></div>`; details ~= `<div class="col-sm-8">` ~ testStatus( test) ~ ` <span class="label label-default">` ~ duration(test) ~ `</span></div>`; details ~= `</div>`; if (test.throwable !is null) { details ~= `<pre>` ~ escapeHtml(test.throwable.to!string) ~ `</pre>`; } if (test.status == TestResult.Status.success) { passes++; } else if (test.status == TestResult.Status.failure) { failures++; } else if (test.status == TestResult.Status.pending) { pending++; } else { other++; } } } content ~= `<p>passes: <strong>` ~ passes.to!string ~ `</strong></p>`; content ~= `<p>failures: <strong>` ~ failures.to!string ~ `</strong></p>`; content ~= `<p>pending: <strong>` ~ pending.to!string ~ `</strong></p>`; content ~= `<p>other: <strong>` ~ other.to!string ~ `</strong></p>`; content ~= `<p>duration: <strong>` ~ totalDuration.to!string ~ `</strong></p>`; auto passPercent = ((passes / (passes + failures + other)) * 100); auto failurePercent = ((failures / (passes + failures + other)) * 100); auto otherPercent = ((other / (passes + failures + other)) * 100); content ~= `<div class="progress"> <div class="progress-bar progress-bar-success" style="width: ` ~ passPercent.to!string ~ `%;"></div> <div class="progress-bar progress-bar-danger" style="width: ` ~ failurePercent.to!string ~ `%;"></div> <div class="progress-bar" style="width: ` ~ otherPercent.to!string ~ `%;"></div> </div>`; content ~= details ~ "\n</div>" ~ footer; std.file.write("trial-result.html", content); } } import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; import std.file; import std.path; import std.uuid; import std.range; private string escape(string data) { string escapedData = data.dup; escapedData = escapedData.replace(`&`, `&`); escapedData = escapedData.replace(`"`, `"`); escapedData = escapedData.replace(`'`, `'`); escapedData = escapedData.replace(`<`, `<`); escapedData = escapedData.replace(`>`, `>`); return escapedData; } class AllureReporter : ILifecycleListener { private { immutable string destination; } this(string destination) { this.destination = destination; } void begin(ulong testCount) { if(exists(destination)) { std.file.rmdirRecurse(destination); } } void update() {} void end(SuiteResult[] result) { if(!exists(destination)) { destination.mkdirRecurse; } foreach(item; result) { string uuid = randomUUID.toString; string xml = AllureSuiteXml(destination, item, uuid).toString; std.file.write(buildPath(destination, uuid ~ "-testsuite.xml"), xml); } } } struct AllureSuiteXml { SuiteResult result; string uuid; const string allureVersion = "1.5.2"; private { immutable string destination; } this(const string destination, SuiteResult result, string uuid) { this.destination = destination; this.result = result; this.uuid = uuid; } string toString() { auto epoch = SysTime.fromUnixTime(0); string tests = result.tests.map!(a => AllureTestXml(destination, a, uuid).toString).array.join("\n"); if(tests != "") { tests = "\n" ~ tests; } auto xml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:test-suite start="` ~ (result.begin - epoch).total!"msecs".to!string ~ `" stop="` ~ (result.end - epoch).total!"msecs".to!string ~ `" version="` ~ this.allureVersion ~ `" xmlns:ns2="urn:model.allure.qatools.yandex.ru"> <name>` ~ result.name.escape ~ `</name> <title>` ~ result.name.escape ~ `</title> <test-cases>` ~ tests ~ ` </test-cases> `; if(result.attachments.length > 0) { xml ~= " <attachments>\n"; xml ~= result.attachments.map!(a => AllureAttachmentXml(destination, a, 6, uuid)).map!(a => a.toString).array.join('\n') ~ "\n"; xml ~= " </attachments>\n"; } xml ~= ` <labels> <label name="framework" value="Trial"/> <label name="language" value="D"/> </labels> </ns2:test-suite>`; return xml; } } struct AllureTestXml { TestResult result; string uuid; private { immutable string destination; } this(const string destination, TestResult result, string uuid) { this.destination = destination; this.result = result; this.uuid = uuid; } string allureStatus() { switch(result.status) { case TestResult.Status.created: return "canceled"; case TestResult.Status.failure: return "failed"; case TestResult.Status.skip: return "canceled"; case TestResult.Status.success: return "passed"; default: return "unknown"; } } string toString() { auto epoch = SysTime.fromUnixTime(0); auto start = (result.begin - epoch).total!"msecs"; auto stop = (result.end - epoch).total!"msecs"; string xml = ` <test-case start="` ~ start.to!string ~ `" stop="` ~ stop.to!string ~ `" status="` ~ allureStatus ~ `">` ~ "\n"; xml ~= ` <name>` ~ result.name.escape ~ `</name>` ~ "\n"; if(result.labels.length > 0) { xml ~= " <labels>\n"; foreach(label; result.labels) { xml ~= " <label name=\"" ~ label.name ~ "\" value=\"" ~ label.value ~ "\"/>\n"; } xml ~= " </labels>\n"; } if(result.throwable !is null) { xml ~= ` <failure> <message>` ~ result.throwable.msg.escape ~ `</message> <stack-trace>` ~ result.throwable.to!string.escape ~ `</stack-trace> </failure>` ~ "\n"; } if(result.steps.length > 0) { xml ~= " <steps>\n"; xml ~= result.steps.map!(a => AllureStepXml(destination, a, 14, uuid)).map!(a => a.toString).array.join('\n') ~ "\n"; xml ~= " </steps>\n"; } if(result.attachments.length > 0) { xml ~= " <attachments>\n"; xml ~= result.attachments.map!(a => AllureAttachmentXml(destination, a, 14, uuid)).map!(a => a.toString).array.join('\n') ~ "\n"; xml ~= " </attachments>\n"; } xml ~= ` </test-case>`; return xml; } } struct AllureStepXml { private { StepResult step; size_t indent; string uuid; immutable string destination; } this(const string destination, StepResult step, size_t indent, string uuid) { this.step = step; this.indent = indent; this.uuid = uuid; this.destination = destination; } string toString() { auto epoch = SysTime.fromUnixTime(0); const spaces = " " ~ (" ".repeat(indent).array.join()); string result = spaces ~ `<step start="` ~ (step.begin - epoch).total!"msecs".to!string ~ `" stop="` ~ (step.end - epoch).total!"msecs".to!string ~ `" status="passed">` ~ "\n" ~ spaces ~ ` <name>` ~ step.name.escape ~ `</name>` ~ "\n"; if(step.steps.length > 0) { result ~= spaces ~ " <steps>\n"; result ~= step.steps.map!(a => AllureStepXml(destination, a, indent + 6, uuid)).map!(a => a.to!string).array.join('\n') ~ "\n"; result ~= spaces ~ " </steps>\n"; } if(step.attachments.length > 0) { result ~= spaces ~ " <attachments>\n"; result ~= step.attachments.map!(a => AllureAttachmentXml(destination, a, indent + 6, uuid)).map!(a => a.to!string).array.join('\n') ~ "\n"; result ~= spaces ~ " </attachments>\n"; } result ~= spaces ~ `</step>`; return result; } } struct AllureAttachmentXml { private { const { Attachment attachment; size_t indent; } string allureFile; } @disable this(); this(const string destination, Attachment attachment, size_t indent, string uuid) { this.indent = indent; if(!exists(buildPath(destination, uuid))) { buildPath(destination, uuid).mkdirRecurse; } ulong index; do { allureFile = buildPath(uuid, attachment.name ~ "." ~ index.to!string ~ "." ~ baseName(attachment.file)); index++; } while(buildPath(destination, allureFile).exists); if(attachment.file.exists) { std.file.copy(attachment.file, buildPath(destination, allureFile)); } this.attachment = Attachment(attachment.name, buildPath(destination, allureFile), attachment.mime); } string toString() { return (" ".repeat(indent).array.join()) ~ "<attachment title=\"" ~ attachment.name ~ "\" source=\"" ~ allureFile ~ "\" type=\"" ~ attachment.mime ~ "\" />"; } } import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; struct LandingGlyphs { string plane = "✈"; string margin = "━"; string lane = "⋅"; } string landingGlyphsToCode(LandingGlyphs glyphs) { return "LandingGlyphs(`"~ glyphs.plane ~"`,`"~ glyphs.margin ~"`,`"~ glyphs.lane ~"`)"; } class LandingReporter : ITestCaseLifecycleListener, ILifecycleListener { private { ReportWriter writer; LandingGlyphs glyphs; ulong testCount; ulong currentTest; bool success = true; } this(LandingGlyphs glyphs) { writer = defaultWriter; this.glyphs = glyphs; } this(ReportWriter writer) { this.writer = writer; } void begin(ulong testCount) { this.testCount = testCount; writer.writeln("\n\n"); drawLane; } void update() { } void end(SuiteResult[]) { } void begin(string suite, ref TestResult test) { } void end(string suite, ref TestResult test) { currentTest++; success = success && test.status == TestResult.Status.success; drawLane; } private void drawLane() { size_t size = (writer.width / 4) * 3; size_t position = ((cast(double) currentTest / cast(double) testCount) * size).to!size_t; writer.goTo(3); writer.writeln(glyphs.margin.replicate(size), ReportWriter.Context.inactive); if (currentTest < testCount) { writer.write(glyphs.lane.replicate(position), ReportWriter.Context.inactive); writer.write(glyphs.plane, success ? ReportWriter.Context.active : ReportWriter.Context.danger); writer.writeln(glyphs.lane.replicate(size - position - 1), ReportWriter.Context.inactive); } else { writer.write(glyphs.lane.replicate(size), ReportWriter.Context.inactive); writer.writeln(glyphs.plane, success ? ReportWriter.Context.active : ReportWriter.Context.danger); } writer.writeln(glyphs.margin.replicate(size), ReportWriter.Context.inactive); } } import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; class ListReporter : SpecReporter { this(SpecGlyphs glyphs) { super(glyphs); } this(ReportWriter writer) { super(writer); } override { void begin(string suite, ref TestResult) { } void end(string suite, ref TestResult test) { if(test.status == TestResult.Status.success) { write!(Type.success)("", 1); write!(Type.none)(suite ~ " " ~ test.name ~ "\n"); } else if(test.status == TestResult.Status.pending) { write!(Type.pending)("", 1); write!(Type.none)(suite ~ " " ~ test.name ~ "\n"); } else { write!(Type.failure)(suite ~ " " ~ test.name ~ "\n", 1); failedTests++; } } } } import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; struct ProgressGlyphs { version(Windows) { string empty = "."; string fill = "#"; } else { string empty = "░"; string fill = "▓"; } } string progressGlyphsToCode(ProgressGlyphs glyphs) { return "ProgressGlyphs(`" ~ glyphs.empty ~ "`,`" ~ glyphs.fill ~ "`)"; } class ProgressReporter : ITestCaseLifecycleListener, ILifecycleListener { private { ReportWriter writer; ProgressGlyphs glyphs; ulong testCount; ulong currentTest; bool success = true; } this(ProgressGlyphs glyphs) { writer = defaultWriter; this.glyphs = glyphs; } this(ReportWriter writer) { this.writer = writer; } void begin(ulong testCount) { this.testCount = testCount; writer.writeln(""); draw; } void update() { } void end(SuiteResult[]) { } void begin(string suite, ref TestResult test) { } void end(string suite, ref TestResult test) { currentTest++; success = success && test.status == TestResult.Status.success; draw; } private void draw() { int size = min((writer.width / 4) * 3, testCount); size_t position = ((cast(double) currentTest / cast(double) testCount) * size).to!size_t; writer.goTo(1); writer.write(currentTest.to!string ~ "/" ~ testCount.to!string ~ " ", success ? ReportWriter.Context.active : ReportWriter.Context.danger); writer.write(glyphs.fill.replicate(position), ReportWriter.Context.active); writer.writeln(glyphs.empty.replicate(size - position), ReportWriter.Context.inactive); } } import std.stdio; import std.array; import std.conv; import std.datetime; import std.algorithm; class SpecProgressReporter : SpecReporter, ISuiteLifecycleListener, ILifecycleListener { private { alias UpdateFunction = void delegate(CueInfo info); struct CueInfo { string id; string name; long duration; SysTime begin; } size_t oldTextLength; StatStorage storage; string[] path; CueInfo[] cues; } this(StatStorage storage) { super(); this.storage = storage; writer.writeln(""); } this(ReportWriter writer, StatStorage storage) { super(writer); this.storage = storage; writer.writeln(""); } void clearProgress() { writer.goTo(1); writer.write("\n" ~ " ".replicate(oldTextLength)); writer.goTo(1); oldTextLength = 0; } void begin(ulong) {} void end(SuiteResult[]) {} void update() { writer.hideCursor; auto now = Clock.currTime; auto progress = cues.map!(cue => "*[" ~ (cue.duration - (now - cue.begin).total!"seconds").to!string ~ "s]" ~ cue.name).join(" ").to!string; auto spaces = ""; if(oldTextLength > progress.length) { spaces = " ".replicate(oldTextLength - progress.length); } writer.goTo(1); writer.write("\n" ~ progress ~ spaces ~ " "); oldTextLength = progress.length; writer.showCursor; } void removeCue(string id) { cues = cues.filter!(a => a.id != id).array; } void begin(ref SuiteResult suite) { auto stat = storage.find(suite.name); auto duration = (stat.end - stat.begin).total!"seconds"; cues ~= CueInfo(suite.name, suite.name, duration, Clock.currTime); update; } void end(ref SuiteResult suite) { removeCue(suite.name); update; } override { void begin(string suite, ref TestResult test) { super.begin(suite, test); auto stat = storage.find(suite ~ "." ~ test.name); auto duration = (stat.end - stat.begin).total!"seconds"; cues ~= CueInfo(suite ~ "." ~ test.name, test.name, duration, Clock.currTime); update; } void end(string suite, ref TestResult test) { clearProgress; super.end(suite, test); removeCue(suite ~ "." ~ test.name); writer.writeln(""); update; } } } struct SpecStepsGlyphs { version(Windows) { string testBegin = "/"; string testEnd = "\\"; string step = "|"; } else { string testBegin = "┌"; string testEnd = "└"; string step = "│"; } } string specStepsGlyphsToCode(SpecStepsGlyphs glyphs) { return "SpecStepsGlyphs(`" ~ glyphs.testBegin ~ "`, `" ~ glyphs.testEnd ~ "`, `" ~ glyphs.step ~ "`)"; } class SpecStepsReporter : SpecReporter, ISuiteLifecycleListener, IStepLifecycleListener { private { size_t indents; size_t stepIndents; SpecStepsGlyphs glyphs; } this(SpecStepsGlyphs glyphs) { super(); this.glyphs = glyphs; } this(ReportWriter writer) { super(writer); } void begin(ref SuiteResult suite) { indents = printSuite(suite.name); } void end(ref SuiteResult) { } override { void begin(string suite, ref TestResult test) { stepIndents = 0; write!(Type.none)(glyphs.testBegin ~ " " ~ test.name ~ "\n", indents); } void end(string suite, ref TestResult test) { write!(Type.none)(glyphs.testEnd ~ " ", indents); if(test.status == TestResult.Status.success) { write!(Type.success)("Success\n", 0); } else if(test.status == TestResult.Status.failure) { write!(Type.failure)("Failure\n", 0); failedTests++; } else if(test.status == TestResult.Status.pending) { write!(Type.pending)("Pending\n", 0); } else { write!(Type.none)("Unknown\n", 0); } } } void begin(string suite, string test, ref StepResult s) { stepIndents++; write!(Type.none)(glyphs.step, indents); write!(Type.none)(" " ~ s.name ~ "\n", stepIndents); } void end(string suite, string test, ref StepResult) { stepIndents--; } } import std.stdio; import std.array; import std.conv; import std.datetime; import std.string; import std.algorithm; struct SpecGlyphs { version(Windows) { string ok = "+"; } else { string ok = "✓"; } string pending = "-"; } string specGlyphsToCode(SpecGlyphs glyphs) { return "SpecGlyphs(`" ~ glyphs.ok ~ "`)"; } class SpecReporter : ITestCaseLifecycleListener { enum Type { none, success, step, pending, failure, testBegin, testEnd, emptyLine } protected { int failedTests = 0; string lastSuiteName; ReportWriter writer; } private { SpecGlyphs glyphs; } this() { writer = defaultWriter; } this(SpecGlyphs glyphs) { writer = defaultWriter; this.glyphs = glyphs; } this(ReportWriter writer) { this.writer = writer; } private { string indentation(size_t cnt) pure { return " ".replicate(cnt); } } void write(Type t)(string text = "", size_t spaces = 0) { writer.write(indentation(spaces)); switch (t) { case Type.emptyLine: writer.writeln(""); break; case Type.success: writer.write(glyphs.ok, ReportWriter.Context.success); writer.write(" " ~ text, ReportWriter.Context.inactive); break; case Type.pending: writer.write(glyphs.pending, ReportWriter.Context.info); writer.write(" " ~ text, ReportWriter.Context.inactive); break; case Type.failure: writer.write(failedTests.to!string ~ ") " ~ text, ReportWriter.Context.danger); break; default: writer.write(text); } } void begin(string suite, ref TestResult test) { } protected auto printSuite(string suite) { size_t indents = 1; auto oldPieces = lastSuiteName.split("."); auto pieces = suite.split("."); lastSuiteName = suite; auto prefix = oldPieces.commonPrefix(pieces).array.length; write!(Type.emptyLine)(); indents += prefix; foreach (piece; pieces[prefix .. $]) { write!(Type.none)(piece, indents); write!(Type.emptyLine)(); indents++; } return indents; } void end(string suite, ref TestResult test) { size_t indents = 1; if (suite != lastSuiteName) { indents = printSuite(suite); } else { indents = suite.count('.') + 2; } if (test.status == TestResult.Status.success) { write!(Type.success)(test.name, indents); } if (test.status == TestResult.Status.pending) { write!(Type.pending)(test.name, indents); } if (test.status == TestResult.Status.failure) { write!(Type.failure)(test.name, indents); failedTests++; } write!(Type.emptyLine); indents--; } } import std.stdio; i