Skip to content

Instantly share code, notes, and snippets.

@kylelk
Created July 7, 2015 21:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kylelk/8515b9b0d9c1d16f887c to your computer and use it in GitHub Desktop.
Save kylelk/8515b9b0d9c1d16f887c to your computer and use it in GitHub Desktop.
finds similar images
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
/* how many images to load at a time */
#define BLOCK_SIZE 1024
/* structure to hold image data */
struct image {
unsigned int id;
uint64_t fingerprint;
};
int hammingDistance(uint64_t x, uint64_t y) {
uint64_t res = x ^ y;
return __builtin_popcountll (res);
}
int compare_image(const void * a, const void * b){
const struct image *ia = (const struct image *)a;
const struct image *ib = (const struct image *)b;
uint64_t fingerprint_a = ia->fingerprint;
uint64_t fingerprint_b = ib->fingerprint;
return hammingDistance(fingerprint_a, fingerprint_b);
}
void find_similar_images(
unsigned int *similar,
int similar_list_size,
int *result_count,
struct image *image_list,
unsigned int list_length,
uint64_t fingerprint,
unsigned int tollerance) {
unsigned int i;
int max_results = similar_list_size;
int similar_count = 0;
/* array to store results */
struct image *similar_images;
similar_images = (struct image*) malloc(similar_list_size*sizeof(struct image));
/* check each image */
for (i=0; i<list_length; i++){
if (hammingDistance(image_list[i].fingerprint, fingerprint)<=tollerance){
similar_images[similar_count++] = image_list[i];
/* stop searching if result limit is reached */
if(similar_count>=max_results){
break;
}
}
}
/* sort images */
qsort(similar_images, similar_count, sizeof(struct image), compare_image);
/* copy results */
for(i=0; i<similar_count; i++){
similar[i] = similar_images[i].id;
}
free(similar_images);
*result_count = similar_count;
}
int main() {
char *filename = "temp.txt";
char line_buffer[64];
FILE *fp;
char *pt;
char *delemeter = "|";
int id;
uint64_t fingerprint;
struct image *image_list;
int img_index=0;
int block_count=1;
int total_images;
fp = fopen(filename, "r");
if (fp == NULL){
printf("ERROR: cannot open file\n");
return 0;
}
image_list = (struct image*) malloc(BLOCK_SIZE * sizeof(struct image));
while (fgets (line_buffer, sizeof(line_buffer), fp)) {
pt = NULL;
/* parse the image id */
pt = strtok(line_buffer, delemeter);
/* convert image id to integer */
id = (int) strtol(pt, (char **)NULL, 10);
/* parse the image fingerprint*/
pt = strtok(NULL, delemeter);
/* convert 64bit hexadecimal string to integer */
fingerprint = (uint64_t) strtoull(pt, (char **)NULL, 16);
image_list[img_index].id = id;
image_list[img_index].fingerprint = fingerprint;
img_index++;
/* allocate more memory to the image list when a block size has been read in */
if (img_index%BLOCK_SIZE==0){
block_count++;
image_list = (struct image*) realloc(image_list, block_count*BLOCK_SIZE*sizeof(struct image));
}
}
total_images = img_index-1;
fclose(fp);
int i;
unsigned int *similar;
similar = (unsigned int *)malloc(BLOCK_SIZE*sizeof(int));
int similar_count=0;
int tollerance = 11;
uint64_t target_fingerprint = 0x3336b67636c6c6c6;
find_similar_images(
similar, /* array to write results */
BLOCK_SIZE, /* size of result array */
&similar_count, /* address of result count */
image_list, /* array of images */
total_images, /* size of image array */
target_fingerprint, /* 64 bit fingerprint of target image */
tollerance); /* minumum number of similar bits */
/* display search results */
for (i=0; i<similar_count; i++){
printf("%d\n", similar[i]);
}
free(similar);
free(image_list);
return 0;
}
2073|923212ce9ed2de9e
3333|81a8ac7876b290d0
3334|1a1b0b092b1b1b1b
3335|e62c2d2c2ce6f79f
3336|f9f9f9fcf9fde9e5
3337|8ec666666e666676
3338|9866666666666666
3339|889c66461693a6a7
3340|2232323233733237
3341|05053574f4f5c545
3342|000000333333b3b3
3343|ffcdcd9dcd797979
3344|397979f9f9d9e9e9
3345|fcfcdcdc7838b8b4
4146|666763e3931b333b
7057|f9fdf4f0d0d2d3c6
7058|4747470707070707
7059|4bdb93911353535b
7060|c4ccfc6cc8d85555
9444|202266c68e8ecec6
9445|26c6c6a6929a9ac2
9446|00c4c64606363636
10957|3333373737373121
10958|0000001293b3b3b1
12996|3353434b4b4b0b0b
12997|a123a7a7a7a73737
12998|01666626a6869e86
12999|55d6022a0bc8bebe
13000|33333333676465c3
13001|0303030703878787
13002|ff99999988c8d999
13003|4066460606161e1e
13004|0541013393c3c7c3
13005|0111935343434343
13006|62a7a5676767a722
13007|000023734a4a4a0e
17289|0d050d9d9d9dcdcd
17415|dcdcdc94b4bcbcbc
17417|32323293b39393d3
17416|868686969687979b
17418|4959594949494949
17419|aaaaaa8808a8888c
17420|1253534343424242
17421|052707070703834b
17422|323272e2f272b292
17423|c7034d93934a63cb
17424|ffdcd8389a9adcd8
17425|171633b3b31b1b8b
17426|cccccccccec4e4e4
17427|6c6cb5b1b1b1b185
17428|fcdcdcdcdcdcdc7c
17429|f7b7ae4ccdddccc8
17430|cc4c4c6c2933ef25
17431|6fadedc3f7624224
17432|0006060e0e4e6e6e
17433|f9b9399999999999
17434|7276f6f2f2f2fefe
17435|67adedc3f7624224
17436|252525252521a1c5
17437|fb092b1bf0e0f8f8
17438|c08e8e8e8e9e8e9a
17439|edf9f9f9ec6c7c7c
17440|82c2c3cbcbcb9393
17441|67c5c7a717959787
17442|01c6c646060646c6
17443|434b435307858787
17444|dddd5dddddd9d9f9
17445|4b4b4b4b4b4b4a4a
17446|ddd531313131b133
17447|ea4a5ededcdcf8f0
17448|0167666666666666
17451|fdfddd9195153535
17453|6d64b4b6b6b6b696
17454|8989899991b133b3
17455|4a5ededcdcdcf0c0
17456|26468292829a92c2
17457|6eaea2aeae3a3a0a
17458|0541013393c3c7c3
17459|b4d4b433634bca1a
17460|ececb4feda5efefa
17461|41030313535b9367
17462|9e9858786a686a6a
17463|0545452794ee77fb
17464|00c6c64606363636
17465|55c6c637223ac786
17466|123362d2d35b5b5b
17467|f6e62606b6b2b2b6
17468|d6d6b424ececcc8c
17469|050101494b4b6b8b
17470|010135b7b3939212
17471|f0f0fdfcfcfcfcfc
17472|ddbdbd78f8f0f8f0
17473|ccccdc95eadadada
17474|640c0e0e0e8e8e8e
17475|4505016969692929
17476|f6f6f6feda5a5a5a
17477|202266c68e8ecec6
17479|010533b3b3333313
17478|00003c7c3cbcfcdc
17480|d47454eef6f6fcfe
17481|342929a9a9a9acb8
17482|b8981870f193991d
17483|292f2f6d2d1f1c1c
17485|f5b02c839796524b
17486|a31f676763938696
17487|32329af672ca8eae
17488|61031bc76199e961
17489|329b9bd9cc989819
17490|7347673f38381e38
17491|3323436706460763
17492|41410161e1e77f07
17493|fefefcf86a0e3a72
17494|23c327252565454f
17495|f060e00203c7c7fe
17496|13154555a5634383
17497|fe7afefe9cbcdcdc
17498|8286961656d4d6d5
17499|323332c2cbcbcb4b
17500|00006622cb467636
17501|01662626b2939216
17502|0509536618868e8e
17503|6646869696929696
17504|07072727070f1b1b
17506|
17508|fadaf86aeaeae6ee
17507|0e1e1e1e3d0e0e0c
17510|068782a2e6cec686
17509|5ae8c8cacacacb4b
17511|decececccccccc8c
17512|434b435307858787
17513|ee9a99998cbcbc1c
17514|deba9898c9989c9c
17515|66e6c6c68696d6d2
17516|0b0b2b2b0b0a0686
17518|67c5c7a717959787
17517|1e1e1e1e165e1a1a
17519|45c54d476767472f
17520|6a6a7a3a3a6aeaae
17521|f5f5f5f4f4e464e4
17522|1c3436363e3a7a3a
17523|56d662666266e6e6
17524|6666868686860696
17525|7a76767676feeff3
17526|5454545066666676
17527|ada929690e0e4e5e
17528|66e686c6c6e666d6
17529|009393929a9a9aca
17530|006666662626a686
17531|79796d6464646464
17532|6567662726263626
17533|6567662726263626
17534|4149494949496929
17535|002266a2929392d2
17536|49233333938686c6
17537|052133232726a686
17538|1515449393135353
17539|fe766ccc4cccccd6
17540|dcececcc4c8c8c8c
17541|47534b4b0b1b1b1b
17542|c6228b8b8b8b8b8b
17543|335343c34353c3c6
17544|061e169393332363
17545|c60606161e1e8686
17546|82c2c3cbcbcb9393
17547|02061e1e1e26ae8b
17548|23838e868f8b8b83
17550|1a845d0e8fd10cad
17549|86c6060606060606
17551|fcfcfcfcf4ecce8e
17552|f4f4f4e4e4e4e6e5
17553|fafefefa8e9e9292
17554|33232323234341ab
17555|fcfefefeb2b2b2b2
17556|1f37070787062646
17557|45053333b3b333b3
17558|13333363d3c3c353
17559|006666c6c66646c6
17560|061e169393332363
17561|82c2c3cbcbcb9393
17562|002266e6c683c6c6
17563|11b3333363735333
17564|01236623e6c6c6e6
17565|00c6e68682c6ce86
17566|00333323c3c3c3c3
17567|018e8e060e0e0606
17568|0006c68606868686
17569|0066668686868686
17570|0033333362e3c3d3
17571|056666c6c6868686
17572|01c6c6068686c686
17573|0133336363e3c363
17574|006666c6c6c6c606
17575|45666666e6868646
17576|016666c6c6868686
17577|11c6c606868e0e06
17578|0166666686868686
17579|00333266e6e6d393
17580|f4fcb0b2b2f1f6fe
17581|05d331212131b9a9
17582|fffe9938b89979d9
17583|fe7c79787878f8e9
17584|ff9c995859395979
17585|b86632939a18dada
17586|ffdd99995d19192d
17587|ffddd9193939b9b9
17588|ff999939195919c9
17589|fbcdcd99d979e9e9
17590|a589e3e3e3e3e3c3
17591|ffcdcd9dcd797979
17592|ffdd9999dd99d959
17593|ff9999797979f9f9
17594|fffd9d9d9cb4bcbc
17595|b4b4d0f4f4dc9c94
17596|00666686c68626a2
17597|006666e6c6269292
17598|2232b2b292b2b232
17599|030707070f0f1f17
17600|090ece868d8d2d2d
17601|e6e6666666666666
17602|9a9adadadadacaca
17603|cc4ccdccd4d4d4d5
17604|0105c6c6c6c6c6c7
17605|3d3936366634352f
17606|5153131333338323
17607|4444411e1e1e3cf8
17608|ae2c6ccccc8cece8
17609|2abaa4a4ac2d2d4f
17610|47534b4b0b1b1b1b
17611|2363cbcb0b4b0b4b
17612|ccc9c9e9e9e9c5c5
17613|256d491113131353
17614|cac2e2c2e2e2e2e2
17615|b4bcb4f4f4f4e4e4
17616|ccc9c9e9e9e9c5c5
17617|f0f2323232333333
17618|0167666666666666
17619|0033b33333333366
17620|c747233333333333
17621|f8f8727272727272
17622|e2e2b3939393b3a3
17623|8060626232326262
17624|383078fcfcf8cec6
17625|1010c6c6c6c66666
17626|00848e4e46668646
17627|e6e6e6cc9cccccc6
17628|fafafafaeaea6a6c
17629|74f8f07470786eab
17630|c2d252d8180d4d6e
17631|0e26424bc1c1cd9d
17632|470b3bcfcd9999c9
17633|00223266e2e29286
17634|4d1d0fc40d4549a9
17635|b5adcdcd04cd6064
17636|0567676766673333
17637|003333333393d333
17638|01232323a38386e6
17639|ad2da9a9bb223839
17640|0597151113333796
17641|00233363c3c3c2c2
17642|0066e6c686868686
17643|006666e6868686c6
17644|22626686c2c2c2c2
17645|006666c6c6868666
17646|01333333333393c3
17647|0033333373734373
17648|00323393c282b2e2
17649|0066666666668686
17650|a682929292b226c6
17651|2066662626068682
17652|016366e623b39386
17653|9753632323232323
17654|0066e6c686868686
17655|0066666666668686
17656|2dafaf292929a989
17657|00222213c3c3c302
17658|9333131343637372
17659|016366e623a39386
17660|003333333393d333
17661|0033333393d3d373
17662|25b5959594959495
17663|01818989b935296d
17664|dddd5dddddd9d9f9
17665|003233226263c3d3
17666|6f676c6ca48c8ca4
17667|00e6e6c6c68686c6
17668|00226666c6c6c2c2
17669|0133332363e3e663
17670|a52525a5a5a5a5a5
17671|1505151737373313
17672|045bdbdbdbdbdbdb
17673|4b4b4b4b4b496969
17674|e6e6e6a6a68696b6
17675|9f969787bd3d3839
17676|9797949498bcf890
17677|fafadcbc1c9cdcdc
17678|fedc189c9c9cbcbc
17679|f4fcccccbc3c3cb4
17680|cbcbc343d9190d59
17681|6c6c6d091d1d9d9d
17682|4343435b19199999
17683|abcbcb4359594ccd
17684|8dad8f8d9c9c8c8f
17685|f9f9f9ed7c7cbc7c
17686|1f191c1d1d3d7474
17687|9998989c9c98ebe9
17688|bdb999b9b9b9a9a8
17689|cc4c4ccccccccccc
17690|0183838b83830705
17691|fc7c785e17175654
17692|131919590949d1e1
17693|ccc63d3c3e3eb6b6
17694|6676362f36061e8a
17695|7ffef5b514505048
17696|6ca9acecbda5a0f0
17697|3939b9b9b9f8f83c
17698|f3f264e4e4d47cfc
17699|d8d8d8dcd8f8f0e4
17700|bafafafafaeaeaea
17701|86ce8e0e3e367632
17702|f167547c6868e8e8
17703|4567676766c7c7c7
17704|01018bdb63232333
17705|333333333327b333
17706|5567676737333333
17707|0000151425656161
17708|1111333333333333
17709|0005150065656161
17710|1414343232323236
17711|ccccc60626262783
17712|694108494b4b4bdb
17713|8bdbdf8f0e1df414
17714|909b9b137333733b
17715|1d19393333333035
17716|bcfcfcfcfcfcfcfc
17717|0040939393939393
17719|3670f0e6f6e6e6e6
17718|0e868e8c8cccc9c9
17721|c5c7c6c4c7654547
17720|0541d39bdbd9d9db
17723|6266662222262626
17722|fef5d5d5d594f4f6
17724|c989db91919d1b1b
17725|6c6c4c4c4c743434
17727|dce8a8eae8eeeaca
17726|f8f9f9f19199989c
17728|f9797173e3c34226
17729|beb8f8f8f8dae6e2
17730|0193937373637333
17731|8e8e0e9adbdb5bdb
17732|6f656c6ca48c8ca4
17733|7878f8c8d4f4d4f1
17734|5363232323232323
17735|333333333323c6c6
17736|01676733666667a3
17737|1567233367673393
17738|aaaaaaaaaaaab6b4
17739|696949292d2d29a9
17740|f23232b2b2b23232
17741|01c7e66666666666
17742|654101030b0b0383
17743|e6c686c68686565a
17744|323262326262e292
17745|01018bdb63232333
17746|e4e4e4e4e4c4d4d4
17747|a9f0fcfcfcfcf8f8
17748|dbe064a4849cac9d
17749|d393506666666666
17750|2038f9f4d4d4d4d4
17751|995b5bd9bb332389
17752|ffff6ffe6c6cecc4
17753|66666666e6c34343
17754|66668686868686ce
17755|c1b13838989c9efe
17757|1919327ecec84c4d
17756|585b5b7343634309
17758|e4f47636f6747414
17759|aaadb5e4f8683939
17760|c4e484f4fc7c7c3c
17761|83830f0b0a0e4e4e
17762|5e19787071f1e1f1
17763|f6febc48d0d5cdce
17764|f4767652f2b6b4b4
17765|6767662626263236
17766|7070c48c8e6c6de5
17767|decececccccccc8c
17768|3d3939bdbdbdbdbd
17769|434b435307858787
17770|4b4b4b4b4b4b4a4a
17771|070707cdcd070949
17772|b79b99999c9cdcdc
17773|3f1939f9c9c99999
17774|6c6c35b1b1b1b185
17775|5676266676565656
17776|1547075757575753
17777|cded3939b1b1b1b1
17778|57d5d56518981c54
17779|b4f470f8f8e8e8ea
17780|f5b51415f4f4f454
17782|15fcfcfcfcfc7838
17781|00600616beb6b6b6
17783|f7b7ae4ccdddccc8
17784|7624b59919d9b9b3
17785|153414351595b171
17786|a525273727232323
17787|696969692d2d29a9
17788|24a5824b63b3ba1a
17789|445051503c323afa
17790|f8dc787034bded65
17791|fcfcccccccc4c4e6
17792|848e0e0606060606
17793|002232d3d3d3d3d3
17794|003232b2b2c2d3f3
17795|89198181f9b9338e
17796|ecc8cd8d0d1d0d48
17797|96f6bab2f2fab276
17798|babf83b929a9a8a9
17799|73e3cd18983575e9
17800|0705017333595b52
17801|0046460606068fcf
17802|40626666667e83c6
17803|eeeceeeeecceeeec
17804|ea6a3abab838babe
17805|ea6a3abab838babe
17806|15515b5b5b5b4b49
17807|fdddddcdcdccdddd
17808|5656525252525252
17809|fcfcf8d8f87c7474
17810|7435a0e8a3373203
17811|b2b0b0b0b8b8b8b8
17812|2a0ad4565ed1e1e1
17813|dcd8d99999d9dddd
17814|2707070f0f0f0b4a
17815|b7d595b535707979
17816|0121212121213121
17817|b333336363737363
17818|323263c3c7c78793
17819|fef8f87cfc7a7e7c
17820|fedcd8dc7c78baba
17821|c686060606664686
17822|323263c3c7c78793
17823|6c9cdae8eaea6afa
17824|dce8a8eae8eeeac2
17825|7efef0527858da6a
17826|b5b4255d585c5c5c
17827|32326262e2e6d696
17829|5490921333333373
17830|3533333392333333
17831|2293b33b0b430313
17832|052707070703834b
17833|05053574f4f5c545
17834|f1f1d153fcf1f9d9
17835|0895b6a0ab2b6b43
17836|989c66461693a6a7
17837|d892f0f0d2f2fa9a
17838|f6f4f4f47849494b
17839|612767c282829313
17840|2929292929292929
17841|6367263293939332
17842|cefafae2e2cacae6
17843|013333b393b3b333
17845|6666e62626a626e6
17844|012323333333161a
17847|4159131333131313
17846|010149dbd3911353
17848|000222426ebedaf9
17849|016527313969444c
17851|73180c4d4f494969
17850|63e4e6a7a7e763e7
17852|3e26262626323232
17853|fdcdcdcdcccdcdcc
17854|05050585ada5a1a5
17855|2232323233733237
17856|0509074d4949494b
17857|b46466b4b133b333
17858|01054de3c6878782
17859|052549595b4b5b5b
17860|f4f0f8f8f8d9d9d8
17861|fcfcfcfcdc9c9c1c
17862|fcfcbc9c9c9cb4bc
17863|fcfcfc7c3c3c3c3c
17864|fffffff0f0f8fcb4
17865|6775717131717c78
17866|969696cedc2266f7
17867|000022626667b326
17868|79f8686969292929
17869|bafa5ad6d494dc4c
17870|fecc4cccccecacac
17871|fbdc5c6cf8eca8ea
17872|6d6d6c6c6c6c4cec
17873|eafafa56b4b4246c
17874|3d07013de3f19c9b
17875|0163631733d29392
17876|2e3e464627270312
17877|0f4f4b4f1a1a3a19
17878|000000333333b3b3
17879|cc4c4c6c2933ef25
17880|67c5a367e6e29290
17881|0000006266e68686
17882|6133333777133327
17883|02c2c2c2c2c3c2c2
17884|01a0a8a8a9a3e0d2
17885|1516ea6b38381835
17886|0909010101361606
17887|7c7cfc78b8f8f8f2
17888|7cfccedefef6eed5
17889|050555014d33b333
17891|67c5a367e2d29090
17890|54d6ea0a0ecc14e0
17892|00026632b2b3b3b3
17893|050501010195a5b1
17894|00000069494b5b53
17895|3d07013de3f19c9b
17897|dddcddd9f5bcbc3c
17898|000f0f98010111d6
17899|1e1e0e8e8e8686c6
17900|bc9c9cd8d8d8d8d8
17901|01dbdbdbdbdbdbdb
17902|090d0d0d0d1d1d1d
17903|f89c9e9e9e9e9e9e
17904|dcd8d8dcd8d8d8d8
17905|1d1d391d1d1d1d0d
17906|62629383b393b333
17907|d64e2cbcd4d6d6c6
17908|098199db9b5b5b5b
17909|620646c646666666
17910|3333737373734343
17911|f1f1f9b931f1f1f1
17912|000093121a1a5a52
17913|dcdcdcacacacacac
17914|5b5b5b5b5b1b1bbb
17915|b0bc3c3c3c3c7cf8
17916|fdfefa01010080e0
17917|0000939393935b5b
17918|ecacadadc9c9c1c9
17919|41d1b1416367e785
17920|f4f431333333f1d1
17921|ffcd993979f9f9f9
17922|ffff9999d97979f9
17923|fefefada82febab8
17924|cae8ececececee6e
17925|96664cd8f3171707
17926|9313131131111909
17927|0b0b070707075757
17928|070f090919190989
17929|1555557171711505
17930|36363676f6746267
17931|bf77e7e569694949
17932|f9fdfcf4f4f47676
17933|0103033113131303
17934|1a16169696020202
17935|fefefefcf4fcfcdc
17936|a565565656564646
17937|111191db53535353
17938|733333333393d353
17939|b6b6b6b2b2b2b6b2
17940|2b0b0b0b0b0b0b0b
17941|a329696969696969
17942|323686165a5e5e1e
17943|0540527ae070fc2c
17944|e5e5e4e4f4f4f4dc
17945|4747470707070707
17946|0f0707078786c6c6
17947|226266e2323a9a98
17948|fdfcf0f0d052d346
17949|f2f2f2f2b27272ea
17950|666606060606060e
17951|febebabab8b8b993
17952|1e0e0e0d09030303
17953|bdad2d2d49491959
17954|a4aca6a626262626
17955|e072323232333333
17956|6f676c6ca48c8ca4
17957|39b1d9d9e6969b19
17958|7767cdcdcdcd9dcc
17959|f0f8707272727672
17960|00026632b2b3b3b3
17961|59495b799999c989
17962|9f969787bd3d3839
17963|60f07272f3737373
17964|b6b6f6e6b6e6c646
17965|fcfcce8e8ecece8e
17966|e6e6cc4c2c9d9c9c
17967|0c10033b019f0f0f
17968|e6c64e0c1c9c1c9c
17969|7c32323232323276
17970|050101010195a5b1
17971|73e764e4ccc4e424
17973|cbcbc343d9590d59
17972|1018189b5b5b5b5b
17974|3336b67636c6c6c6
17975|7cf4ac2c8c8999c8
17976|939193939393939b
17977|333325ec6ccdccc7
17978|cccc2424909232db
17979|f832323232323232
17980|e6e6c64c4c4c4c1c
17981|67c5a367e2d29090
17982|7c6c2c0d8d0d0d0d
17983|666363e391193b3b
17984|0167666666666666
17985|ce4e8ccc6c2c3c1c
17986|353130f0e2e3e3f3
17987|0333332363632323
17988|ec66666c6cecccc4
17989|66e6668e8ccc4c4e
17990|f8f8727272727272
17991|9292931313135372
17992|7c7c6d4d1d1d9d9d
17993|c7c6666c0c0c0c9c
17994|2311492d250505c5
17995|0022226266667632
17996|0909010101361606
17997|4343435b59599999
17998|666666263226a6a6
17999|c64606360e0c8686
18000|000022626667b326
18001|676666c466c4c6c7
18002|67e6a4a4ac9c8c9c
18003|09058505059d33e6
18004|7c7cfc78b8f8f8f2
18005|0033b33333333366
18006|d9333333b1337373
18007|fafadcbc3c9cdcdc
18008|80808ad3c2466262
18009|b6b6b6b694d4d4d4
18010|7666e6e4e484c6c2
18011|969696cefc2266b7
18012|e0b2d2d8c8627272
18013|01016c246733b3b3
18014|38b078fcfcf8cec6
18015|616765cdcdcd8d86
18016|ffdcd8389a9adcd8
18017|a78fb9998888b838
18018|4b4b5353d95949f9
18019|c747233333333333
18020|b292d256b6d64646
18021|6666a5550000f8f8
18022|b37276969694c4c6
18023|96b42458d6c4c6c6
18024|ed8dcde9f1e1e1f1
18025|00848e4e46668646
18026|676767cdcdcd8d25
18027|050515114d33b333
18028|e6c6869696919193
18029|abcbcb4b59594c4d
18030|9e9e9e9e1e9e9a9b
18031|cece4e0c0c2c3c9c
18032|dddd6d64646ccccc
18033|161646c6c6c6c6c6
18034|414101430b393939
18035|0010c6c6c6c66666
18036|8dad8f8d9c9c8c8f
18037|d3d3d2da94746474
18038|7636246c6ce4cce4
18039|e2e2b3939393b3a3
18040|ccccccececececec
18041|66e6e68c8c8c8e8c
18042|366666d6ce4c4e5e
18043|1113333333333333
18044|f0e0e0f1d58e8e8e
18045|1516ea6b38381835
18046|9797949498bcf890
18047|f4fcccccbc3c3cb4
18048|25253333b3333333
18049|33b3b386c6666627
18050|666666c4c6c6c686
18051|00000066666626a6
18052|8808226666666666
18053|0003030101010119
18054|203232662686cece
18055|32b6a6e6e6c4c6ce
18056|e0e0f2f2f2d3c3cb
18057|c7034593936a63cb
18058|c3835bd9d9195979
18059|fdddcdcd656464a4
18060|b4bcecccdcdc5c5c
18061|000000373535b537
18062|3327a6b6a6a6c446
18063|76666666e6ae9ec6
18064|59d1f1f971636636
18065|8062626232326262
18066|66e6a6a6a6848694
18067|3222a686c6c64e4f
18068|66e6e6e6c6860e0e
18069|3272f2c6c6c6c6ce
18070|c6c64e0ecc1e9e9b
18071|3366e6c6ce4e4e4e
18072|66e6c6c6969a8e0e
18073|3233b2e6c64e4e4e
18074|33a3c7c6c6464f4f
18075|6767e7868684ce4f
18076|e6e68606268c8e9b
18077|337363c3c6c6476f
18078|33c3c6068e8ece0e
18079|e6c686868ecc4e0e
18080|3372e68686cece0e
18081|e6c6062e9c9c9e1e
18082|66e6c6c6868c4e8e
18083|656664c4c4c08383
18084|7466e6ccc4d4c6e6
18085|6666e68686868ece
18086|c6c60e0e0c6c3c9e
18087|e2e2c2c2cacacac2
18088|060626361e1e1e9e
18089|498b8bbb31332323
18090|3333931313535353
18091|2666662626869696
18092|e6e6e6a6a68696b6
18093|fcfcee767434369e
18094|060606069e9e9ede
18095|c6062e3e3ebe9e92
18096|c6c64e0e0c1c1c1c
18097|66666686cc8c8c9e
18098|66c6060ecc4c0c0c
18099|6167c7cdcd8d87cf
18100|6567cdcd8d392573
18101|66666c2c3cbcb49c
18102|b6b6b6b6d4d44454
18103|b6b6b6b694d4d4d4
18104|ce6e6c6c3c3c3cbc
18105|9bd3d3d3d6544474
18106|e6a6a6b4b4b43496
18107|66e6a6a4b4949494
18108|e6e6e6242434b4b4
18109|efcc6c6c242434b4
18110|e6c686961e3c1e96
18111|b292d276b6d64646
18112|cece4e0c0c2c3c9c
18113|3336b67636c6c6c6
18114|2636b6e664a484c6
18115|332626a6a6a6c6ce
18116|c6ce4e0c4c2c3c9c
18117|ce4e8ccc6c2c3c1c
18118|e6c68626343c2c36
18119|e66666a66c2c0c8e
18120|b6b6f6e6b6c6c646
18121|6666b2b6cecc4c4c
18122|462626061ccccc5e
18123|b37276969694c4c6
18124|c6868e6c2c3c8c2c
18125|c6cece6c6c3c3c1c
18126|868ecce46c3c3c9c
18127|e7070e1c0ccc2c0c
18128|cece66664c6c2c2c
18129|e6e6a6b69494d44c
18130|d3d3d2da94746474
18131|ec66666c6cecccc4
18132|7636246c6ce4cce4
18133|33b3b386c666662f
18134|3327a6b6a6a6c446
18135|c64606360e0c8686
18136|c646660c4c0c1c9e
18137|8e0e06361e8c1e1e
18138|3362b2c6c6666667
18139|e666261686ce8ece
18140|666666c4c6c6c686
18141|87860e8e6c2c0c8c
18142|76666666e6ae9ec6
18143|676666c466c4c6c7
18144|6666e6e4e484c6c2
18145|6f676c6ca48c8ca4
18146|6c66666464e4cccc
18147|f466666ccc6ccccc
18148|e6e6cc4c2c9d9c9c
18149|ec66ec4c6ccccccc
18150|333325ec6ccdccc7
18151|6436266cececccc6
18152|ff6da5246c6c6d24
18153|ef6f6d6d6d2dad8d
18154|67676d6d2ccdcdcd
18155|dd4d4d6dad8c8ccd
18156|3367654d4dcdcdcd
18157|336765656d4d6dcd
18158|6f2726a4b4b4d4cc
18159|4d6564248ccccdcc
18160|b7cd2d2d6dcd6ded
18161|ffcdcd4d69191d1d
18162|6765656d258dcd8d
18163|034d6d6d8d8d9d8d
18164|2165654d6dcdcdcd
18165|4767656d4dcd8dcd
18166|4d67656d6d6d8d85
18167|47cdcd4d4d8d8d8d
18168|c7c74d4d9d9d9d9d
18169|998dcd4d399d9dcd
18170|13333363d3c3c353
18171|9c9c9cb8f8f89898
18172|e6e6860c3c3c9c5c
18173|e6e6460c9c9c9c9c
18174|3232b2e6c6c6c646
18175|72e6c6662c6c2c9c
18176|1b1b3333332626a6
18177|c64e0e0e1c5c4c0c
18178|66e6860e2c9c1e5e
18179|c6ce0e0e1c3c3c9e
18180|6626a6a6c6cc4c4e
18181|c64606260e3cbc9c
18182|3266e6a6a4e4a484
18183|6666068e9c9c9e5c
18184|66c686c6c4269696
18185|3333b2b6c6466666
18186|e6c6662e0c66361a
18187|c6c6060e0c1c9e1e
18188|c646060e069c9c8e
18189|66e6860e0c4c2e32
18190|3222a68686cece86
18191|636766a68686848e
18192|e6c6cc8e3e3c3c1e
18193|c60e0e1e3c3cbc9c
18194|e6c6060e0c1c1c9e
18195|e6869e1c8ccc6636
18196|2266e68686c6cece
18197|cded3939b1b1b1b1
18198|6c6cece626343616
18199|57d5d56518981c54
18200|b4f470f8f8e8e8ea
18201|f5b51415f4f4f454
18202|6e5866e6dcd89917
18203|0b170707071b363c
18204|056527263737bd8b
18205|84b293c8d8d9d9d9
18206|f9d8d999d9d9d9c8
18207|ccdefcdafaf6e6fc
18208|21c6666666363232
18209|a5c6c60e1e0e0e0e
18210|a9f0fcfcfcfcf8f8
18211|ba9bfac498d0d046
18212|70d5edd9e3fe2a68
18213|edcdcd6c2cacb4b4
18214|f45454f0f0f85e1a
18215|15fcfcfcfcfc7838
18216|f07076f6f2fafefe
18217|503232929ad29393
18218|00600616beb6b6b6
18219|f7b7ae4ccdddccc8
18220|7624f59919d9b9b3
18221|153414351595b171
18222|f4f6f2d0d1d1d1c3
18223|11117969555d8585
18224|a525273727232323
18225|1131333333331313
18226|848e0e0606060606
18227|fcfcccccccc4c4e6
18228|e6fe0a2ea2faf6fe
18229|24a5824b63b3ba1a
18230|eaee6e7ef6f6f6f2
18231|445051503c323afa
18232|f8dc787034bded65
18234|d94d4d6425a5b494
18233|e4f47636f6747414
18235|f476765272b6b4b4
18236|5e19787071f1e1f1
18237|f8fcf6fcfd7d75f5
18238|e2adb5e4f8683939
18239|20c6c64676f67673
18240|83830f0b0a0e4e4e
18241|6767662626263236
18242|c1b13838989c9efe
18243|c4e484f4fc7c7c3c
18244|7070c48c8e6c65e5
18245|585b5b7343634309
18246|1919327ecec84c4d
18247|696969692d2d29a9
18248|fab6726a68e8e8e8
18249|6c6c35b1b1b1b185
18250|77f3f1f9c9c9c1c9
18251|3339b9f1d9d99993
18252|ccdc696961616161
18253|dd993979c9cdc9d9
18255|ad3539c9d9d9c9cd
18254|6cec3531b1399d9d
18256|b494949374f1c1c5
18257|65cd8cacbc644dcd
18258|94969696969797d3
18259|ff7be37331313d34
18260|1507075757575757
18261|6c6e39d9d9f9e5cc
18262|b4949694d6d6d753
18263|ffcd6c6c6c646c66
18264|6665eccc6c6c6c6c
18265|7d6764cccc6c6c64
18266|ada7b696b6b6b6b4
18267|b79b99999c9cdcdc
18268|d6d46474b43476f6
18269|b495d4d4dcdcc4c6
18270|fcdcdc2c04270727
18271|6d6f17b6b6b4b696
18272|549696b494dcd49c
18273|5676266676565656
18274|6d2c94969696d6d6
18275|5e56467664643636
18276|fed656564cdcda4c
20864|616767cdcd8d8f86
24432|9a9858786a686a6a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment