From 9293252bc48089a280eb8b26fab219fa49b6fee5 Mon Sep 17 00:00:00 2001
From: Adylan Roaffa <adylanrff@gmail.com>
Date: Thu, 11 Apr 2019 22:17:19 +0700
Subject: [PATCH] add readme and output writer

---
 .vscode/settings.json       |   38 +
 Makefile                    |   14 +-
 README.md                   |  136 +
 output/output.txt           | 5000 +++++++++++++++++++++++++++++++++++
 radixsort_serial            |  Bin 0 -> 13704 bytes
 src/radixSort/radixSort.cu  |   11 +-
 src/radixSort/radixSort.cuh |    1 -
 src/radixsort_paralel.cu    |    6 +-
 src/radixsort_serial.c      |    1 +
 src/util/util.cpp           |   22 +-
 src/util/util.hpp           |    4 +-
 11 files changed, 5211 insertions(+), 22 deletions(-)
 create mode 100644 .vscode/settings.json
 create mode 100644 README.md
 create mode 100644 output/output.txt
 create mode 100755 radixsort_serial

diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..f043d8f
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,38 @@
+{
+  "files.associations": {
+    "array": "cpp",
+    "*.tcc": "cpp",
+    "cctype": "cpp",
+    "clocale": "cpp",
+    "cstdarg": "cpp",
+    "cstdint": "cpp",
+    "cstdio": "cpp",
+    "cstdlib": "cpp",
+    "cwchar": "cpp",
+    "cwctype": "cpp",
+    "unordered_map": "cpp",
+    "vector": "cpp",
+    "exception": "cpp",
+    "fstream": "cpp",
+    "functional": "cpp",
+    "initializer_list": "cpp",
+    "iosfwd": "cpp",
+    "iostream": "cpp",
+    "istream": "cpp",
+    "limits": "cpp",
+    "memory": "cpp",
+    "new": "cpp",
+    "ostream": "cpp",
+    "sstream": "cpp",
+    "stdexcept": "cpp",
+    "streambuf": "cpp",
+    "system_error": "cpp",
+    "type_traits": "cpp",
+    "tuple": "cpp",
+    "typeinfo": "cpp",
+    "utility": "cpp",
+    "cmath": "cpp",
+    "string_view": "cpp",
+    "string": "cpp"
+  }
+}
\ No newline at end of file
diff --git a/Makefile b/Makefile
index ffb4e92..4831438 100644
--- a/Makefile
+++ b/Makefile
@@ -2,18 +2,16 @@ CXX := gcc
 CUDA := nvcc
 OUTPUT_DIR := output
 LIB := -lm
-EXEC_PARALEL := radixsort_paralel
-EXEC_SERIAL := radixsort_serial
-
-debug:
-	@mkdir -p ${OUTPUT_DIR}
-	${CUDA} src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c
-	${CUDA}  radixsort_paralel.o util.o cudaUtil.o radixSort.o -o bin/radixsort_paralel.out
+EXEC_PARALEL := radixsort_paralel.o radixSort.o
+EXEC_SERIAL := radixsort_serial.o
 
+all:
+	make clean
+	make build
 
 build:
 	@mkdir -p ${OUTPUT_DIR}
-	${CUDA} src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c
+	${CUDA} src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c 
 	${CUDA}  radixsort_paralel.o util.o cudaUtil.o radixSort.o -o bin/radixsort_paralel.out
 	${CXX} src/util/util.cpp src/radixsort_serial.c  -o ${EXEC_SERIAL} 
 
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d09a9e3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,136 @@
+# Praktikum 2 - Open MPI Radix Sort
+
+## Daftar Isi
+- [Praktikum 2 - Open MPI Radix Sort](#praktikum-2---open-mpi-radix-sort)
+  - [Daftar Isi](#daftar-isi)
+  - [Overview](#overview)
+  - [Petunjuk Penggunaan](#petunjuk-penggunaan)
+    - [Prerequisites](#prerequisites)
+    - [Installing](#installing)
+    - [Running The Program](#running-the-program)
+  - [Pembagian Tugas](#pembagian-tugas)
+    - [1. Tugas - Adylan Roaffa Ilmy](#1-tugas---adylan-roaffa-ilmy)
+    - [2. Tugas - Ayrton Cyril](#2-tugas---ayrton-cyril)
+  - [Laporan Pengerjaan](#laporan-pengerjaan)
+    - [Deskripsi Solusi](#deskripsi-solusi)
+    - [Analisis Solusi](#analisis-solusi)
+    - [Pemetaan Thread & Jumlah Thread](#pemetaan-thread--jumlah-thread)
+    - [Spesifikasi *Hardware*](#spesifikasi-hardware)
+    - [Pengukuran Kinerja](#pengukuran-kinerja)
+    - [Analisis Kinerja](#analisis-kinerja)
+  - [Authors](#authors)
+
+## Overview
+Implementasi *Radix Sort* secara paralel pada OpenMPI. Radix Sort adalah algoritma sorting yang mengurutkan data menggunakan kunci bilangan (integer) dengan melakukan pengelompokan kunci berdasarkan angka yang memiliki kesamaan posisi dan nilai (ratusan dengan ratusan, puluhan dengan puluhan). Ide utama dari algoritma ini adalah melakukan pengurutan untuk setiap angka (digit) dari least significant digit sampai dengan most significant digit. 
+
+## Petunjuk Penggunaan
+
+### Prerequisites
+
+Berikut adalah *library* yang harus sudah di-*install* pada komputer anda.
+
+1. GCC version 7+
+2. [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads) 
+  
+### Installing
+
+1. Panggil command `make` pada *root directory* repository ini. 
+   \
+   Setelah melakukan pemanggilan command `make`, diharapkan akan ada output sebagai berikut:
+    ```
+    make clean
+    make[1]: Entering directory '/data'
+    make[1]: Leaving directory '/data'
+    make build
+    make[1]: Entering directory '/data'
+    nvcc src/radixsort_paralel.cu src/cudaUtil/cudaUtil.cu src/radixSort/radixSort.cu src/util/util.cpp --device-c
+    nvcc  radixsort_paralel.o util.o cudaUtil.o radixSort.o -o bin/radixsort_paralel.out
+    gcc src/util/util.cpp src/radixsort_serial.c  -o radixsort_serial.o 
+    make[1]: Leaving directory '/data'
+    ```
+    Apabila telah keluar output seperti di atas, program telah berhasil di-*install*. 
+
+### Running The Program
+
+1. Ketikkan `bash run_cuda.sh <N>` untuk menjalankan program *Radix Sort* dengan <N> adalah jumlah elemen pada array yang ingin diurutkan. 
+   
+2. Apabila program berhasil dijalankan, akan keluar output yang menandakan waktu yang dibutuhkan untuk melakukan algoritma *Radix Sort*.\
+Contoh:
+    ```
+    $ bash run_cuda.sh 500000
+
+    Sorted!
+
+    Parallel execution time = 258747.
+
+    Serial execution time = 751007.
+    ```
+
+
+## Pembagian Tugas
+
+### 1. Tugas - Adylan Roaffa Ilmy
+|No|Tugas|
+|---|---|
+|1|Optimasi CUDA + analisis|   
+|2|Output writer|   
+|3|Membuat README.md|
+
+### 2. Tugas - Ayrton Cyril
+|No|Tugas|
+|---|---|
+|1 | Membuat paralel create bucket|
+|2 | Membuat copy output|
+|3 | Membuat penghitung waktu|
+
+ 
+## Laporan Pengerjaan
+
+### Deskripsi Solusi
+1. 	Melakukan sorting radix sort dengan Most Significant Bit
+2.	Membagi element array yang sudah di sort ke setiap proses. Setiap thread dibagi serata mungkin dengan aturan tidak boleh ada kumpulan Most Significant Bit yang sama yang terpisah di 2 proses yang berbeda
+3.	Lakukan radix sort pada setiap masing-masing proses
+4.	Gabungkan kembali hasil sorting ke array pada root
+
+### Analisis Solusi
+Dari hasil analisis yang paling berpengaruh dalam performa *Radix Sort CUDA* adalah dengan menggunakan GPU dalam melaksanakan pengurutan array. *Overhead* yang diakibatkan oleh fungsi ***cudaMalloc*** dan ***cudaMemcpy*** adalah hal yang menyebabkan algoritma *Radix Sort* terasa lambat apabila dijalankan secara parallel. 
+
+### Pemetaan Thread & Jumlah Thread
+Jumlah thread yang digunakan pada kasus ini adalah **256 thread**. Hal ini dikarenakan pada CUDA GPU, thread harus dalam kelipatan 32. Dan berdasarkan percobaan yang telah kami lakukan, jumlah thread yang paling optimal dalam penyelesaian kasus *Radix Sort* adalah sejumlah **256 thread**. 
+
+### Spesifikasi *Hardware*
+
+Percobaan digunakan dengan menggunakan **Asus ROG GL552-VW** dengan spesifikasi sebagai berikut
+
+|No| Nama | Keterangan|
+|---| -----| -----|
+|1| Processor| Intel Skylake Core i7-6700HQ CPU, quad-core 2.6 GHz (3.5 GHz TBoost)|
+|2| Video| Integrated Intel HD 530 + **Nvidia GTX 960M 4GB**|
+|3| Memory| 16 GB DDR4 2133Mhz (2xDIMMs)|
+|4| Storage| 1 TB 2.5″ HDD (Hitachi HTS5410)|
+
+
+### Pengukuran Kinerja
+Satuan kinerja yang digunakan adalah ukuran waktu dengan satuan *microseconds (μs)*. Berikut adalah hasil pengukuran kinerja algoritma *Radix Sort* yang dijalankan secara parallel dibandingkan dengan *Radix Sort* yang dijalankan secara serial.
+Hasil dicatat dilakukan dengan laptop.  
+
+- Pengetesan pada local
+   
+|No | N | Waktu Eksekusi Serial (μs)| Waktu Eksekusi Parallel (μs)|  
+|---|----|----|----|
+| 1 |5.000|1241505<br>1229600<br>780531|1190322<br>1180110<br>732153|
+| 2 |50.000|991688<br>1012789<br>735255|894433<br>874755<br>613396|
+| 3 |100000|1733229<br>578202<br>1188002|1522080<br>390158<br>997728|
+| 4 |200000|1316615<br>526201<br>1248599|978895<br>190177<br>167008
+| 5 |400000|2167407<br>1481110<br>2252768|1541969<br>836728<br>1615249| 
+
+### Analisis Kinerja
+Seperti yang dapat dilihat pada bagian pengukuran kinerja di atas, dapat dilihat bahwa pengerjaan secara parallel hampir selalu dapat melampaui waktu pengerjaan *Radix Sort* dibandingkan dengan pengerjaan secara serial. Ini berarti algoritma parallel yang kami buat telah dapat melampaui *baseline* yang telah ditetapkan oleh pengerjaan secara serial.  
+
+Namun, dikarenakan dengan *overhead* fungsi *cudaMalloc* dan *cudaMemcpy* yang masing-masing berfungsi untuk melakukan alokasi dan melakukan *copy* pada *GPU device*, terkadang waktu eksekusi *Radix Sort* secara paralel dapat lebih lambat dibandingkan pengerjaan secara serial. Oleh karena itu, *cudaMalloc* dan *cudaMemcpy* merupakan sebab lambannya pengerjaan secara parallel menggunakan CUDA.
+
+## Authors
+
+* **Adylan Roaffa Ilmy** - *13516016*
+* **Ayrton Cyril Niwarlangga** - *13516019*
+
diff --git a/output/output.txt b/output/output.txt
new file mode 100644
index 0000000..f9c8882
--- /dev/null
+++ b/output/output.txt
@@ -0,0 +1,5000 @@
+130785
+451369
+502004
+782453
+905905
+1464457
+1699441
+1918970
+2929735
+3155148
+3934480
+4835725
+4971945
+6178255
+6713397
+7234428
+7478268
+7560926
+7746674
+9725128
+9872645
+10045452
+10204066
+10572718
+10817870
+11285212
+11734829
+11977659
+12619061
+12723954
+12849393
+13070841
+13681091
+13772692
+14278105
+15792685
+16739335
+16995134
+17355483
+17583975
+17826138
+17995445
+18344982
+19341120
+19612534
+19889097
+20394957
+20410364
+21073951
+21490742
+21616339
+21637539
+22053922
+22374629
+22598666
+23184616
+23473372
+24083920
+25067354
+25127564
+25493320
+25868789
+26225688
+26245812
+26274466
+26698047
+26723603
+26780560
+27025096
+27425858
+27488926
+27861170
+28221046
+28786263
+28872704
+29349159
+29558717
+29854336
+30276957
+30688177
+32952661
+34451521
+34548769
+34747976
+34996500
+35437956
+36612478
+36678912
+37273030
+37338844
+37517700
+37550913
+38805951
+39029632
+39224962
+39323993
+39360422
+39782135
+40481641
+40586967
+40813682
+40943416
+42009591
+42027295
+42676642
+43341345
+43683167
+43913340
+44189256
+44288163
+44800453
+45152365
+45859278
+47011017
+47400903
+47677238
+48392053
+48813519
+49326125
+49731690
+49951160
+49988739
+50026749
+50287519
+50425041
+50479185
+50561880
+51287315
+52033964
+52386793
+52666688
+53814719
+54435226
+56501871
+56601022
+56862654
+57329454
+57448255
+57699482
+58225509
+59089426
+59632396
+60657605
+60965134
+61052478
+61714325
+61920929
+62213715
+62475423
+62886538
+63191204
+63529451
+64002576
+64264323
+64289109
+65774350
+66177103
+66907289
+66954117
+68541564
+69414292
+70103006
+70512912
+70544692
+71534826
+71563532
+72347711
+72409360
+73599690
+74024203
+74830815
+75274446
+75868813
+75899805
+75957314
+75994881
+77039634
+77471552
+77504684
+77588602
+77623425
+78069134
+78316720
+78322346
+79637735
+79777366
+80428634
+80658810
+82604576
+83122252
+83313933
+83603639
+83710100
+83767575
+84003241
+84502165
+84790032
+85181974
+85525346
+85944508
+86802717
+87874095
+87915969
+88970659
+89172256
+89939310
+90138406
+90576446
+90690344
+91706404
+92775731
+93004996
+93144812
+93198636
+93433483
+94323772
+94500565
+95601552
+96300134
+96636471
+96778506
+97147802
+97753420
+98183160
+98230519
+98823234
+98938801
+99070174
+99085297
+99174651
+100215660
+100390131
+100536895
+100657593
+100915515
+101199949
+101457130
+101595696
+102477749
+102715070
+102800715
+102993784
+103127370
+103901326
+103916753
+104462461
+104821104
+105091533
+105137592
+106409008
+106632710
+106986016
+107001992
+107913144
+108118183
+108357419
+108935562
+109139950
+109456261
+110629904
+110897156
+110995227
+111086174
+112645290
+113477124
+114084764
+114609935
+114778123
+115032041
+115118025
+115976782
+116619357
+116693370
+117184433
+117310092
+117346352
+117388375
+117645211
+117794796
+117939999
+118329392
+118694239
+118786648
+118842160
+119267500
+119307894
+123277712
+123340593
+123600821
+124163065
+124314576
+124523762
+124575895
+126154470
+126519409
+126525873
+126839696
+127115889
+127284834
+127334045
+128201888
+128797650
+129274409
+129425319
+130101279
+132076444
+132616017
+132848697
+132924790
+133037470
+133535331
+133905206
+133971779
+134598929
+135090676
+136846812
+137526409
+137663635
+138687609
+138719942
+138915656
+138953968
+139249787
+139805503
+139873165
+140633217
+142057461
+142290440
+142375449
+142392583
+142977375
+143329271
+144139308
+144558201
+145060041
+145550236
+145985169
+146323177
+146962155
+147103664
+147167651
+147176229
+147714093
+148681689
+149363876
+149947357
+150262753
+151086829
+152033283
+152221451
+152322471
+153034515
+153718475
+154088559
+154275862
+154462315
+154619383
+155912420
+155951248
+156489314
+156625446
+156742996
+157224627
+157231719
+157325010
+157513909
+157675853
+159419879
+159685127
+160717067
+161131148
+161734944
+162320140
+162647507
+162671312
+162738605
+163562027
+163789196
+163838229
+164004869
+164066396
+164157916
+165404580
+165421943
+165725781
+165926479
+166977757
+167226007
+167623534
+168500369
+169297525
+169428233
+170303668
+170477407
+170831334
+171108569
+171757378
+171977894
+172775910
+173054509
+174138888
+174908145
+175068276
+175915193
+175960912
+176382590
+176701374
+176777010
+177035143
+177092431
+177244372
+177526144
+177548209
+178770696
+178790762
+178929872
+179183535
+179318336
+179422496
+181216851
+181296252
+181898844
+182328165
+183133285
+183416295
+183673264
+183722075
+185253989
+185650124
+185654308
+185747958
+186690587
+186896853
+187446252
+187544980
+187886158
+188359725
+188456682
+189220552
+189688598
+189960276
+190365191
+191524868
+191759206
+192289374
+193094496
+193321118
+193819056
+193836893
+194594196
+195316886
+195362785
+195380453
+195786909
+196368923
+198184065
+198445109
+198602266
+198739782
+198860494
+198932216
+200325449
+200455273
+200830489
+200999532
+201407195
+201480087
+202299768
+202547354
+202730394
+202812554
+203236991
+203265047
+203298612
+203925626
+204165511
+204918154
+206029401
+207060476
+207303175
+207401736
+207657312
+208425652
+208555266
+210319852
+210550448
+210682909
+211637748
+211826222
+211856860
+213025785
+213808217
+213824752
+213907301
+214892306
+214941581
+214962297
+215148032
+216567868
+217011365
+218521835
+219098315
+219339878
+219367296
+220381288
+220408506
+220524228
+221370031
+221829736
+222424683
+222502711
+222610875
+222782580
+223055005
+223082981
+223947950
+224397471
+225071789
+225254212
+225529330
+226563856
+226757842
+226899535
+228390305
+228615609
+229192365
+229401498
+229721458
+229931051
+230414096
+230647158
+230945032
+231092931
+231314360
+231500559
+231592255
+231639626
+231935645
+232059456
+232252737
+232443437
+232527388
+232933434
+233137637
+233292903
+233321646
+233630661
+233801343
+233950626
+234031385
+234067900
+235300463
+235529469
+237239141
+238139156
+238452451
+238816231
+238926995
+238952299
+239096314
+239326227
+239531239
+239644466
+239805194
+239866366
+240545763
+240787905
+241398144
+241472460
+242224042
+242635002
+242914323
+243192511
+243583531
+243712248
+245322697
+245548241
+245781158
+246328976
+247666656
+248421028
+249195581
+249231133
+249390678
+249510985
+250003870
+250284967
+250377680
+250829854
+251148247
+252070083
+252091542
+252262105
+252301141
+252363257
+253121723
+253717686
+253797538
+254030046
+254409900
+254411753
+254836789
+255660332
+256420623
+257194574
+257521472
+257863065
+258285480
+258439679
+258737125
+259135598
+259146639
+259198006
+259293529
+259357952
+261053081
+262049239
+263032327
+263457549
+263973810
+264027710
+264284399
+264539625
+264565150
+265135121
+265533972
+265868706
+266613623
+266737639
+267174045
+267507110
+267570231
+267701016
+267811901
+268055385
+268364024
+268405172
+269331231
+269505202
+269966225
+270054690
+271268057
+273284492
+273331550
+273839590
+273995155
+274166357
+274362984
+274837660
+274947734
+276015700
+276257257
+276402334
+276518013
+276641567
+276730204
+276948660
+277687373
+278111087
+278590439
+278984085
+279374519
+279435877
+279437365
+279575421
+280954385
+281690058
+282096954
+282804867
+282975806
+283697072
+283810560
+284314855
+284356950
+284725932
+286039452
+286133751
+286804158
+287140963
+287174798
+288555138
+289268263
+290742694
+290780485
+290817265
+290871667
+290978644
+291640764
+291893059
+292657338
+293122294
+293844556
+295711318
+296291666
+296323241
+296409860
+296494956
+296692719
+296843553
+296974338
+297140568
+297885628
+297907529
+297908758
+297937617
+298060000
+299171321
+299185173
+299557877
+300090350
+300352872
+300538280
+300906094
+302165952
+302949179
+303026618
+303035385
+303076983
+303466582
+304232155
+304286201
+304536600
+304549662
+304734826
+304921889
+305074824
+305356285
+306185189
+307601340
+308580249
+308609563
+309191931
+309737140
+310064259
+310253111
+310467773
+310973505
+311102785
+311779665
+312647368
+314288691
+314517354
+315215664
+315364480
+316034556
+316136850
+316261059
+316442663
+316684383
+317350181
+317413288
+318910202
+319093251
+319699737
+320482190
+321424995
+321697006
+321997894
+322284039
+322298145
+322728056
+323117769
+323233559
+323673167
+324388733
+324902803
+325544975
+325584196
+325717204
+326290083
+326324644
+326535410
+327303016
+327670138
+327775199
+327794399
+327895775
+329943619
+330569109
+330685958
+330857810
+331412424
+331689018
+331795668
+332280262
+333756454
+333895964
+334693434
+336750664
+336871830
+337509975
+337693362
+338165402
+340159332
+340322851
+340508732
+341395103
+341538757
+341608762
+342360102
+342675590
+342705319
+342745562
+342970153
+343294672
+343783639
+343921578
+344589140
+344604739
+344802054
+345409594
+346499850
+346971002
+347044502
+347654402
+348605996
+348640269
+348650515
+348905680
+350155082
+350192582
+350815834
+350854381
+351049902
+352711027
+353103052
+353491557
+353966225
+354531425
+354963229
+355585110
+355775171
+356333910
+357908221
+358390661
+359048432
+359192161
+359429182
+360781550
+360812894
+360949322
+361043953
+361204207
+361538845
+362053539
+362771899
+363010397
+363169724
+363617062
+363932359
+363948906
+364282637
+364377760
+364849348
+364875783
+365547208
+365898832
+366064047
+366368639
+366555750
+366779280
+367067392
+367099028
+367266832
+368075914
+369105585
+369341826
+369347980
+369709584
+369890486
+369927792
+370475452
+370836143
+371034641
+371072562
+372361480
+372512254
+373093399
+373383129
+374014001
+374333726
+375096976
+375429316
+376084747
+376236459
+376803326
+376814981
+376903854
+377100549
+377120524
+378915699
+380017334
+380199436
+380313867
+381533640
+382487232
+382500553
+383135651
+384005681
+384061445
+384666954
+384875719
+384894383
+385259504
+385288048
+385715415
+385776427
+386363646
+386987321
+388631665
+388739581
+389669751
+390473734
+390597166
+390702555
+391384533
+391782438
+391967041
+392479292
+392945702
+393282481
+393772380
+394395587
+394437313
+394499260
+394743456
+395786255
+396412347
+396513856
+396796121
+396920739
+397227413
+397310563
+398094931
+398273472
+398916188
+399644924
+399944256
+400167624
+400870072
+401385131
+401880162
+401985834
+402689755
+402754274
+402963447
+403109435
+403306647
+403344502
+404440656
+404569848
+404743109
+405204359
+406480015
+406848094
+407025110
+407748482
+408321077
+408840811
+410113977
+411171540
+411413115
+411519142
+411709784
+411860320
+412370564
+412470524
+415438368
+416459089
+416631857
+416862798
+417054221
+417324100
+417407098
+417736024
+417745761
+417769952
+418133553
+418317974
+419065814
+419254389
+420064281
+420721142
+420965332
+421105189
+421213922
+421396218
+421613537
+421739606
+421855146
+422554101
+423332002
+423383811
+423634950
+424778292
+424812449
+424875127
+426319058
+427214417
+429266101
+429705073
+430184618
+431601337
+431969517
+432859066
+433009678
+433028787
+433682423
+433805893
+433818318
+433941615
+434178606
+435037007
+435942913
+436125506
+436395921
+437148834
+437161524
+437845752
+437984916
+438823489
+439328674
+439879655
+441116461
+441454018
+441977031
+442805971
+443521566
+444020655
+444423872
+444516691
+445392935
+445691519
+445706377
+446261287
+446623283
+446842547
+446984851
+447046072
+448340827
+448433655
+448473334
+448553663
+448839070
+449029014
+449204030
+449449892
+449700117
+450173633
+450617011
+451452263
+451808874
+452125995
+452153300
+452496673
+453552880
+454031710
+455055043
+455393670
+457217048
+457432951
+457473296
+458015601
+458309198
+458833582
+459318498
+460091233
+460215366
+460386868
+460542005
+461650468
+462594944
+462821303
+463279871
+463290572
+463530524
+464423753
+464735151
+465507797
+465584679
+465884171
+466110737
+466190892
+466836026
+466837458
+467435685
+467576322
+467775525
+468136246
+468153036
+468282263
+468837667
+469027842
+471432351
+471451806
+471468949
+471732503
+471803669
+471959967
+472403784
+472442439
+472505013
+473070123
+473453782
+473565982
+473805008
+474186709
+475243167
+476513886
+477549712
+477628135
+477952022
+478539620
+479050261
+480288418
+480355128
+481945795
+482107747
+482644644
+482905082
+483309712
+483667338
+483671565
+484614009
+484719038
+485232017
+485712142
+485755217
+485784155
+487049345
+487577833
+488436412
+489109050
+489579565
+489869984
+489899453
+490620301
+490842369
+490882829
+491858813
+491859947
+492021360
+493184959
+493734565
+494021825
+494235952
+494468787
+495118194
+496265370
+496329343
+496714906
+497058712
+497398685
+497463402
+497538717
+498504869
+498949984
+499093802
+499975181
+500466683
+501386783
+501709849
+501775682
+501852137
+502026515
+502060851
+502134240
+503636891
+505251027
+505697837
+507513459
+507727665
+508549246
+508651838
+508934850
+509518999
+509564617
+509695253
+509961950
+509966702
+510400168
+511379465
+511460629
+511571555
+512002025
+512536916
+512762443
+513883048
+514020122
+514417726
+514952635
+515721270
+516576296
+517088714
+518004616
+518577173
+518620385
+519022405
+520290380
+520562296
+520576283
+521952550
+522756386
+522994835
+523003041
+523051163
+523417208
+523491004
+523842722
+524015981
+524098159
+524657977
+525115169
+525410547
+525482492
+525868134
+526034661
+526132718
+526143014
+526305796
+526420583
+526638318
+526816412
+527157072
+527506618
+527671774
+527735629
+527779688
+528044493
+528330494
+529479540
+529571299
+530615078
+530877925
+531202640
+531932203
+532751634
+534204878
+534243853
+535927152
+535939952
+536130276
+536890209
+536894362
+538661688
+539421477
+539737307
+540209777
+540462117
+540917290
+541600764
+541844417
+541847557
+541898674
+542485494
+542709117
+542923030
+542951615
+543068464
+543658274
+543675571
+544601367
+544647906
+544773921
+544916085
+545280349
+545405158
+545521640
+545618198
+546237729
+547818898
+548053978
+548561944
+549030887
+549047943
+550422592
+550510307
+551078534
+551314514
+551387565
+552002842
+552043652
+552592413
+552679601
+553358414
+553374866
+554070933
+554085233
+554113458
+555411554
+555790549
+556257517
+556543606
+556716795
+557569611
+557743524
+558011604
+558132246
+558657351
+558661686
+558899963
+559234190
+559525805
+559800125
+559847118
+560746711
+561080014
+561080280
+561373774
+562180806
+562367865
+562436887
+562551172
+562949043
+563116763
+564097553
+564169864
+564334112
+564571175
+564675354
+565915897
+566374179
+566624769
+566782959
+566948125
+567599525
+568212275
+570632478
+570994924
+571009241
+571225089
+572835686
+574219037
+574313341
+574315217
+574710756
+574714483
+574965667
+575171435
+575420047
+575673319
+576087305
+577206124
+577211326
+578731240
+579135673
+579733916
+579857363
+580398011
+580547400
+580860425
+580930100
+581766457
+582107146
+582344077
+583455384
+583827951
+583835743
+585254117
+585543258
+585936316
+586234182
+586262148
+587511667
+587527271
+587994482
+588110816
+588636240
+588639892
+589909635
+590665489
+591627539
+592017831
+592220075
+592559511
+592599995
+592732486
+594080647
+594100118
+594215145
+595156067
+595388034
+595476403
+595966933
+596197787
+596743860
+596802623
+597158339
+597967996
+598085309
+598440980
+598940462
+599280991
+599335325
+599667622
+600250327
+600400790
+600433840
+600884498
+601449893
+601823342
+602001506
+602575535
+602850891
+602958699
+603657430
+604108837
+604529060
+605234439
+605505869
+605788980
+606167946
+607054881
+607209033
+607315779
+607750142
+608325593
+608328176
+608486391
+608525337
+608834035
+609036954
+609561404
+609937802
+610133269
+610829107
+611400523
+611797651
+612594625
+613352587
+613688369
+614578079
+615149284
+615693448
+615787172
+615954564
+617445395
+617592676
+618093810
+618398226
+618536377
+619059212
+619707686
+619778310
+619790087
+620290896
+620297978
+621028979
+621668380
+621781130
+622427563
+622975202
+623068263
+623419343
+624746411
+624966248
+625313278
+626236559
+626434905
+626481440
+626577865
+627333071
+627679656
+627766758
+628504624
+628588498
+628801548
+629314007
+629768273
+632121747
+633106973
+633347188
+633787735
+633845806
+634202694
+634555703
+634581457
+635216686
+636001721
+637307742
+637437822
+638333754
+639149358
+640646257
+641356319
+641583412
+641793719
+642121666
+642329795
+642678582
+643624632
+643679949
+643759871
+644079358
+644580225
+644984758
+645277060
+646461043
+646654621
+647028471
+647324379
+647455987
+647611157
+647736147
+648089058
+648100067
+648957618
+649384152
+651362805
+651677827
+652408471
+652713009
+653245008
+653317058
+654750537
+655036986
+655106931
+655441884
+655791336
+655815847
+656078809
+656334750
+657024287
+657035538
+657790897
+658537283
+659266856
+659572434
+659992940
+660120677
+660192199
+660560666
+660631398
+660649794
+661161499
+661474322
+661999238
+662410458
+662963040
+662995983
+663174797
+663330960
+663478362
+663498589
+663538425
+664346617
+664619344
+665746612
+665771573
+666243385
+667336251
+667372688
+667569316
+668519452
+668602407
+669029792
+669431474
+669682426
+669865055
+670194981
+670436672
+670461275
+670629286
+671489262
+671775724
+673066515
+673118072
+673757657
+673861890
+674096432
+674324787
+675269650
+675450491
+676220158
+676263728
+676497039
+676527531
+677020737
+677280587
+677942744
+680045391
+680567131
+680663318
+680687439
+681120674
+681350814
+681574533
+681889147
+683067257
+683600460
+683745485
+684799171
+684861591
+685062976
+685824457
+685951958
+686193871
+686410259
+687012921
+687409987
+687746748
+688241508
+688263945
+688891111
+689456682
+689784237
+690116910
+690205030
+690626346
+690705361
+691114009
+691583795
+691881151
+691954063
+692238496
+692541571
+692815693
+693016592
+693736541
+694330718
+694816854
+694883798
+695315066
+695844703
+696885055
+698907037
+699384102
+699518500
+699809374
+700731291
+700832095
+701993791
+702158866
+702211568
+702796509
+703171407
+703194116
+703382849
+704269658
+704764134
+704800443
+704973189
+705193307
+705434331
+705482310
+705859247
+706034307
+706062775
+706576914
+706929168
+708197414
+708981844
+709297191
+709515979
+710181936
+710637378
+711466549
+711618776
+711926100
+711934479
+711967155
+711993290
+712188977
+713465285
+713471068
+713640618
+713658968
+713750940
+714580550
+714943035
+715745377
+716856325
+716967180
+717164599
+717180661
+717271933
+717704153
+718024154
+718289973
+718319113
+718582561
+719259688
+720103311
+720268528
+720976997
+721045534
+721141814
+721596826
+722051221
+722188441
+722296251
+722463510
+723379906
+724294118
+725117969
+725452285
+725791187
+727279645
+727320478
+727367212
+728040835
+728381106
+728433300
+729121329
+729316560
+729448628
+729772014
+730993608
+731186021
+731488551
+731883422
+731955542
+733038432
+733268553
+733823102
+733904937
+733970333
+735392941
+735815088
+736285606
+736465712
+736700309
+736720261
+736911331
+737329988
+737493885
+737634552
+737683519
+738016655
+738158199
+738222973
+738676589
+739038249
+739897458
+740643295
+742915409
+742920153
+743488859
+743618251
+744149392
+744250881
+745127392
+745583537
+745588668
+745595499
+746047348
+746630976
+747013682
+747088541
+747400826
+747671862
+748468917
+748585405
+748964411
+749106236
+749604362
+750247342
+750363474
+750663852
+751620774
+752102970
+752353794
+752808297
+753783242
+755210661
+755372708
+756415124
+756435896
+756992740
+758451766
+758474094
+760014302
+760470189
+760505545
+760731889
+761652987
+761928707
+762353591
+762935395
+763396347
+763811960
+763935952
+763984915
+764042069
+764554832
+765354039
+765564476
+766284732
+766378154
+767108783
+768187296
+768823901
+769066548
+769457727
+769728263
+770015312
+770161457
+770306777
+770490347
+770699370
+770776177
+771169227
+771417348
+771518646
+772373518
+773096782
+773132136
+773822908
+774170145
+774189136
+774460846
+775130427
+775181991
+775438800
+775587037
+776566902
+776689599
+776932313
+776977004
+777104589
+778077847
+778144258
+778603898
+778659874
+778859956
+779322984
+779524360
+781491482
+782025134
+782189189
+782249257
+783262264
+783448407
+784126442
+784127270
+784530752
+784787534
+785210953
+785318436
+785935590
+786061541
+786194290
+786696393
+786874848
+786983325
+787270635
+787605992
+788038278
+788104881
+788310993
+788440137
+788681410
+788744808
+788800690
+789272818
+791071426
+791569246
+791941332
+792247970
+792256933
+792748502
+793592892
+794161230
+794299444
+796070219
+796090552
+796245659
+796250006
+796477741
+796549040
+797199735
+797552562
+797573203
+797818816
+798676284
+799244278
+800368183
+800985409
+801021920
+801242883
+801659046
+801916294
+803330454
+804067375
+804260552
+804506791
+804623772
+804846476
+805452821
+805705871
+806083058
+806972971
+807243241
+807377715
+808187252
+808836109
+808874468
+808984562
+809579721
+809807200
+810211462
+810395182
+811124033
+812302744
+813692893
+813948140
+815223154
+815538590
+816874433
+816920461
+817292250
+817466042
+817658106
+818218632
+818799796
+818807486
+821637837
+821657284
+821935231
+822112212
+822257254
+822412279
+823010950
+823321378
+823674466
+823806082
+823933458
+824127185
+824148447
+824349037
+824412007
+824476652
+824801953
+825191165
+825766700
+825843879
+826364942
+826624567
+827021738
+828056704
+829061279
+829584246
+829888695
+830084642
+830687475
+830780433
+830969474
+831138367
+831280695
+831770530
+831927752
+832203977
+832261316
+832604307
+832640017
+832690641
+833207912
+833596587
+833783550
+833917140
+834410305
+834467442
+835279585
+835474012
+835826038
+836002233
+836185491
+836856352
+838469346
+838668025
+838816646
+839450830
+839801429
+840778392
+841947122
+842218427
+842256804
+842400216
+842758690
+843423237
+843507289
+843884886
+844250666
+844325286
+845542871
+845662724
+845719474
+845787048
+845919400
+846880511
+846946980
+847166627
+847273825
+847791657
+847996663
+848228106
+849139976
+850801315
+851309931
+851862706
+852224777
+852615415
+853603755
+853721667
+854152622
+854262330
+854265428
+854545117
+856193888
+856758929
+857308910
+857895014
+858332830
+858798896
+858905762
+859409603
+859440005
+859585526
+859658316
+860181962
+860669150
+860846767
+861244801
+861952175
+862024356
+862147500
+862755113
+863105807
+863245501
+863445567
+863657978
+863932476
+863973283
+864669182
+864773970
+865482594
+866221799
+866618541
+867763185
+868586958
+868777869
+868912079
+869134304
+869201064
+869943645
+870916025
+871106145
+871235422
+871249879
+871399091
+872310681
+872822082
+873398211
+873857056
+873920170
+874153004
+874329839
+876311930
+876392094
+876576250
+877499033
+877699200
+878067931
+878110743
+879593393
+879677523
+879791861
+880561087
+880953879
+881229375
+881615148
+883903061
+884284099
+884692806
+885095188
+885140126
+885501659
+885520637
+886351791
+886615847
+886737985
+886984397
+888210078
+888397042
+889319035
+889907007
+890129800
+891060271
+891244698
+891949106
+893464287
+893869217
+894228049
+894526626
+894877961
+896004628
+896245503
+896312145
+896459833
+897534231
+898068523
+898865299
+900633894
+900902736
+900922944
+901633622
+902319375
+902349396
+902380894
+902531215
+903687005
+904144909
+904524510
+905880013
+906113243
+906207888
+906909240
+907542862
+907767273
+907940255
+908475140
+908927009
+909594165
+910831637
+910918632
+910944145
+910974730
+911112670
+912416444
+912521444
+913702297
+913718441
+913910541
+914261671
+915075353
+915835172
+916007689
+916060944
+918207744
+918547244
+918725464
+918903292
+919526743
+919849925
+920395261
+920513838
+920614314
+921002765
+921489445
+922492113
+922841453
+922945374
+922985928
+923014160
+923231840
+924584419
+924668768
+924696817
+924803583
+924990823
+925151328
+925686466
+925696100
+926437410
+926736830
+928003738
+928217600
+928253788
+928364431
+928782620
+928897787
+929440022
+929599426
+929692543
+930042894
+930350734
+930892884
+931514124
+932092652
+932162454
+932709784
+932747424
+932826724
+933658421
+933919065
+934248280
+934823036
+934984232
+935473415
+936425151
+937122748
+937568800
+938088604
+938498884
+939009080
+939158082
+939386815
+939829128
+939977175
+940272278
+940297206
+940520745
+940549850
+940640720
+941126844
+941582782
+942016928
+942331764
+942374902
+942839608
+944353394
+945050433
+945152441
+945297706
+945338172
+945745584
+946036740
+946129670
+946597406
+946873143
+947053314
+947893877
+947933443
+948149434
+948700961
+949007959
+949400578
+950138729
+950236130
+950699394
+951167033
+951366604
+951732277
+952801374
+953364219
+953936840
+954158063
+954324938
+954454148
+955258910
+955816774
+955830565
+955902050
+956173278
+957517798
+959046782
+959533961
+959767665
+960165653
+960708196
+960956111
+961585581
+962535489
+962599520
+962762332
+963361456
+964248308
+964351911
+965734983
+965965444
+966381191
+966450475
+967034686
+967683013
+967706650
+969333032
+969358181
+969369786
+969471810
+969885070
+970216351
+971358788
+973216374
+973536806
+973598896
+973723825
+974000196
+974666688
+974878491
+975408501
+975510255
+975897935
+976586569
+976663438
+976978749
+978022408
+979026116
+980233913
+980591712
+981227348
+981593533
+981764728
+981941310
+982166937
+983061146
+983141727
+983421073
+983696319
+985061671
+985357253
+985374377
+985418226
+985473470
+985527201
+985768717
+986194262
+986838172
+987564826
+987605311
+988230730
+989510175
+989737119
+990081609
+990151439
+991245076
+991257245
+991936898
+992383024
+992742163
+992874694
+993562357
+994018753
+994287022
+994604695
+994654548
+994854661
+996111692
+996240934
+996866453
+997082757
+997397977
+997556733
+998123090
+999044302
+999091627
+1000266560
+1000717865
+1001535284
+1003289706
+1003386310
+1003479455
+1003965028
+1004420573
+1005109112
+1005122472
+1005351891
+1005753061
+1005830251
+1006420519
+1006600584
+1007660176
+1008970563
+1008995282
+1011302013
+1011500146
+1011539802
+1012021363
+1012967130
+1013403857
+1014202673
+1014442072
+1014662609
+1014730052
+1014769266
+1015062057
+1015418659
+1015681374
+1015808080
+1015939255
+1016047759
+1016965354
+1017842936
+1017991854
+1018340765
+1018392194
+1019618768
+1020147868
+1020293583
+1020611652
+1020949381
+1021372878
+1021928120
+1022232204
+1022826216
+1023010628
+1023421969
+1023608099
+1024565053
+1026029225
+1026151029
+1026309562
+1026637583
+1026671081
+1027392292
+1028013710
+1029135037
+1029135769
+1030168017
+1030627345
+1030708474
+1032438653
+1032676624
+1033646084
+1034134797
+1034328674
+1034571278
+1034648376
+1035053309
+1036832025
+1037509238
+1037915284
+1038143520
+1038239651
+1038602647
+1038603208
+1038808070
+1039180233
+1039626256
+1039968358
+1040268098
+1040721343
+1041206487
+1041959971
+1042099789
+1042937982
+1043204475
+1043875100
+1044671379
+1044852442
+1045647915
+1047003847
+1047452010
+1047664362
+1047721883
+1047998696
+1048715672
+1048881964
+1049173198
+1049499341
+1049790948
+1050055488
+1050224385
+1050359285
+1051746717
+1051891711
+1052741026
+1052809749
+1053401992
+1054137674
+1054220281
+1055083390
+1055292578
+1055398678
+1055476298
+1056219868
+1057127663
+1057279051
+1057621686
+1057925991
+1058008798
+1058742204
+1060737961
+1064364042
+1064575796
+1065325307
+1065692631
+1066079052
+1066239432
+1067014486
+1068042721
+1068515929
+1068547311
+1068762711
+1068989959
+1069148189
+1069432124
+1069549236
+1070301109
+1070496957
+1070618913
+1070851433
+1071840441
+1072512360
+1073447571
+1073484443
+1073699058
+1074279919
+1074625295
+1074845815
+1075428377
+1075606392
+1076104675
+1076888855
+1076930249
+1079434688
+1079686843
+1079967247
+1079994033
+1080345797
+1080346832
+1080357157
+1080789325
+1081705809
+1082356324
+1082799666
+1083022591
+1083120904
+1083259070
+1084545480
+1084781252
+1084864109
+1086266683
+1086317318
+1086734310
+1086843923
+1087119915
+1087311210
+1087434179
+1087620178
+1087801202
+1088231781
+1088398556
+1090393339
+1091082771
+1091095262
+1091923865
+1092140767
+1092501442
+1092646847
+1092693074
+1092974753
+1092974835
+1093183435
+1093499933
+1093743692
+1095153509
+1095429885
+1095477296
+1096251985
+1097138753
+1097139485
+1097206264
+1097471261
+1097954478
+1098384267
+1098428012
+1098622200
+1098762990
+1099626907
+1100727431
+1101196552
+1101266849
+1101978683
+1102007410
+1102227925
+1102228647
+1102404177
+1102406466
+1102551082
+1102888500
+1103044768
+1103214530
+1103557336
+1105252276
+1106946281
+1107540702
+1107618460
+1108291878
+1108471475
+1108785367
+1109632642
+1109715022
+1109947110
+1110250754
+1110734299
+1111219745
+1111304283
+1112770637
+1112866629
+1112959674
+1113132162
+1113234149
+1113345603
+1113691819
+1114160301
+1114273128
+1114311520
+1115320183
+1115971984
+1116028112
+1116087289
+1116202907
+1116806735
+1117121674
+1117500199
+1117628143
+1117701773
+1117812152
+1117928234
+1118360713
+1118590156
+1120344227
+1120379667
+1121819313
+1121904005
+1121995478
+1122099757
+1123004067
+1123316587
+1123363797
+1123687797
+1123732030
+1124206279
+1124775605
+1125584582
+1126012697
+1126044669
+1126279754
+1126455852
+1126634011
+1126888838
+1127310935
+1128055983
+1128773207
+1129623572
+1129683340
+1131113938
+1131482647
+1132354849
+1132905563
+1133495576
+1133684927
+1133785574
+1133908365
+1134300407
+1134314354
+1134360646
+1134431419
+1135370887
+1135531769
+1135622366
+1135984857
+1136256974
+1136501021
+1137260485
+1138164026
+1138339650
+1138352051
+1138743538
+1139577982
+1139914167
+1139953975
+1140207169
+1140213430
+1140795769
+1140925446
+1140950272
+1141083386
+1141445750
+1141575488
+1142331284
+1142359890
+1143180092
+1143216976
+1144424404
+1145882291
+1146197815
+1146216246
+1146294261
+1147232188
+1147315896
+1148129795
+1148563452
+1148770457
+1148809803
+1150552491
+1151261682
+1151473653
+1152058682
+1152615647
+1152773680
+1152937384
+1152964711
+1152972542
+1153271652
+1153829659
+1155607130
+1156133891
+1156504018
+1156757397
+1156933541
+1156936554
+1157073625
+1157138475
+1157178955
+1158142848
+1158410082
+1158927239
+1159369669
+1160186554
+1160226468
+1161141016
+1161141924
+1161437467
+1161491155
+1161742074
+1162850071
+1163365372
+1163367198
+1163510103
+1163524533
+1163864639
+1164709435
+1164761228
+1165189117
+1165261891
+1165830467
+1166212832
+1166405508
+1167488005
+1169564874
+1169573095
+1169786757
+1169892175
+1170029643
+1170106294
+1170358938
+1170479437
+1171024357
+1171894119
+1172047197
+1172536440
+1173948844
+1175194597
+1175572741
+1176649595
+1177541667
+1178088223
+1179459932
+1179609743
+1179688016
+1179931028
+1180296623
+1180703268
+1181360818
+1181810825
+1181818452
+1182117072
+1182320456
+1183227621
+1183348505
+1183522473
+1185049664
+1186000542
+1186081026
+1186922443
+1187175823
+1187298559
+1187334103
+1187517391
+1188526372
+1188816822
+1189086384
+1189290523
+1190427613
+1190798700
+1191263023
+1191291887
+1191590999
+1192008875
+1192110073
+1192448697
+1192544001
+1193094521
+1193156820
+1193276503
+1193539579
+1194004570
+1194068802
+1194961354
+1195033773
+1195576242
+1196490937
+1197110148
+1197304500
+1197336764
+1197719118
+1197726505
+1198409161
+1198445936
+1199644508
+1199660096
+1199690027
+1200205131
+1201379040
+1201942282
+1202389591
+1202642932
+1203258264
+1203401171
+1204396528
+1204426701
+1204444898
+1205496084
+1205712678
+1205834464
+1206177224
+1206354026
+1206940796
+1208352594
+1208692212
+1209485202
+1210188958
+1211152898
+1211321723
+1211400209
+1211583980
+1211750531
+1212066272
+1214172575
+1214579654
+1215324576
+1215963747
+1216329106
+1216869855
+1217504414
+1217590391
+1217637671
+1218188069
+1218195949
+1218283517
+1218304924
+1218617701
+1218993311
+1219180565
+1219288775
+1220122975
+1220160065
+1220869344
+1220995559
+1221769484
+1222224373
+1222651376
+1222680637
+1223295239
+1223876121
+1223951017
+1224235171
+1224327401
+1224565081
+1224980718
+1226335306
+1226343431
+1226421543
+1227228561
+1228111138
+1228179574
+1228807465
+1229335707
+1229778942
+1230059006
+1230191560
+1230325615
+1230749820
+1230774559
+1231040873
+1231163045
+1232030458
+1232300232
+1232843059
+1233356699
+1234004276
+1234893708
+1235741937
+1236646528
+1237110457
+1237305452
+1237519010
+1237643908
+1237780491
+1237942506
+1237996543
+1238776815
+1239159047
+1239630040
+1240282159
+1240616767
+1240722836
+1241534992
+1241561498
+1241840911
+1242475446
+1242484834
+1242592979
+1243283147
+1243685673
+1243810591
+1244300139
+1246152126
+1246485907
+1246499424
+1246520860
+1246553655
+1248833045
+1248972008
+1249432282
+1250597544
+1251136707
+1251293583
+1251601520
+1251619252
+1251870916
+1252401781
+1252851015
+1253201606
+1253259425
+1253678610
+1253756402
+1254213047
+1254493022
+1254961543
+1255275736
+1256310157
+1256661329
+1256729824
+1256870131
+1256967804
+1257515622
+1257604200
+1259192236
+1260933986
+1261248745
+1261290932
+1261609242
+1262211218
+1262409479
+1263893897
+1264373737
+1264831149
+1264954645
+1265142662
+1265210603
+1265270336
+1266354696
+1267204086
+1267909135
+1269579863
+1269592240
+1269904367
+1270240439
+1270677022
+1271204838
+1271293045
+1271820084
+1271928879
+1272015101
+1272069244
+1272128404
+1272463518
+1273447405
+1273526524
+1274230735
+1274375494
+1274679776
+1274905492
+1274936529
+1275538530
+1275837410
+1276025919
+1277247426
+1277727655
+1278368930
+1278390925
+1278933294
+1279124025
+1279178225
+1279623505
+1281296108
+1281319329
+1281759554
+1281962235
+1282249287
+1282694527
+1283908045
+1284417298
+1284726410
+1285209786
+1285809750
+1285943579
+1286068735
+1286863199
+1287057208
+1287273616
+1287459338
+1287758831
+1287845714
+1287963341
+1288275672
+1288464837
+1288522491
+1288546770
+1290178599
+1290240447
+1291102316
+1292541083
+1293966253
+1294571985
+1295405824
+1295416569
+1295418421
+1295750523
+1295959461
+1296015846
+1296057611
+1296103603
+1296355252
+1296789436
+1297279118
+1297612177
+1297914897
+1298269648
+1298424718
+1299032923
+1299091772
+1300024831
+1300287705
+1300926604
+1301279651
+1302117231
+1303669803
+1304123641
+1304415030
+1304629076
+1305936117
+1306017579
+1306101704
+1306148671
+1306612951
+1306874466
+1307684763
+1309917261
+1310477429
+1311451297
+1312435478
+1312597834
+1313299123
+1313601104
+1314256876
+1314369374
+1314457898
+1314577815
+1314883576
+1315284972
+1316042816
+1316134962
+1316281365
+1317008279
+1317110603
+1317167466
+1317685412
+1318144766
+1318348582
+1318527110
+1318715843
+1318790523
+1318939896
+1319548576
+1319993196
+1320502263
+1320772351
+1320805513
+1320867553
+1321194025
+1322417555
+1323050632
+1324460942
+1324479039
+1324751634
+1324867594
+1327209657
+1328640044
+1328692608
+1329177086
+1329541613
+1329751405
+1330826317
+1331026655
+1331081163
+1331297109
+1331503387
+1332542213
+1332584730
+1334870967
+1335116193
+1335424890
+1336272110
+1336361382
+1336586477
+1337020325
+1337271115
+1337768838
+1337819504
+1339190157
+1340545419
+1340733735
+1341072107
+1341520169
+1341535252
+1342432502
+1342857841
+1343465464
+1343775781
+1343999744
+1345989583
+1347768191
+1347821451
+1348160326
+1350849860
+1351443356
+1351508473
+1351750364
+1352545131
+1353065137
+1353068010
+1353631290
+1353653943
+1354615964
+1354635935
+1355148118
+1355555649
+1355631490
+1357938490
+1358398488
+1359144267
+1359660698
+1360161993
+1360681445
+1360713969
+1361182987
+1361398842
+1362096357
+1362133292
+1362321523
+1362649807
+1363836739
+1364154230
+1364596368
+1365030732
+1365676841
+1365980647
+1366132258
+1366222411
+1366273005
+1367169393
+1367444643
+1367697683
+1368293482
+1368527320
+1368753050
+1369551529
+1369554260
+1370360624
+1370363575
+1370567981
+1370962599
+1370973073
+1371175643
+1371836135
+1371861247
+1371977391
+1371993875
+1372032237
+1372549295
+1373050660
+1373130585
+1373237767
+1373520832
+1373632764
+1374151009
+1375624187
+1375723777
+1375885479
+1377291031
+1377472507
+1377483074
+1378004369
+1378143851
+1378278311
+1378391009
+1378456337
+1379444348
+1379622013
+1379859808
+1379904750
+1380179359
+1380405917
+1380749430
+1381388823
+1382472329
+1382496058
+1382645639
+1383123095
+1383372543
+1383427877
+1384261801
+1384925669
+1386477070
+1386582514
+1386700061
+1387299312
+1387907574
+1388711607
+1389130569
+1390281846
+1390652826
+1390878516
+1391898914
+1392052586
+1392401200
+1392789176
+1393032431
+1394107268
+1394327923
+1394646204
+1394659336
+1394750550
+1394846645
+1395142909
+1395499526
+1395718127
+1396305676
+1396672791
+1397766112
+1397810463
+1398109054
+1398200300
+1398264341
+1398281442
+1398323421
+1399244424
+1400060395
+1400371467
+1400411686
+1400623222
+1400995069
+1401042204
+1401571228
+1401806711
+1402001793
+1402889299
+1403474407
+1403845175
+1403906083
+1403975471
+1404053364
+1404566355
+1404744627
+1405807063
+1405825309
+1405844078
+1405880738
+1406468936
+1407029090
+1407606526
+1407697808
+1407855123
+1407942962
+1408242665
+1408694034
+1409051063
+1409339134
+1409609924
+1409824959
+1410413292
+1410833306
+1411800388
+1412520083
+1412612802
+1413107483
+1413277809
+1413540026
+1413716324
+1413718179
+1414031964
+1414080261
+1415277633
+1415402040
+1415872429
+1417408253
+1417726950
+1418040717
+1418321500
+1418468058
+1418606187
+1418681661
+1419574914
+1420483250
+1420555786
+1420752777
+1420849331
+1420858076
+1421115860
+1421755527
+1422230539
+1422449029
+1423244566
+1423509394
+1423905300
+1424278890
+1424451800
+1424866652
+1426350543
+1426792910
+1427714219
+1427753957
+1427892507
+1428318238
+1428703372
+1429616774
+1431413867
+1431823014
+1432422232
+1432943730
+1433227321
+1433380916
+1433430731
+1435664771
+1435897252
+1436413936
+1436785927
+1437195636
+1437494397
+1437776216
+1438096422
+1438196246
+1438527021
+1438921633
+1439186832
+1439270535
+1439361996
+1439922786
+1440190080
+1440251367
+1440269322
+1440730796
+1440913702
+1440978580
+1442020786
+1442035564
+1442063280
+1443088571
+1443394850
+1445253514
+1445372823
+1446051187
+1446300174
+1446663920
+1447416218
+1447707328
+1447931178
+1447936720
+1448074039
+1448698871
+1449166623
+1449505864
+1449762806
+1449911337
+1449968169
+1450003993
+1450060931
+1450188952
+1450328124
+1450414967
+1451152680
+1452286978
+1452315703
+1452327929
+1452787292
+1453706559
+1454046848
+1454147128
+1454428315
+1455053111
+1455282082
+1455349047
+1456523795
+1456534413
+1457525159
+1459308083
+1459609402
+1460065656
+1460519224
+1460731383
+1460811963
+1460904128
+1460983677
+1461222397
+1461256132
+1462903673
+1463212256
+1463451920
+1463709953
+1464353694
+1465587892
+1465633913
+1465854394
+1466261722
+1467430721
+1467439978
+1469074142
+1469358803
+1469407541
+1469704001
+1470403450
+1471610784
+1471612916
+1471849541
+1472069359
+1473962240
+1474229018
+1474973188
+1474985679
+1475570247
+1476720748
+1478075545
+1478192291
+1478255091
+1478583671
+1478833648
+1479282989
+1479293955
+1479333735
+1479489357
+1480494531
+1481511819
+1481893717
+1482467304
+1482489064
+1483632586
+1484734418
+1486291345
+1486459799
+1487207888
+1487424531
+1487448866
+1487710970
+1488195303
+1488465025
+1488878204
+1489856203
+1490801508
+1490941901
+1491248307
+1491586535
+1491790677
+1491821328
+1492414344
+1492794111
+1492799059
+1493103516
+1493278716
+1493922063
+1494159304
+1494203009
+1494270007
+1494334454
+1494337215
+1495564853
+1495696031
+1496041547
+1496995031
+1497274586
+1499930905
+1500100753
+1500907704
+1501253003
+1501467401
+1501629864
+1501840524
+1502398960
+1503275341
+1503284545
+1503596591
+1503952611
+1504618601
+1504982016
+1505054937
+1505620267
+1506807780
+1507176430
+1507278565
+1508946686
+1509050434
+1509408203
+1509638026
+1509644439
+1509758735
+1510554155
+1510831191
+1511259942
+1512504538
+1512973172
+1513179131
+1513730160
+1513796476
+1513903285
+1513924815
+1514086119
+1514477934
+1515501023
+1515761366
+1516441295
+1516760093
+1517193078
+1517334307
+1517499717
+1518222117
+1518251780
+1518267452
+1518715466
+1519132691
+1519767115
+1520069584
+1520291061
+1520635139
+1520640317
+1520953109
+1520981701
+1521249740
+1521276875
+1521406902
+1522080772
+1522295250
+1523671356
+1523875640
+1524293803
+1524448144
+1524602840
+1524903660
+1524929137
+1525033237
+1525140446
+1525210961
+1525725828
+1526541458
+1526585925
+1526977635
+1527465638
+1527688676
+1527825702
+1528017317
+1529061754
+1529337799
+1529954922
+1530221024
+1530731061
+1531392118
+1531613236
+1531664003
+1531865138
+1532397339
+1532591085
+1533109193
+1534328604
+1535016435
+1535112248
+1535130676
+1535555463
+1535966417
+1536481432
+1537162781
+1537963263
+1538252821
+1539097437
+1540594368
+1541948528
+1542702576
+1543713665
+1544916794
+1544960794
+1545470611
+1545572814
+1545660560
+1546154631
+1546497642
+1546521207
+1546759770
+1547633130
+1547777065
+1548125467
+1548293334
+1548524078
+1549330908
+1549431732
+1549526284
+1549607934
+1549799363
+1550832084
+1551391721
+1551455029
+1551639489
+1553954869
+1554045808
+1554799690
+1557252236
+1558494726
+1558539747
+1559151702
+1560885090
+1561464788
+1561873678
+1562309331
+1563873846
+1563980603
+1565964581
+1566775478
+1568173821
+1568837091
+1569218287
+1569229615
+1569763997
+1570152544
+1570463818
+1570601757
+1570716822
+1571369753
+1571439616
+1571459161
+1571645445
+1571722384
+1573585859
+1573715069
+1573732893
+1573870156
+1574360985
+1574677301
+1574890448
+1575007245
+1575162676
+1575454908
+1576352370
+1576391672
+1576489639
+1576540059
+1576741125
+1577076922
+1578162247
+1578838178
+1579937204
+1580410100
+1581294373
+1581370573
+1581610401
+1581914937
+1581932891
+1582870828
+1583106605
+1583688456
+1583739266
+1583906895
+1584854395
+1584914180
+1585478510
+1585797530
+1585882836
+1585940671
+1586224034
+1587103315
+1587182360
+1587638818
+1587670151
+1588731777
+1590148524
+1591041811
+1591050034
+1591277657
+1591370511
+1591535966
+1591629519
+1592008864
+1592377236
+1593161478
+1593554343
+1593776608
+1593939019
+1594190241
+1594308215
+1594568611
+1594822092
+1595137572
+1595299085
+1595560392
+1595898322
+1596135861
+1596330015
+1596338545
+1596510207
+1596711996
+1596889353
+1596895256
+1597034039
+1597450914
+1597564621
+1597658480
+1598319969
+1598672590
+1599042640
+1599395952
+1599853096
+1600181931
+1601237946
+1601266876
+1601372273
+1602058330
+1602436554
+1602507669
+1602580094
+1603252147
+1603341972
+1604199879
+1604703033
+1604834262
+1605086244
+1605791424
+1607438659
+1607446139
+1607503808
+1607689325
+1608888789
+1609025624
+1609209357
+1609420722
+1610326933
+1610354835
+1610907046
+1611021262
+1611150032
+1611467954
+1611664715
+1611916639
+1612517587
+1613163141
+1613165298
+1613386044
+1613979046
+1614635894
+1616526251
+1617180560
+1617480512
+1618820264
+1620246009
+1620419572
+1620558038
+1621091953
+1621529118
+1622005328
+1622050333
+1622179155
+1623050888
+1623209394
+1623459939
+1623484003
+1623603762
+1623889393
+1624173548
+1624464896
+1625170136
+1625362763
+1626430015
+1626970192
+1628121672
+1628408236
+1628680402
+1628925528
+1629189561
+1629370292
+1630008235
+1630930773
+1631421822
+1631563384
+1631675429
+1632334611
+1632444064
+1633251030
+1633279576
+1633749839
+1635711422
+1635720341
+1636157500
+1636414415
+1637251845
+1637285116
+1637734537
+1637810065
+1638312299
+1639636432
+1640069510
+1640251217
+1640495243
+1640852930
+1640902548
+1640973194
+1641303157
+1641602577
+1641940941
+1642386203
+1642911398
+1643200834
+1643432013
+1643945857
+1645163315
+1647038764
+1647432727
+1647550481
+1647681641
+1647739773
+1648407946
+1650957865
+1651189800
+1651228661
+1651602615
+1651723990
+1651979014
+1652035980
+1652336635
+1652488990
+1652662678
+1652917121
+1653730724
+1653793588
+1653808566
+1654218363
+1655512981
+1656357057
+1656382282
+1656527659
+1656836737
+1656899384
+1657491772
+1657581217
+1658389312
+1659558942
+1659763330
+1660203289
+1660354498
+1660936402
+1660941546
+1661160008
+1661615543
+1662120637
+1662713773
+1663348811
+1663703378
+1664878532
+1664927449
+1665063679
+1665592075
+1665665907
+1665797164
+1666560188
+1666610125
+1667012405
+1667094821
+1667723273
+1668291627
+1668425093
+1668950342
+1669878494
+1670051000
+1670430610
+1670843380
+1671617025
+1671679821
+1671687486
+1672636521
+1673022090
+1673071844
+1673450973
+1673561338
+1673593629
+1673652923
+1673869590
+1673943363
+1674093161
+1674183829
+1674526340
+1675009974
+1675050457
+1676062785
+1676489972
+1676828446
+1677809117
+1677942847
+1678303043
+1678800583
+1678966473
+1679435900
+1679760311
+1679807748
+1680355846
+1680740109
+1680854603
+1681145630
+1681154519
+1682433608
+1682860219
+1683120726
+1683309335
+1683703655
+1683898065
+1684093902
+1685479660
+1685670802
+1685674772
+1685886511
+1686078315
+1686638605
+1687247302
+1687293049
+1687482043
+1689336427
+1689372805
+1689487672
+1690513744
+1690649318
+1690807299
+1690811551
+1691243981
+1692028399
+1692111480
+1692530403
+1692543235
+1692621968
+1693307286
+1695864459
+1695920939
+1696302113
+1696325466
+1696537007
+1696791383
+1697137871
+1697372223
+1697413331
+1697491301
+1697497417
+1697839909
+1697861675
+1698136637
+1698294722
+1698557750
+1698784584
+1699935507
+1700043014
+1700344833
+1700638336
+1701233079
+1701647480
+1701851674
+1702935667
+1703357407
+1704279225
+1704292550
+1704737065
+1705025741
+1705212855
+1705921936
+1706027242
+1706809413
+1707155967
+1707161544
+1707468143
+1708824936
+1708916678
+1709077084
+1709201354
+1709389906
+1709634512
+1710259167
+1710426304
+1710907081
+1711432322
+1711982922
+1712616754
+1713655136
+1714938058
+1715382969
+1715586644
+1715791259
+1715949475
+1716206064
+1716336110
+1717057363
+1717674414
+1717679162
+1717729007
+1717764027
+1718068782
+1718195253
+1718899451
+1718932089
+1718964581
+1719218496
+1719291728
+1719311226
+1719530929
+1719668723
+1719714046
+1720452382
+1720674605
+1721892191
+1722090599
+1722335152
+1722687898
+1722830323
+1723559018
+1724443772
+1724494481
+1725845274
+1725963428
+1726439150
+1726464916
+1726765254
+1728412086
+1728563880
+1728953525
+1729113281
+1729204466
+1729572730
+1729966674
+1729979067
+1730134231
+1730380637
+1730717673
+1730988528
+1732361885
+1732578383
+1732727339
+1733041184
+1734255953
+1735128089
+1735188871
+1735780827
+1736050561
+1736129733
+1736538146
+1736627648
+1736738386
+1736906002
+1736977930
+1737568236
+1738193197
+1738305701
+1738335772
+1738410219
+1739025158
+1739482622
+1740161959
+1740174027
+1742250186
+1743015970
+1743152565
+1743244151
+1743848324
+1744401022
+1745102682
+1745361932
+1745555996
+1745959691
+1746080292
+1746273827
+1746520899
+1746919396
+1747378767
+1747440482
+1748636583
+1748903633
+1749524853
+1749910679
+1750330993
+1750337080
+1750662000
+1751617362
+1751860646
+1752201454
+1752744208
+1752943554
+1753498480
+1754069475
+1754410332
+1754668850
+1754839684
+1755510835
+1755959226
+1755979355
+1756994021
+1757011032
+1758073489
+1758562660
+1758672764
+1759978969
+1760383955
+1760598328
+1760727398
+1760766488
+1761709344
+1762994023
+1763354671
+1764240108
+1764280160
+1764908354
+1765066231
+1765484552
+1765509215
+1765514062
+1766056039
+1766904506
+1767032456
+1768092545
+1768481597
+1768494505
+1769279627
+1769447272
+1770040087
+1770166660
+1770223040
+1770398467
+1770637092
+1772535604
+1772721028
+1773208391
+1774533974
+1774733493
+1774812689
+1776097147
+1776765870
+1777147864
+1777228440
+1779267712
+1779689400
+1780048056
+1780773352
+1780955231
+1781180662
+1781306409
+1781515844
+1781932314
+1782345601
+1782509548
+1783467085
+1783610303
+1784656862
+1784788601
+1785661614
+1786015992
+1786188113
+1788317961
+1788625505
+1788880175
+1789037327
+1790074506
+1790086362
+1790088972
+1790234426
+1790656731
+1791132216
+1791692142
+1791821393
+1792014727
+1792552205
+1792700310
+1793106630
+1793516700
+1793607412
+1794544786
+1794939367
+1794957315
+1795211682
+1795449985
+1795569252
+1796204638
+1796221962
+1796748614
+1796909870
+1797243573
+1797597107
+1797958480
+1800425111
+1800738917
+1800784106
+1801618897
+1801998995
+1802193328
+1802328716
+1802647610
+1803271884
+1803564093
+1803801439
+1804320961
+1804347859
+1804656545
+1805363254
+1805659158
+1805922105
+1806020360
+1806282075
+1806630884
+1807597377
+1808069952
+1808357277
+1808474384
+1809128164
+1809529970
+1809582629
+1809661249
+1809805200
+1810651209
+1811061184
+1812409866
+1812710028
+1812840931
+1813526744
+1813546587
+1814129334
+1814547074
+1814663544
+1816147218
+1816566383
+1816887781
+1817229282
+1817242323
+1817514697
+1817776049
+1817965390
+1819167855
+1819841820
+1820280974
+1821160636
+1821714369
+1822113638
+1822114083
+1822427912
+1823179812
+1823920990
+1824104215
+1824644645
+1824901525
+1825384639
+1825449584
+1826302182
+1826640037
+1827312589
+1827876561
+1828010540
+1828348957
+1828412690
+1829452033
+1829596130
+1829836468
+1829956581
+1830226610
+1831334710
+1831677676
+1831696566
+1831739185
+1831812601
+1831868289
+1831871876
+1832113294
+1833076876
+1833677387
+1833683126
+1834457754
+1835077262
+1835332071
+1836151690
+1837438781
+1837443209
+1838780412
+1839152579
+1839157259
+1840905985
+1841092705
+1841388853
+1841482482
+1842486688
+1843077410
+1843383840
+1844232879
+1845889973
+1846273263
+1846370022
+1846399412
+1846568813
+1846576748
+1847178352
+1847257552
+1847552042
+1848144703
+1848151369
+1848769448
+1849506631
+1849856032
+1849887092
+1849908467
+1850011484
+1852897629
+1853179444
+1853417277
+1853568390
+1853763638
+1853875969
+1853937506
+1854342883
+1854566556
+1855114084
+1855312350
+1856090999
+1856211760
+1856305515
+1856806916
+1857241566
+1857648016
+1857710634
+1857847907
+1857936757
+1858772616
+1859006602
+1859354089
+1859797040
+1860272693
+1861885371
+1862087517
+1862226584
+1862594299
+1862741469
+1863208190
+1863912680
+1864056209
+1865134111
+1865276847
+1865334967
+1865390995
+1865709646
+1866477481
+1866843632
+1867933256
+1868830821
+1868853086
+1870646807
+1871389170
+1872358810
+1872617926
+1872970983
+1872993547
+1873183223
+1873327330
+1873437895
+1874003906
+1874011506
+1874646522
+1874661105
+1874977901
+1875079164
+1876214171
+1876339191
+1876348522
+1876731496
+1877080768
+1877437289
+1877725691
+1878986308
+1879779298
+1880004204
+1880565034
+1881760657
+1881889897
+1882060884
+1882154612
+1882267809
+1882275028
+1882388880
+1883564279
+1883652998
+1883956673
+1884024922
+1885380055
+1886168595
+1886300653
+1886598362
+1886674036
+1886745809
+1887012935
+1887429795
+1887496316
+1887507727
+1888292363
+1888911383
+1889203830
+1889307884
+1891590751
+1892073929
+1892091329
+1892927136
+1893816894
+1893878442
+1895015806
+1895156441
+1895686413
+1896296912
+1896336358
+1896538683
+1896656087
+1896731866
+1896951407
+1896972359
+1897629965
+1898125878
+1899012867
+1899298070
+1900855434
+1900920988
+1901517834
+1901557112
+1901560354
+1902201505
+1902416401
+1902579514
+1902783838
+1903483048
+1904134983
+1904212175
+1904297982
+1904525077
+1905167202
+1905258796
+1905347024
+1905462781
+1906103699
+1906207926
+1906281883
+1906312200
+1906372951
+1906474448
+1906604183
+1907159131
+1908694399
+1908696811
+1908782239
+1909466103
+1909743078
+1910445699
+1910671166
+1910821166
+1911223213
+1911437377
+1911762770
+1912649397
+1912786546
+1912856893
+1914247458
+1915243709
+1915469775
+1916024656
+1916177385
+1916258364
+1917471321
+1917836456
+1918015925
+1918274790
+1918460161
+1918559100
+1919014693
+1919081423
+1919842401
+1920132366
+1920892040
+1921920020
+1922025095
+1922608091
+1922907778
+1923023522
+1924122507
+1924264526
+1924585057
+1924817394
+1925019173
+1925325102
+1925401163
+1925924671
+1927196287
+1928656918
+1928952270
+1929030151
+1929468576
+1929524543
+1929884419
+1929995761
+1930833031
+1931869325
+1931978336
+1932319093
+1932326598
+1932340264
+1932434559
+1932779228
+1934567780
+1934746482
+1935354728
+1936410255
+1936743077
+1937414813
+1938199990
+1938740718
+1939766282
+1939900837
+1939929205
+1940769323
+1941152827
+1941256335
+1941521037
+1941830273
+1942086567
+1942241109
+1942932263
+1942951687
+1943791877
+1943828473
+1944017124
+1944325972
+1944401579
+1944925275
+1944929049
+1945434542
+1945541061
+1945731227
+1945881798
+1946224703
+1946912817
+1947312328
+1947394013
+1947690946
+1947816930
+1949046003
+1949138565
+1949201016
+1949295933
+1949332544
+1950300738
+1950373557
+1950665699
+1950732970
+1951096566
+1952481778
+1952837489
+1953245862
+1954170253
+1955204315
+1955283460
+1955360207
+1955557415
+1955812599
+1955822659
+1955855673
+1957021068
+1957433783
+1958698151
+1959605041
+1961883944
+1962067476
+1962261137
+1962456541
+1963725302
+1963746826
+1964571639
+1964575207
+1964798655
+1965214887
+1965236632
+1965938096
+1966397780
+1966448042
+1966455501
+1966594745
+1966756799
+1966992714
+1968001627
+1969459881
+1970121684
+1970215698
+1970419885
+1971899521
+1972138625
+1972401863
+1972579106
+1972773434
+1972906172
+1972983984
+1973008677
+1973496900
+1973843890
+1974651527
+1974866841
+1974905464
+1975321621
+1975347291
+1975686428
+1975763743
+1976042858
+1976260885
+1976303715
+1976769124
+1976872309
+1977400993
+1977693925
+1979831306
+1980004795
+1980247142
+1980369263
+1980439693
+1981151767
+1981707536
+1982633863
+1982913987
+1983294490
+1983765429
+1984077960
+1985214231
+1985876929
+1986082466
+1986134900
+1986406134
+1986464126
+1986546127
+1988022187
+1988232552
+1988595497
+1988935788
+1989069465
+1989387157
+1990311334
+1990337428
+1990398117
+1992060907
+1992746174
+1992910288
+1993056274
+1993396144
+1994057935
+1994123377
+1994163260
+1994647893
+1994840702
+1994927466
+1995027992
+1995039840
+1995179989
+1995348814
+1995658531
+1995699806
+1996738215
+1996953453
+1997057051
+1997122557
+1997163490
+1998530430
+1999106261
+1999457567
+1999535108
+1999783458
+1999996902
+2000140696
+2000858786
+2001416693
+2002873105
+2003151458
+2003509785
+2004334485
+2005110560
+2006437298
+2006816312
+2006887547
+2008131648
+2008526800
+2008594260
+2008654248
+2008796347
+2009133395
+2009706935
+2010246257
+2010504454
+2011030804
+2011084922
+2011586681
+2012388542
+2012633790
+2012641329
+2012818205
+2013697987
+2013783047
+2013840398
+2014038108
+2014065280
+2014083971
+2014092020
+2015968022
+2016268558
+2016429328
+2017536240
+2019874372
+2019929511
+2020959200
+2021018452
+2021076883
+2022154087
+2022492824
+2023542021
+2023554808
+2023753310
+2024201018
+2024227440
+2024334195
+2025139946
+2025186860
+2025282751
+2025716148
+2026189422
+2026203246
+2026675993
+2027552250
+2027904571
+2028219547
+2028562101
+2028665399
+2028670128
+2029791986
+2030365295
+2030413558
+2030960044
+2031405039
+2032559711
+2032941145
+2033534783
+2034634128
+2034672808
+2036708515
+2037835062
+2037888774
+2038009612
+2038045667
+2039431051
+2039637761
+2039800301
+2041082761
+2041303094
+2042107432
+2042233542
+2042363657
+2042415472
+2042511229
+2043231877
+2043319160
+2043987821
+2044253939
+2044283948
+2044408040
+2044631917
+2044788184
+2044899365
+2045168728
+2045727198
+2046044615
+2046301553
+2046390674
+2046829433
+2046968218
+2047291275
+2047430125
+2047456911
+2047539620
+2047862769
+2048572294
+2048659403
+2049934499
+2050182629
+2051069870
+2052220794
+2053171160
+2053336231
+2053481834
+2054271782
+2054635617
+2055350505
+2056340906
+2056366255
+2057248757
+2057315093
+2058066491
+2058518045
+2058685969
+2059209995
+2060067617
+2060111076
+2061034051
+2061092671
+2061388786
+2061768134
+2061907676
+2061993958
+2062197121
+2062271333
+2063413297
+2063501373
+2063706316
+2064169171
+2064313331
+2065322790
+2065840687
+2066118079
+2066674714
+2066821226
+2067555697
+2068512319
+2068957858
+2069260837
+2069358687
+2070009892
+2070626763
+2070895199
+2071158399
+2071378176
+2071599112
+2071848992
+2071875224
+2072162629
+2072210587
+2072295356
+2072960425
+2073561460
+2073684155
+2073724569
+2073937076
+2074396037
+2074824750
+2074832425
+2075345733
+2075563039
+2076186873
+2076394855
+2077570395
+2077648263
+2078316825
+2078455964
+2078928409
+2079371022
+2079987655
+2080298995
+2080392692
+2080401227
+2081132740
+2081373230
+2081511914
+2082544123
+2082689306
+2082942262
+2084997147
+2085264933
+2085375131
+2085375151
+2085845962
+2086540880
+2088117863
+2088143853
+2088252155
+2088275985
+2088464145
+2089702689
+2089923485
+2090195138
+2091546281
+2091797712
+2092744114
+2092925909
+2093300088
+2093845647
+2093971069
+2094739837
+2094747389
+2094899178
+2095002577
+2095177843
+2095189048
+2095435229
+2095676080
+2095783100
+2096030688
+2096745731
+2097512226
+2097585246
+2098874053
+2099105340
+2099358009
+2099703782
+2099745869
+2101027229
+2101103873
+2101622752
+2101839664
+2102174312
+2102566455
+2102782069
+2102896372
+2103577295
+2104716273
+2104977614
+2105098620
+2105430217
+2106089939
+2106347088
+2106439958
+2106570846
+2106712338
+2107374605
+2108822095
+2109122690
+2109426137
+2110438392
+2111173231
+2111918759
+2113518959
+2113930017
+2114912208
+2115130907
+2115876551
+2116113867
+2116583813
+2116628495
+2118107443
+2119120227
+2119917044
+2120181102
+2121261766
+2122614198
+2123843729
+2123903330
+2124023997
+2124453556
+2124573438
+2125708169
+2125791697
+2125798900
+2125953670
+2126285698
+2126864680
+2127161348
+2128559866
+2128618521
+2128935149
+2129342732
+2129469269
+2129771954
+2130379715
+2130603664
+2131097609
+2131312993
+2131365376
+2131412396
+2131844074
+2133222643
+2133424643
+2134248810
+2134711115
+2135093865
+2135365019
+2136516968
+2136913658
+2137688499
+2138239743
+2138752978
+2139768429
+2139791460
+2139933076
+2139999454
+2140611941
+2140813181
+2141337101
+2141868834
+2141956447
+2142034998
+2142255867
+2143725887
+2145151678
+2145770442
+2146120670
+2146212683
+2146236092
+2146250697
+2146915310
+2147037796
+2147279260
+2147345709
diff --git a/radixsort_serial b/radixsort_serial
new file mode 100755
index 0000000000000000000000000000000000000000..5d8a21af474388660fe97fa0d0b7d6bf855efa90
GIT binary patch
literal 13704
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
G|NjHQ@w_eo

literal 0
HcmV?d00001

diff --git a/src/radixSort/radixSort.cu b/src/radixSort/radixSort.cu
index 9a5182a..8558501 100644
--- a/src/radixSort/radixSort.cu
+++ b/src/radixSort/radixSort.cu
@@ -22,9 +22,10 @@ __global__ void copyToArray(int arr[], int output[], int n){
     }
 }
 
+
 void countSort(int arr[], int n, int exp) {
-	dim3 gridSize(20,1,1); 
-	dim3 blockSize(20,1,1); 
+	dim3 gridSize(1,1,1); 
+	dim3 blockSize(256,1,1); 
 	int *d_output, *output = (int*) malloc(sizeof(int) * n); 
 	int *d_arr, *d_count;
     int i, count[10] = {0}; 
@@ -45,13 +46,13 @@ void countSort(int arr[], int n, int exp) {
     for (i = 1; i < 10; i++) 
         count[i] += count[i - 1]; 
   
-    // Build the output array 
+    // // Build the output array 
     for (i = n - 1; i >= 0; i--) 
     { 
         output[count[ (arr[i]/exp)%10 ] - 1] = arr[i]; 
         count[ (arr[i]/exp)%10 ]--; 
-    } 
-  
+    }   
+    
     // Copy the output array to arr[], so that arr[] now 
     // contains sorted numbers according to current digit 
     cudaMemcpy(d_output, output, sizeof(int) * n, cudaMemcpyHostToDevice);
diff --git a/src/radixSort/radixSort.cuh b/src/radixSort/radixSort.cuh
index 1b73c9c..12d59c2 100644
--- a/src/radixSort/radixSort.cuh
+++ b/src/radixSort/radixSort.cuh
@@ -2,6 +2,5 @@
 #define RADIX_SORT_CUH
 
 void radix_sort(int arr[], int n);
-__device__ void sortMSB(int* out, int* arr, int n);
 
 #endif
\ No newline at end of file
diff --git a/src/radixsort_paralel.cu b/src/radixsort_paralel.cu
index 8520fc3..4a104e2 100644
--- a/src/radixsort_paralel.cu
+++ b/src/radixsort_paralel.cu
@@ -28,11 +28,11 @@ int main(int argc, char *argv[]) {
     gettimeofday(&start, NULL);
     radix_sort(arr, n);
 	gettimeofday(&end, NULL);
-	
+    
+    assert_sorted(arr,n);
 	printf("\n");
     printf("Parallel execution time = %ld.\n", getTimeDiff(start, end));
-
-
+    writeOutputToFile(arr, n, "output.txt");
     
     return 0;
 }
diff --git a/src/radixsort_serial.c b/src/radixsort_serial.c
index ac2d806..2c47c2f 100644
--- a/src/radixsort_serial.c
+++ b/src/radixsort_serial.c
@@ -100,5 +100,6 @@ int main(int argc, char** argv)
     printf("\n");
     printf("Serial execution time = %ld.\n", getTimeDiff(start, end));
 
+    printf("Writing output to file...\n");
     return 0; 
 }
\ No newline at end of file
diff --git a/src/util/util.cpp b/src/util/util.cpp
index d43dbb1..771f547 100644
--- a/src/util/util.cpp
+++ b/src/util/util.cpp
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <limits.h>
 #include <stdio.h>
+#include <string.h>
 
 void generate_random(int *arr, int n){
   int seed = 13516016;
@@ -29,7 +30,7 @@ int get_max(int arr[], int n){
   return max;
 }
 
-void assert_sorted(int arr[], int n, double time_elapsed){
+void assert_sorted(int arr[], int n){
   int err_index = 0;
   for (int i=0; i<n-1; i++){
     if (arr[i] > arr[i+1]){
@@ -42,8 +43,21 @@ void assert_sorted(int arr[], int n, double time_elapsed){
   } else {
     printf("Not sorted after index %d\n", err_index);
   }
-
-  printf("Time elapsed : %f microseconds\n", time_elapsed*1000000);
-
 }
 
+void writeOutputToFile(int* arr, int size, const char* filename){
+  FILE *fp;
+  char path[50];
+  sprintf(path, "output/%s", filename);
+  fp = fopen(path, "w+");
+  if (fp == NULL)
+  {
+      printf("Error opening file!\n");
+      exit(1);
+  }
+  printf("Writing to output/output.txt\n");
+  for (int i = 0; i < size; i++) {
+      fprintf(fp, "%d\n", arr[i]);
+  }
+  fclose(fp);
+}
\ No newline at end of file
diff --git a/src/util/util.hpp b/src/util/util.hpp
index db69ab8..20b11b0 100644
--- a/src/util/util.hpp
+++ b/src/util/util.hpp
@@ -3,7 +3,9 @@
 
 void generate_random(int* arr, int n);
 // void print_arr(int * array, int num_elements);
-void assert_sorted(int arr[], int n, double time_elapsed);
+void assert_sorted(int arr[], int n);
 int get_max(int arr[], int n);
 long getTimeDiff(struct timeval start, struct timeval end);
+void writeOutputToFile(int* arr, int size, const char* filename);
+
 #endif
\ No newline at end of file
-- 
GitLab