From 7391cc77c6044d79700aed6b0e8e019736abfdcb Mon Sep 17 00:00:00 2001 From: liberty <2700472871@qq.com> Date: Thu, 30 May 2024 14:44:30 +0800 Subject: [PATCH 1/8] [model] add dhn --- examples/dhn/MA.txt | 7071 +++++++++++++++++++++++++++++++++++ examples/dhn/dhn_trainer.py | 361 ++ gammagl/models/dhn.py | 82 + 3 files changed, 7514 insertions(+) create mode 100644 examples/dhn/MA.txt create mode 100644 examples/dhn/dhn_trainer.py create mode 100644 gammagl/models/dhn.py diff --git a/examples/dhn/MA.txt b/examples/dhn/MA.txt new file mode 100644 index 00000000..3d275250 --- /dev/null +++ b/examples/dhn/MA.txt @@ -0,0 +1,7071 @@ +M0 A1177 +M1 A742 +M2 A478 +M3 A713 +M5 A955 +M6 A698 +M8 A99 +M9 A996 +M10 A580 +M11 A1235 +M12 A292 +M13 A742 +M14 A742 +M15 A580 +M16 A418 +M17 A99 +M18 A742 +M19 A1009 +M20 A188 +M21 A562 +M22 A753 +M23 A188 +M24 A962 +M25 A1043 +M26 A219 +M27 A1040 +M28 A419 +M29 A851 +M30 A594 +M31 A698 +M32 A1040 +M33 A742 +M34 A1054 +M36 A148 +M37 A887 +M39 A562 +M40 A340 +M41 A778 +M42 A1117 +M44 A826 +M45 A816 +M46 A1212 +M47 A287 +M48 A856 +M49 A794 +M50 A219 +M51 A641 +M52 A687 +M53 A148 +M54 A566 +M58 A53 +M59 A187 +M60 A284 +M61 A964 +M62 A349 +M63 A478 +M64 A1213 +M65 A287 +M66 A826 +M67 A53 +M68 A423 +M69 A1040 +M70 A1018 +M71 A1009 +M72 A19 +M73 A1009 +M74 A842 +M75 A1050 +M76 A142 +M77 A338 +M78 A423 +M79 A974 +M80 A1040 +M83 A70 +M84 A1341 +M86 A974 +M87 A1350 +M88 A1310 +M91 A224 +M92 A865 +M93 A908 +M94 A650 +M95 A123 +M96 A550 +M97 A219 +M99 A188 +M100 A1024 +M101 A178 +M102 A287 +M103 A287 +M104 A903 +M105 A842 +M106 A742 +M107 A411 +M108 A28 +M109 A698 +M110 A6 +M111 A645 +M112 A707 +M113 A808 +M114 A39 +M115 A39 +M116 A1009 +M117 A1009 +M118 A742 +M119 A937 +M120 A826 +M121 A1007 +M122 A591 +M123 A1054 +M126 A3 +M127 A99 +M128 A713 +M129 A224 +M130 A99 +M134 A742 +M135 A1050 +M136 A808 +M137 A478 +M141 A831 +M142 A349 +M144 A1054 +M145 A1054 +M146 A147 +M147 A178 +M148 A445 +M149 A702 +M150 A1381 +M151 A245 +M152 A1009 +M153 A964 +M155 A1050 +M157 A1371 +M158 A1050 +M159 A826 +M160 A99 +M161 A698 +M162 A908 +M163 A908 +M164 A176 +M165 A735 +M166 A19 +M168 A349 +M169 A550 +M171 A1035 +M172 A272 +M173 A248 +M174 A39 +M175 A591 +M176 A147 +M178 A1003 +M179 A219 +M181 A742 +M182 A856 +M183 A351 +M184 A133 +M185 A1310 +M186 A287 +M187 A39 +M188 A274 +M189 A1050 +M190 A1009 +M191 A1382 +M192 A133 +M193 A808 +M194 A519 +M195 A1073 +M197 A1009 +M200 A591 +M202 A1073 +M203 A1117 +M205 A742 +M207 A287 +M208 A224 +M209 A1178 +M210 A1054 +M211 A1024 +M212 A1040 +M213 A419 +M214 A1282 +M215 A1263 +M216 A317 +M217 A671 +M218 A21 +M219 A641 +M220 A1050 +M221 A829 +M222 A1035 +M224 A903 +M225 A351 +M226 A1199 +M227 A539 +M228 A1234 +M229 A351 +M230 A1373 +M231 A70 +M232 A592 +M234 A1050 +M235 A9 +M236 A1039 +M237 A1039 +M238 A1345 +M239 A1054 +M240 A1039 +M241 A1117 +M243 A903 +M245 A773 +M249 A1154 +M250 A591 +M251 A36 +M252 A984 +M253 A389 +M254 A178 +M255 A178 +M256 A156 +M257 A219 +M258 A555 +M259 A478 +M263 A1345 +M264 A1043 +M265 A1054 +M267 A1145 +M268 A566 +M269 A245 +M270 A962 +M271 A1213 +M272 A1009 +M274 A1009 +M275 A419 +M276 A643 +M277 A1340 +M278 A351 +M280 A974 +M282 A903 +M283 A318 +M284 A1050 +M285 A1073 +M286 A1125 +M287 A1046 +M288 A572 +M289 A742 +M290 A1179 +M291 A1089 +M292 A1179 +M293 A577 +M294 A36 +M295 A464 +M296 A219 +M297 A1199 +M298 A507 +M299 A816 +M300 A903 +M302 A1339 +M303 A1054 +M304 A490 +M305 A742 +M306 A1177 +M307 A219 +M308 A219 +M309 A671 +M310 A1027 +M311 A224 +M312 A1281 +M314 A36 +M315 A338 +M316 A29 +M318 A947 +M319 A280 +M320 A99 +M321 A861 +M322 A351 +M324 A543 +M325 A36 +M326 A219 +M327 A826 +M329 A1367 +M330 A466 +M331 A29 +M332 A1141 +M334 A916 +M335 A418 +M336 A783 +M337 A1265 +M338 A1374 +M339 A263 +M340 A962 +M341 A340 +M342 A133 +M344 A899 +M345 A910 +M346 A1326 +M347 A245 +M348 A546 +M349 A1110 +M351 A441 +M352 A1009 +M353 A224 +M354 A1179 +M356 A566 +M357 A886 +M358 A1314 +M359 A482 +M360 A1048 +M361 A219 +M363 A1040 +M364 A964 +M365 A245 +M366 A1040 +M368 A425 +M369 A473 +M370 A1050 +M371 A982 +M372 A418 +M373 A1163 +M374 A953 +M375 A550 +M376 A58 +M377 A434 +M378 A441 +M379 A908 +M380 A1073 +M381 A528 +M382 A178 +M383 A961 +M384 A243 +M385 A591 +M386 A961 +M387 A566 +M388 A419 +M389 A1154 +M390 A300 +M391 A919 +M392 A291 +M393 A340 +M394 A831 +M395 A1024 +M396 A224 +M397 A591 +M398 A351 +M399 A566 +M400 A178 +M401 A1141 +M402 A1345 +M405 A1179 +M406 A466 +M407 A1131 +M408 A156 +M409 A1009 +M410 A714 +M411 A197 +M412 A1393 +M413 A156 +M414 A506 +M415 A36 +M416 A335 +M417 A954 +M420 A808 +M421 A155 +M422 A870 +M423 A246 +M424 A589 +M425 A148 +M426 A32 +M427 A414 +M428 A95 +M429 A982 +M430 A259 +M431 A565 +M432 A885 +M433 A547 +M434 A1040 +M435 A935 +M436 A9 +M437 A816 +M438 A1050 +M439 A287 +M440 A123 +M441 A671 +M442 A245 +M443 A950 +M444 A1345 +M445 A9 +M446 A245 +M447 A982 +M448 A423 +M449 A1345 +M450 A1048 +M451 A1127 +M452 A219 +M453 A1393 +M454 A1213 +M455 A903 +M456 A982 +M457 A224 +M458 A982 +M460 A1345 +M461 A861 +M462 A831 +M463 A1179 +M464 A591 +M465 A419 +M467 A1305 +M468 A1127 +M469 A246 +M470 A178 +M471 A566 +M472 A411 +M474 A861 +M475 A70 +M476 A1179 +M478 A1345 +M481 A753 +M482 A242 +M483 A1054 +M484 A1214 +M486 A982 +M487 A351 +M488 A1039 +M490 A808 +M491 A245 +M492 A993 +M493 A363 +M496 A691 +M498 A1024 +M499 A1000 +M500 A593 +M501 A1373 +M503 A667 +M505 A1047 +M508 A593 +M509 A1131 +M510 A490 +M512 A831 +M513 A698 +M514 A197 +M515 A1024 +M516 A340 +M517 A1305 +M520 A448 +M521 A590 +M522 A1009 +M523 A1291 +M524 A445 +M525 A687 +M526 A1054 +M527 A133 +M528 A903 +M529 A1314 +M530 A982 +M531 A988 +M532 A248 +M534 A9 +M535 A1345 +M536 A224 +M538 A961 +M540 A831 +M541 A577 +M542 A391 +M544 A36 +M545 A1188 +M546 A245 +M547 A328 +M548 A580 +M549 A982 +M550 A1345 +M551 A245 +M552 A458 +M553 A233 +M554 A580 +M556 A351 +M557 A566 +M558 A1290 +M560 A691 +M561 A546 +M562 A964 +M564 A1350 +M565 A903 +M566 A139 +M568 A550 +M569 A982 +M570 A645 +M571 A29 +M572 A936 +M574 A641 +M576 A968 +M577 A363 +M579 A851 +M580 A284 +M581 A904 +M582 A970 +M583 A53 +M584 A246 +M585 A1373 +M587 A701 +M588 A539 +M589 A591 +M590 A36 +M591 A245 +M592 A317 +M594 A1050 +M595 A851 +M596 A963 +M597 A423 +M598 A1350 +M599 A908 +M600 A443 +M601 A773 +M602 A1345 +M603 A1103 +M604 A286 +M605 A1048 +M606 A66 +M607 A90 +M609 A1179 +M610 A580 +M611 A178 +M612 A349 +M613 A808 +M614 A36 +M615 A571 +M618 A245 +M620 A1272 +M625 A99 +M627 A1352 +M628 A363 +M631 A39 +M632 A577 +M633 A590 +M635 A419 +M638 A803 +M639 A197 +M641 A219 +M642 A590 +M643 A754 +M644 A907 +M646 A968 +M648 A224 +M650 A1310 +M651 A567 +M652 A9 +M653 A338 +M654 A1127 +M655 A224 +M656 A1282 +M657 A1052 +M658 A1054 +M659 A224 +M660 A29 +M661 A808 +M662 A1040 +M663 A336 +M664 A977 +M665 A363 +M666 A352 +M667 A245 +M668 A903 +M669 A246 +M671 A1050 +M672 A229 +M673 A1009 +M674 A713 +M675 A1117 +M676 A1365 +M677 A1215 +M678 A1141 +M679 A816 +M682 A885 +M683 A178 +M684 A550 +M686 A245 +M687 A313 +M690 A645 +M691 A338 +M692 A566 +M693 A928 +M694 A710 +M695 A1380 +M696 A903 +M697 A585 +M698 A546 +M699 A566 +M701 A643 +M702 A550 +M707 A29 +M708 A571 +M709 A908 +M710 A577 +M711 A1121 +M712 A224 +M714 A1339 +M715 A304 +M716 A351 +M718 A122 +M719 A681 +M721 A661 +M722 A1179 +M724 A816 +M725 A216 +M726 A363 +M728 A1050 +M729 A1120 +M731 A910 +M732 A903 +M733 A245 +M734 A197 +M735 A974 +M736 A1050 +M737 A36 +M738 A308 +M739 A1050 +M740 A1272 +M742 A351 +M743 A706 +M745 A588 +M746 A1179 +M747 A1040 +M748 A821 +M749 A817 +M751 A935 +M753 A698 +M754 A253 +M755 A778 +M760 A118 +M761 A287 +M763 A631 +M764 A1108 +M766 A567 +M767 A9 +M768 A1256 +M769 A826 +M770 A383 +M771 A1122 +M772 A351 +M773 A964 +M774 A246 +M778 A713 +M779 A1135 +M781 A103 +M783 A577 +M784 A577 +M785 A245 +M786 A1040 +M787 A351 +M788 A831 +M789 A1048 +M793 A582 +M794 A99 +M795 A572 +M796 A974 +M798 A958 +M799 A326 +M801 A188 +M802 A603 +M803 A279 +M804 A550 +M805 A691 +M806 A974 +M807 A742 +M808 A816 +M809 A133 +M811 A910 +M813 A772 +M814 A123 +M815 A1072 +M817 A260 +M818 A1206 +M821 A1120 +M822 A928 +M823 A54 +M824 A1141 +M827 A1127 +M828 A982 +M829 A546 +M830 A1382 +M831 A903 +M832 A826 +M834 A1373 +M835 A36 +M836 A224 +M837 A98 +M838 A577 +M840 A119 +M841 A445 +M842 A1009 +M843 A691 +M844 A1245 +M845 A224 +M846 A1157 +M847 A141 +M848 A1179 +M849 A506 +M850 A1179 +M851 A1009 +M852 A421 +M853 A1199 +M854 A903 +M855 A151 +M856 A1040 +M858 A865 +M859 A363 +M860 A245 +M861 A75 +M862 A284 +M863 A399 +M864 A19 +M865 A423 +M866 A177 +M868 A577 +M869 A1111 +M871 A886 +M872 A1290 +M873 A808 +M874 A351 +M876 A1382 +M877 A133 +M878 A1127 +M879 A577 +M880 A908 +M881 A214 +M882 A242 +M886 A147 +M887 A1038 +M889 A605 +M890 A573 +M891 A363 +M892 A844 +M893 A1009 +M894 A363 +M895 A197 +M896 A263 +M898 A1395 +M900 A156 +M901 A826 +M902 A762 +M903 A1213 +M904 A1345 +M905 A742 +M906 A1024 +M907 A908 +M908 A855 +M909 A1340 +M910 A1040 +M911 A219 +M912 A1376 +M913 A1393 +M914 A51 +M915 A123 +M916 A1142 +M917 A650 +M918 A1117 +M920 A577 +M923 A326 +M924 A1166 +M925 A1131 +M926 A39 +M929 A996 +M930 A1050 +M931 A1157 +M932 A10 +M933 A591 +M934 A566 +M935 A1345 +M937 A246 +M938 A550 +M939 A349 +M940 A178 +M941 A123 +M942 A36 +M943 A246 +M944 A29 +M945 A742 +M946 A1179 +M947 A739 +M948 A371 +M949 A974 +M950 A903 +M951 A123 +M953 A383 +M954 A1048 +M955 A1089 +M956 A831 +M957 A1235 +M958 A419 +M959 A36 +M960 A1039 +M964 A193 +M965 A284 +M966 A317 +M967 A1104 +M968 A196 +M969 A351 +M970 A702 +M972 A842 +M973 A977 +M974 A250 +M975 A656 +M977 A1127 +M978 A1245 +M979 A1235 +M980 A595 +M981 A222 +M982 A962 +M983 A1040 +M984 A1316 +M987 A1179 +M989 A1120 +M990 A219 +M991 A1192 +M993 A698 +M995 A1199 +M996 A562 +M997 A351 +M998 A383 +M999 A628 +M1000 A954 +M1001 A245 +M1003 A1290 +M1004 A977 +M1005 A1043 +M1006 A1345 +M1008 A1373 +M1009 A1048 +M1010 A550 +M1011 A1235 +M1012 A337 +M1013 A419 +M1014 A250 +M1015 A1024 +M1017 A1039 +M1018 A1043 +M1019 A1287 +M1020 A778 +M1021 A70 +M1022 A1043 +M1025 A66 +M1026 A908 +M1027 A1032 +M1028 A591 +M1029 A1141 +M1030 A9 +M1031 A1310 +M1032 A903 +M1033 A520 +M1034 A816 +M1036 A619 +M1037 A831 +M1038 A542 +M1039 A566 +M1040 A375 +M1041 A1054 +M1042 A1179 +M1043 A885 +M1045 A1310 +M1046 A713 +M1048 A1235 +M1049 A1054 +M1050 A691 +M1051 A903 +M1052 A826 +M1053 A419 +M1054 A961 +M1055 A1131 +M1058 A296 +M1059 A57 +M1060 A363 +M1063 A246 +M1065 A246 +M1066 A197 +M1067 A443 +M1068 A539 +M1069 A1179 +M1070 A1215 +M1072 A1139 +M1073 A697 +M1074 A419 +M1075 A586 +M1076 A1076 +M1077 A490 +M1078 A243 +M1079 A1179 +M1080 A670 +M1081 A9 +M1082 A566 +M1083 A482 +M1084 A1054 +M1085 A1179 +M1086 A996 +M1087 A987 +M1088 A14 +M1089 A963 +M1090 A349 +M1091 A320 +M1092 A916 +M1093 A578 +M1094 A51 +M1095 A1235 +M1096 A742 +M1097 A363 +M1098 A223 +M1100 A490 +M1102 A236 +M1103 A1141 +M1104 A473 +M1105 A1272 +M1106 A714 +M1107 A208 +M1108 A1384 +M1109 A306 +M1110 A1353 +M1111 A903 +M1112 A561 +M1113 A81 +M1114 A219 +M1115 A245 +M1116 A1373 +M1118 A864 +M1120 A86 +M1122 A95 +M1123 A1046 +M1124 A351 +M1125 A808 +M1126 A817 +M1127 A318 +M1128 A338 +M1129 A954 +M1130 A903 +M1131 A588 +M1134 A194 +M1137 A740 +M1138 A566 +M1139 A908 +M1140 A577 +M1141 A363 +M1142 A338 +M1144 A340 +M1145 A1038 +M1146 A1073 +M1147 A335 +M1148 A1345 +M1149 A9 +M1151 A1050 +M1153 A816 +M1154 A349 +M1155 A246 +M1156 A894 +M1157 A831 +M1158 A920 +M1159 A313 +M1161 A1382 +M1162 A9 +M1163 A340 +M1164 A1065 +M1166 A501 +M1167 A70 +M1168 A577 +M1170 A903 +M1171 A19 +M1172 A948 +M1173 A910 +M1176 A679 +M1177 A1146 +M1179 A389 +M1181 A245 +M1183 A1300 +M1184 A209 +M1185 A287 +M1186 A1117 +M1187 A993 +M1188 A1365 +M1189 A974 +M1190 A1376 +M1191 A363 +M1192 A1235 +M1195 A224 +M1196 A925 +M1201 A1365 +M1203 A1127 +M1204 A714 +M1205 A566 +M1206 A831 +M1207 A1048 +M1208 A1024 +M1209 A577 +M1210 A722 +M1211 A1151 +M1212 A1023 +M1213 A861 +M1214 A546 +M1215 A698 +M1216 A1097 +M1217 A1275 +M1218 A1018 +M1219 A698 +M1220 A336 +M1221 A111 +M1222 A223 +M1224 A224 +M1225 A559 +M1227 A768 +M1228 A762 +M1230 A580 +M1231 A550 +M1232 A419 +M1233 A826 +M1234 A1235 +M1237 A271 +M1238 A695 +M1239 A450 +M1240 A742 +M1242 A607 +M1243 A645 +M1246 A351 +M1247 A1040 +M1248 A808 +M1250 A303 +M1251 A876 +M1253 A1329 +M1255 A390 +M1256 A1106 +M1257 A903 +M1258 A471 +M1263 A1235 +M1264 A143 +M1266 A768 +M1267 A419 +M1268 A697 +M1269 A224 +M1271 A997 +M1272 A66 +M1273 A861 +M1274 A754 +M1275 A1274 +M1276 A119 +M1277 A257 +M1278 A1039 +M1280 A767 +M1281 A577 +M1282 A1381 +M1283 A1232 +M1284 A70 +M1285 A577 +M1286 A46 +M1287 A556 +M1288 A197 +M1290 A762 +M1291 A903 +M1292 A363 +M1293 A1043 +M1295 A1048 +M1296 A133 +M1298 A92 +M1299 A217 +M1301 A259 +M1303 A681 +M1304 A490 +M1305 A1073 +M1306 A652 +M1307 A1007 +M1308 A704 +M1310 A844 +M1311 A631 +M1312 A754 +M1313 A521 +M1314 A1035 +M1317 A947 +M1318 A196 +M1319 A104 +M1320 A133 +M1321 A392 +M1322 A117 +M1325 A1035 +M1326 A593 +M1328 A471 +M1332 A1024 +M1333 A968 +M1334 A709 +M1336 A1395 +M1337 A577 +M1338 A850 +M1339 A1 +M1340 A908 +M1341 A65 +M1342 A1345 +M1344 A78 +M1345 A39 +M1348 A1179 +M1349 A14 +M1353 A817 +M1354 A742 +M1355 A698 +M1356 A55 +M1357 A648 +M1358 A340 +M1359 A444 +M1360 A1373 +M1362 A107 +M1363 A1048 +M1365 A617 +M1366 A546 +M1368 A363 +M1369 A317 +M1370 A589 +M1371 A698 +M1373 A99 +M1374 A1025 +M1375 A245 +M1377 A9 +M1378 A885 +M1379 A1179 +M1380 A956 +M1383 A750 +M1386 A9 +M1387 A242 +M1388 A1373 +M1389 A562 +M1390 A741 +M1391 A275 +M1392 A808 +M1393 A312 +M1394 A327 +M1395 A678 +M1396 A1007 +M1397 A123 +M1399 A628 +M1400 A671 +M1401 A1232 +M1402 A252 +M1405 A741 +M1406 A1235 +M1407 A351 +M1408 A714 +M1409 A425 +M1410 A1393 +M1411 A577 +M1412 A1235 +M1414 A1007 +M1415 A51 +M1416 A1235 +M1417 A705 +M1418 A328 +M1419 A654 +M1420 A742 +M1421 A847 +M1422 A219 +M1423 A880 +M1424 A1035 +M1425 A400 +M1426 A1157 +M1427 A1018 +M1428 A224 +M1429 A1179 +M1431 A591 +M1433 A591 +M1434 A1367 +M1436 A742 +M1437 A1141 +M1438 A1207 +M1439 A698 +M1440 A1157 +M1441 A379 +M1443 A1124 +M1445 A1111 +M1449 A742 +M1450 A38 +M1451 A815 +M1452 A1039 +M1453 A219 +M1454 A448 +M1456 A709 +M1457 A308 +M1458 A691 +M1460 A1010 +M1461 A1312 +M1462 A1235 +M1463 A577 +M1464 A102 +M1467 A243 +M1471 A1040 +M1472 A630 +M1474 A1149 +M1475 A338 +M1476 A87 +M1477 A318 +M1478 A816 +M1479 A762 +M1480 A691 +M1483 A714 +M1484 A618 +M1485 A180 +M1486 A1235 +M1487 A201 +M1488 A109 +M1489 A107 +M1490 A178 +M1492 A211 +M1493 A389 +M1495 A760 +M1496 A338 +M1497 A1056 +M1498 A716 +M1500 A709 +M1501 A352 +M1502 A1213 +M1503 A139 +M1505 A1104 +M1508 A1341 +M1510 A14 +M1512 A1111 +M1513 A202 +M1514 A1054 +M1516 A903 +M1519 A742 +M1520 A281 +M1521 A908 +M1522 A858 +M1523 A1014 +M1524 A1050 +M1525 A636 +M1526 A1022 +M1530 A724 +M1533 A582 +M1534 A816 +M1535 A133 +M1538 A156 +M1539 A652 +M1540 A418 +M1541 A935 +M1542 A622 +M1543 A1048 +M1545 A995 +M1546 A349 +M1548 A577 +M1549 A1024 +M1551 A729 +M1552 A641 +M1553 A59 +M1554 A441 +M1555 A432 +M1556 A962 +M1558 A250 +M1559 A816 +M1560 A219 +M1561 A1008 +M1562 A903 +M1564 A326 +M1565 A1163 +M1567 A367 +M1568 A1048 +M1569 A1263 +M1571 A566 +M1573 A857 +M1574 A70 +M1575 A714 +M1576 A1179 +M1577 A1055 +M1578 A1048 +M1579 A808 +M1580 A64 +M1581 A546 +M1582 A1381 +M1584 A352 +M1585 A118 +M1586 A1345 +M1587 A1245 +M1588 A224 +M1589 A1127 +M1591 A566 +M1592 A383 +M1593 A880 +M1594 A196 +M1595 A571 +M1596 A661 +M1597 A6 +M1598 A243 +M1599 A327 +M1600 A9 +M1601 A1348 +M1603 A1308 +M1604 A977 +M1605 A577 +M1606 A383 +M1607 A1310 +M1610 A931 +M1611 A808 +M1612 A698 +M1613 A237 +M1615 A338 +M1616 A643 +M1617 A390 +M1618 A714 +M1619 A1157 +M1621 A863 +M1624 A243 +M1626 A645 +M1627 A249 +M1630 A964 +M1633 A367 +M1636 A908 +M1637 A993 +M1638 A856 +M1639 A929 +M1640 A1010 +M1642 A742 +M1645 A641 +M1646 A103 +M1647 A566 +M1648 A1163 +M1649 A277 +M1650 A18 +M1651 A29 +M1652 A1165 +M1654 A1319 +M1655 A577 +M1657 A1048 +M1660 A1390 +M1661 A224 +M1662 A1018 +M1665 A36 +M1666 A1007 +M1668 A349 +M1672 A1377 +M1673 A564 +M1674 A714 +M1675 A1179 +M1676 A560 +M1677 A722 +M1680 A1106 +M1681 A1007 +M1682 A1122 +M1683 A1141 +M1685 A46 +M1688 A641 +M1689 A197 +M1690 A317 +M1691 A245 +M1692 A1379 +M1694 A1376 +M1696 A112 +M1699 A826 +M1701 A1040 +M1703 A708 +M1705 A918 +M1707 A9 +M1708 A359 +M1711 A411 +M1712 A89 +M1713 A1179 +M1714 A577 +M1715 A28 +M1716 A197 +M1718 A349 +M1719 A376 +M1722 A178 +M1725 A816 +M1726 A908 +M1728 A858 +M1734 A589 +M1735 A843 +M1738 A1213 +M1739 A519 +M1741 A111 +M1742 A418 +M1743 A1179 +M1744 A588 +M1747 A591 +M1749 A566 +M1751 A9 +M1752 A714 +M1753 A742 +M1754 A996 +M1755 A1175 +M1756 A383 +M1757 A894 +M1759 A147 +M1760 A550 +M1762 A1048 +M1763 A740 +M1764 A577 +M1765 A530 +M1768 A1141 +M1770 A410 +M1771 A154 +M1772 A1171 +M1773 A985 +M1774 A908 +M1775 A473 +M1777 A566 +M1778 A419 +M1779 A1290 +M1780 A935 +M1783 A1051 +M1785 A399 +M1786 A452 +M1787 A816 +M1789 A321 +M1792 A1018 +M1794 A1024 +M1797 A1145 +M1798 A648 +M1801 A698 +M1803 A425 +M1804 A44 +M1805 A974 +M1806 A9 +M1807 A62 +M1808 A422 +M1811 A284 +M1812 A245 +M1813 A546 +M1814 A929 +M1815 A173 +M1816 A754 +M1820 A550 +M1821 A123 +M1822 A692 +M1824 A741 +M1825 A246 +M1826 A301 +M1827 A577 +M1828 A1272 +M1829 A577 +M1830 A1352 +M1832 A893 +M1833 A1089 +M1834 A590 +M1835 A1111 +M1837 A758 +M1838 A910 +M1839 A661 +M1840 A935 +M1841 A246 +M1844 A72 +M1845 A408 +M1846 A1110 +M1847 A546 +M1848 A36 +M1849 A974 +M1850 A66 +M1851 A880 +M1852 A1039 +M1853 A789 +M1854 A577 +M1857 A602 +M1859 A1317 +M1861 A881 +M1862 A641 +M1864 A1117 +M1865 A716 +M1867 A591 +M1868 A1050 +M1869 A977 +M1870 A519 +M1871 A419 +M1872 A311 +M1873 A14 +M1874 A419 +M1875 A562 +M1876 A856 +M1877 A414 +M1879 A266 +M1881 A1326 +M1882 A1066 +M1884 A577 +M1885 A375 +M1886 A934 +M1888 A756 +M1889 A584 +M1890 A748 +M1891 A1039 +M1892 A66 +M1893 A19 +M1895 A874 +M1896 A747 +M1898 A742 +M1899 A857 +M1900 A419 +M1901 A577 +M1903 A577 +M1904 A789 +M1905 A51 +M1906 A197 +M1907 A772 +M1908 A1046 +M1909 A698 +M1910 A240 +M1914 A149 +M1915 A1066 +M1917 A562 +M1918 A400 +M1919 A1350 +M1920 A340 +M1921 A51 +M1924 A19 +M1925 A714 +M1926 A349 +M1928 A267 +M1929 A1157 +M1933 A97 +M1935 A273 +M1937 A9 +M1939 A1048 +M1940 A367 +M1941 A856 +M1943 A634 +M1944 A1054 +M1945 A1179 +M1948 A349 +M1949 A1035 +M1952 A982 +M1958 A49 +M1959 A90 +M1961 A467 +M1962 A965 +M1965 A683 +M1966 A713 +M1967 A1155 +M1969 A376 +M1970 A645 +M1971 A56 +M1973 A964 +M1974 A389 +M1976 A688 +M1978 A713 +M1979 A996 +M1980 A777 +M1981 A338 +M1982 A687 +M1984 A93 +M1985 A691 +M1986 A329 +M1987 A237 +M1989 A250 +M1992 A841 +M1993 A808 +M1994 A724 +M1995 A1043 +M1998 A301 +M1999 A156 +M2000 A51 +M2003 A405 +M2005 A903 +M2007 A360 +M2008 A1186 +M2011 A539 +M2015 A209 +M2016 A1127 +M2017 A885 +M2018 A425 +M2019 A363 +M2020 A947 +M2021 A468 +M2022 A1039 +M2023 A382 +M2024 A245 +M2025 A513 +M2026 A29 +M2027 A340 +M2028 A628 +M2031 A9 +M2033 A789 +M2034 A133 +M2035 A695 +M2036 A863 +M2038 A284 +M2039 A1116 +M2040 A722 +M2041 A482 +M2042 A1235 +M2043 A1024 +M2046 A36 +M2047 A826 +M2048 A562 +M2049 A1043 +M2050 A982 +M2051 A566 +M2052 A1009 +M2053 A367 +M2054 A789 +M2055 A383 +M2056 A1373 +M2057 A1054 +M2058 A974 +M2059 A1054 +M2060 A1024 +M2062 A1039 +M2063 A918 +M2065 A349 +M2069 A767 +M2070 A464 +M2071 A910 +M2072 A924 +M2076 A973 +M2081 A1199 +M2082 A946 +M2083 A1052 +M2084 A546 +M2085 A36 +M2086 A977 +M2087 A222 +M2088 A1076 +M2090 A1112 +M2091 A513 +M2093 A1038 +M2094 A373 +M2095 A351 +M2096 A808 +M2099 A1073 +M2101 A350 +M2102 A743 +M2103 A46 +M2104 A29 +M2105 A974 +M2107 A974 +M2108 A861 +M2109 A816 +M2110 A202 +M2111 A1043 +M2113 A66 +M2115 A691 +M2118 A109 +M2121 A1010 +M2122 A51 +M2123 A870 +M2124 A577 +M2126 A826 +M2127 A1111 +M2128 A444 +M2129 A340 +M2132 A977 +M2133 A677 +M2134 A418 +M2136 A1127 +M2137 A287 +M2138 A43 +M2139 A1318 +M2140 A816 +M2141 A318 +M2144 A1339 +M2146 A641 +M2149 A287 +M2151 A117 +M2152 A566 +M2153 A876 +M2154 A651 +M2156 A655 +M2157 A1019 +M2158 A808 +M2160 A867 +M2161 A870 +M2162 A1089 +M2163 A428 +M2164 A1022 +M2165 A571 +M2166 A104 +M2167 A17 +M2168 A775 +M2170 A785 +M2171 A1172 +M2172 A1154 +M2173 A772 +M2174 A229 +M2175 A1109 +M2176 A636 +M2177 A742 +M2179 A1168 +M2180 A870 +M2181 A1157 +M2184 A1047 +M2189 A842 +M2190 A1068 +M2192 A151 +M2193 A300 +M2194 A191 +M2195 A1068 +M2196 A414 +M2198 A1127 +M2199 A591 +M2203 A324 +M2204 A178 +M2205 A531 +M2208 A1090 +M2209 A61 +M2212 A910 +M2214 A167 +M2217 A782 +M2218 A1111 +M2219 A630 +M2220 A1241 +M2221 A778 +M2222 A816 +M2223 A156 +M2224 A1089 +M2225 A1127 +M2226 A710 +M2230 A833 +M2231 A593 +M2232 A996 +M2234 A322 +M2236 A842 +M2237 A523 +M2239 A250 +M2242 A1336 +M2243 A556 +M2244 A196 +M2245 A80 +M2246 A690 +M2247 A1131 +M2248 A284 +M2249 A982 +M2250 A885 +M2251 A260 +M2253 A855 +M2255 A1040 +M2260 A1043 +M2262 A885 +M2263 A730 +M2267 A246 +M2268 A1319 +M2269 A453 +M2270 A1048 +M2273 A423 +M2274 A816 +M2275 A1213 +M2277 A691 +M2278 A903 +M2279 A948 +M2280 A802 +M2282 A1018 +M2284 A129 +M2285 A506 +M2286 A156 +M2287 A881 +M2289 A123 +M2290 A577 +M2291 A987 +M2292 A418 +M2293 A749 +M2294 A577 +M2296 A1178 +M2297 A432 +M2298 A818 +M2305 A741 +M2306 A1346 +M2308 A1213 +M2310 A539 +M2311 A1040 +M2312 A908 +M2314 A592 +M2315 A769 +M2316 A1047 +M2317 A1304 +M2319 A826 +M2321 A743 +M2323 A677 +M2324 A1237 +M2326 A947 +M2329 A826 +M2330 A94 +M2331 A242 +M2333 A178 +M2334 A1006 +M2337 A165 +M2343 A318 +M2344 A2 +M2346 A640 +M2352 A1141 +M2354 A519 +M2355 A699 +M2356 A31 +M2357 A411 +M2358 A197 +M2359 A12 +M2360 A35 +M2361 A1149 +M2363 A1365 +M2364 A153 +M2367 A827 +M2368 A366 +M2372 A94 +M2375 A419 +M2377 A426 +M2378 A482 +M2380 A695 +M2381 A1110 +M2383 A1345 +M2386 A903 +M2387 A310 +M2389 A742 +M2391 A529 +M2392 A956 +M2393 A224 +M2395 A718 +M2396 A425 +M2397 A1111 +M2398 A423 +M2399 A903 +M2400 A703 +M2401 A692 +M2402 A1007 +M2403 A29 +M2404 A13 +M2405 A743 +M2407 A1021 +M2408 A346 +M2409 A531 +M2411 A795 +M2413 A903 +M2414 A562 +M2415 A1259 +M2418 A1179 +M2420 A1089 +M2421 A546 +M2424 A690 +M2425 A577 +M2428 A548 +M2429 A910 +M2430 A881 +M2431 A295 +M2432 A1122 +M2433 A885 +M2434 A991 +M2435 A156 +M2436 A1254 +M2437 A1345 +M2439 A1073 +M2442 A1153 +M2443 A1354 +M2446 A727 +M2449 A742 +M2450 A698 +M2452 A713 +M2454 A685 +M2455 A993 +M2456 A762 +M2457 A881 +M2463 A593 +M2465 A1079 +M2469 A700 +M2470 A303 +M2473 A1059 +M2474 A577 +M2475 A562 +M2476 A527 +M2481 A1075 +M2482 A624 +M2485 A1176 +M2486 A66 +M2488 A628 +M2489 A227 +M2490 A561 +M2492 A1089 +M2493 A19 +M2495 A1317 +M2496 A1117 +M2497 A86 +M2498 A1012 +M2499 A340 +M2501 A196 +M2502 A12 +M2503 A158 +M2508 A603 +M2509 A571 +M2510 A1374 +M2513 A961 +M2516 A13 +M2517 A1310 +M2520 A1024 +M2521 A20 +M2523 A754 +M2527 A937 +M2531 A876 +M2532 A1040 +M2533 A754 +M2534 A1327 +M2535 A996 +M2536 A243 +M2538 A1008 +M2539 A591 +M2542 A1352 +M2543 A1092 +M2544 A1024 +M2546 A70 +M2547 A245 +M2548 A379 +M2553 A533 +M2554 A648 +M2556 A415 +M2560 A974 +M2562 A1157 +M2563 A1245 +M2565 A698 +M2567 A79 +M2568 A903 +M2570 A847 +M2571 A1367 +M2572 A1179 +M2577 A881 +M2578 A987 +M2579 A775 +M2582 A317 +M2583 A929 +M2584 A861 +M2589 A1206 +M2590 A1046 +M2592 A1091 +M2599 A1239 +M2600 A1052 +M2601 A876 +M2602 A328 +M2603 A1048 +M2604 A1050 +M2606 A1235 +M2607 A51 +M2608 A772 +M2611 A1340 +M2613 A9 +M2614 A856 +M2615 A1256 +M2616 A1155 +M2617 A1018 +M2619 A1089 +M2620 A1123 +M2622 A900 +M2623 A1339 +M2624 A636 +M2625 A826 +M2626 A1073 +M2627 A399 +M2628 A1227 +M2629 A577 +M2630 A577 +M2632 A36 +M2634 A1355 +M2636 A577 +M2638 A641 +M2639 A562 +M2640 A1024 +M2641 A214 +M2642 A58 +M2644 A1182 +M2645 A1186 +M2646 A109 +M2647 A807 +M2648 A800 +M2650 A419 +M2651 A964 +M2652 A1179 +M2653 A383 +M2655 A281 +M2658 A1312 +M2659 A400 +M2660 A677 +M2664 A974 +M2666 A808 +M2667 A961 +M2668 A477 +M2669 A549 +M2672 A1129 +M2675 A833 +M2677 A383 +M2678 A311 +M2679 A254 +M2680 A317 +M2681 A240 +M2682 A178 +M2683 A831 +M2687 A775 +M2689 A243 +M2691 A1373 +M2692 A222 +M2694 A1353 +M2695 A881 +M2698 A1339 +M2700 A577 +M2703 A831 +M2704 A411 +M2705 A927 +M2706 A133 +M2707 A910 +M2709 A51 +M2710 A117 +M2714 A562 +M2716 A351 +M2717 A186 +M2719 A1307 +M2721 A1040 +M2723 A1043 +M2725 A808 +M2726 A359 +M2728 A882 +M2731 A1043 +M2733 A506 +M2736 A1345 +M2738 A655 +M2741 A539 +M2742 A161 +M2746 A396 +M2755 A1048 +M2757 A219 +M2760 A977 +M2761 A851 +M2763 A1222 +M2764 A246 +M2768 A1050 +M2771 A93 +M2772 A363 +M2773 A368 +M2776 A857 +M2777 A1127 +M2778 A841 +M2779 A492 +M2780 A29 +M2781 A714 +M2784 A1303 +M2785 A920 +M2787 A1155 +M2788 A1319 +M2789 A99 +M2790 A422 +M2793 A778 +M2794 A577 +M2795 A400 +M2796 A1345 +M2798 A1227 +M2800 A412 +M2803 A156 +M2804 A844 +M2805 A250 +M2806 A502 +M2808 A499 +M2809 A51 +M2811 A1202 +M2813 A120 +M2815 A1081 +M2816 A351 +M2818 A399 +M2819 A641 +M2820 A773 +M2821 A1004 +M2822 A546 +M2823 A482 +M2825 A156 +M2826 A1281 +M2827 A118 +M2829 A882 +M2831 A974 +M2832 A591 +M2833 A1193 +M2835 A1039 +M2836 A70 +M2837 A577 +M2838 A386 +M2840 A645 +M2841 A645 +M2842 A1190 +M2844 A1175 +M2845 A338 +M2848 A653 +M2850 A949 +M2851 A1146 +M2852 A889 +M2856 A533 +M2857 A519 +M2859 A1116 +M2860 A648 +M2862 A762 +M2864 A698 +M2865 A1272 +M2867 A256 +M2868 A889 +M2869 A1117 +M2876 A1345 +M2877 A692 +M2878 A531 +M2880 A419 +M2882 A1039 +M2883 A418 +M2886 A519 +M2887 A1141 +M2888 A318 +M2891 A1265 +M2895 A270 +M2896 A1179 +M2898 A178 +M2900 A1235 +M2901 A281 +M2902 A1381 +M2905 A383 +M2907 A257 +M2908 A1111 +M2910 A803 +M2912 A1235 +M2915 A958 +M2916 A44 +M2917 A870 +M2918 A1245 +M2920 A688 +M2921 A368 +M2922 A386 +M2923 A425 +M2926 A566 +M2928 A349 +M2929 A245 +M2930 A577 +M2931 A1252 +M2932 A928 +M2933 A390 +M2934 A1184 +M2937 A1357 +M2938 A591 +M2939 A453 +M2942 A80 +M2944 A1125 +M2945 A1382 +M2948 A351 +M2949 A861 +M2951 A59 +M2953 A208 +M2954 A857 +M2955 A1139 +M2957 A162 +M2959 A1033 +M2961 A773 +M2962 A242 +M2963 A816 +M2965 A1110 +M2966 A1064 +M2967 A243 +M2968 A661 +M2969 A974 +M2970 A957 +M2971 A546 +M2974 A850 +M2979 A775 +M2980 A1371 +M2981 A717 +M2983 A1187 +M2984 A1265 +M2985 A117 +M2986 A5 +M2989 A935 +M2994 A305 +M2995 A954 +M2997 A398 +M2998 A1263 +M3000 A899 +M3001 A93 +M3002 A48 +M3003 A513 +M3004 A707 +M3007 A515 +M3008 A485 +M3010 A274 +M3013 A868 +M3016 A849 +M3017 A816 +M3019 A1321 +M3023 A1170 +M3024 A566 +M3026 A685 +M3027 A438 +M3028 A334 +M3029 A826 +M3030 A867 +M3031 A1222 +M3035 A394 +M3036 A94 +M3037 A712 +M3038 A765 +M3039 A414 +M3040 A86 +M3041 A265 +M3042 A625 +M3045 A363 +M3046 A1069 +M3048 A945 +M3050 A29 +M3053 A550 +M3054 A1117 +M3055 A419 +M3058 A742 +M3060 A794 +M3061 A971 +M3062 A661 +M3063 A411 +M3064 A1146 +M3066 A56 +M3067 A156 +M3069 A1207 +M3070 A726 +M3071 A820 +M3075 A525 +M3076 A677 +M3078 A756 +M3080 A37 +M3082 A1129 +M3086 A813 +M3089 A591 +M3091 A86 +M3092 A1048 +M3093 A762 +M3094 A965 +M3095 A1024 +M3096 A648 +M3097 A86 +M3098 A656 +M3099 A199 +M3100 A1050 +M3102 A755 +M3103 A414 +M3104 A982 +M3105 A1256 +M3106 A1127 +M3107 A581 +M3108 A1111 +M3111 A739 +M3112 A771 +M3113 A103 +M3114 A920 +M3116 A79 +M3117 A816 +M3119 A273 +M3120 A351 +M3122 A1315 +M3123 A543 +M3124 A445 +M3125 A421 +M3127 A1 +M3128 A1050 +M3130 A107 +M3132 A1318 +M3133 A1056 +M3135 A714 +M3138 A228 +M3139 A1048 +M3140 A980 +M3143 A1086 +M3144 A1179 +M3148 A546 +M3150 A550 +M3155 A214 +M3156 A482 +M3158 A785 +M3160 A1157 +M3161 A571 +M3163 A478 +M3164 A1393 +M3165 A590 +M3166 A717 +M3168 A1293 +M3170 A742 +M3173 A523 +M3175 A1092 +M3179 A1155 +M3182 A475 +M3184 A1376 +M3185 A988 +M3186 A826 +M3188 A1310 +M3192 A101 +M3193 A961 +M3196 A42 +M3200 A90 +M3201 A1043 +M3202 A1384 +M3203 A942 +M3205 A687 +M3206 A1035 +M3209 A857 +M3210 A550 +M3212 A831 +M3213 A803 +M3214 A1039 +M3215 A1123 +M3216 A993 +M3219 A723 +M3220 A1294 +M3227 A1330 +M3228 A778 +M3231 A1180 +M3233 A282 +M3240 A1303 +M3253 A1260 +M3255 A1057 +M3256 A199 +M3258 A885 +M3260 A920 +M3262 A1083 +M3264 A1294 +M3267 A697 +M3271 A1040 +M3272 A880 +M3274 A329 +M3276 A525 +M3277 A107 +M3278 A1090 +M3281 A1055 +M3282 A490 +M3284 A865 +M3285 A1317 +M3287 A649 +M3288 A342 +M3290 A1 +M3291 A340 +M3294 A1274 +M3296 A1364 +M3297 A831 +M3300 A477 +M3302 A14 +M3304 A661 +M3306 A191 +M3307 A208 +M3308 A826 +M3314 A1202 +M3317 A577 +M3320 A359 +M3331 A513 +M3332 A340 +M3337 A1131 +M3338 A524 +M3343 A1281 +M3344 A525 +M3345 A513 +M3347 A404 +M3351 A209 +M3353 A741 +M3355 A245 +M3358 A415 +M3360 A224 +M3362 A1238 +M3366 A199 +M3368 A338 +M3370 A259 +M3374 A1127 +M3377 A1321 +M3378 A1114 +M3380 A149 +M3382 A351 +M3384 A641 +M3386 A844 +M3387 A100 +M3389 A562 +M3390 A445 +M3391 A396 +M3393 A296 +M3394 A1091 +M3396 A808 +M3399 A1213 +M3400 A257 +M3401 A1046 +M3402 A937 +M3404 A506 +M3405 A51 +M3406 A523 +M3409 A555 +M3414 A1162 +M3417 A220 +M3421 A705 +M3424 A1024 +M3428 A137 +M3430 A1352 +M3434 A9 +M3435 A464 +M3438 A698 +M3439 A1068 +M3440 A28 +M3441 A40 +M3442 A1156 +M3443 A1145 +M3447 A698 +M3448 A340 +M3450 A614 +M3452 A961 +M3453 A305 +M3457 A689 +M3459 A1127 +M3461 A698 +M3463 A698 +M3465 A1055 +M3466 A197 +M3467 A369 +M3468 A338 +M3469 A1110 +M3470 A349 +M3472 A76 +M3473 A21 +M3475 A631 +M3476 A219 +M3477 A1040 +M3478 A831 +M3479 A855 +M3480 A1141 +M3483 A962 +M3484 A739 +M3485 A715 +M3488 A884 +M3489 A737 +M3491 A1351 +M3492 A1272 +M3493 A594 +M3494 A737 +M3496 A1036 +M3498 A64 +M3499 A677 +M3503 A355 +M3505 A1021 +M3508 A243 +M3510 A525 +M3511 A657 +M3512 A595 +M3514 A1381 +M3515 A617 +M3516 A1147 +M3519 A1050 +M3520 A1043 +M3527 A202 +M3530 A590 +M3531 A1118 +M3535 A844 +M3537 A1032 +M3540 A977 +M3542 A1141 +M3543 A334 +M3553 A438 +M3554 A400 +M3559 A417 +M3560 A914 +M3561 A1379 +M3562 A505 +M3566 A539 +M3567 A713 +M3569 A329 +M3570 A964 +M3574 A726 +M3575 A66 +M3577 A1115 +M3578 A612 +M3580 A1092 +M3582 A742 +M3586 A709 +M3587 A1213 +M3589 A1048 +M3591 A468 +M3592 A1235 +M3594 A1117 +M3595 A296 +M3596 A97 +M3597 A1371 +M3598 A1083 +M3599 A544 +M3602 A971 +M3603 A246 +M3605 A142 +M3607 A1047 +M3609 A550 +M3611 A1081 +M3618 A762 +M3619 A1213 +M3621 A274 +M3627 A617 +M3629 A327 +M3630 A952 +M3631 A217 +M3633 A614 +M3637 A1376 +M3638 A887 +M3640 A604 +M3641 A714 +M3647 A687 +M3648 A1290 +M3649 A814 +M3654 A383 +M3662 A716 +M3663 A1178 +M3664 A203 +M3668 A1256 +M3669 A406 +M3671 A621 +M3673 A977 +M3674 A974 +M3675 A156 +M3679 A1198 +M3680 A461 +M3681 A414 +M3688 A1350 +M3689 A506 +M3696 A724 +M3697 A1012 +M3699 A867 +M3704 A785 +M3709 A742 +M3711 A573 +M3713 A808 +M3714 A550 +M3716 A432 +M3718 A1092 +M3719 A1044 +M3726 A588 +M3727 A1129 +M3729 A1146 +M3730 A1086 +M3731 A199 +M3732 A228 +M3733 A885 +M3737 A13 +M3743 A550 +M3744 A1083 +M3746 A319 +M3753 A483 +M3760 A439 +M3762 A566 +M3765 A987 +M3767 A1393 +M3768 A1235 +M3769 A17 +M3771 A993 +M3773 A996 +M3775 A156 +M3776 A617 +M3778 A933 +M3779 A826 +M3781 A317 +M3782 A513 +M3783 A876 +M3784 A1078 +M3788 A250 +M3795 A1092 +M3803 A1053 +M3804 A1075 +M3805 A1245 +M3811 A1185 +M3812 A903 +M3817 A742 +M3821 A935 +M3823 A1068 +M3824 A208 +M3825 A659 +M3830 A622 +M3831 A383 +M3841 A319 +M3842 A598 +M3843 A795 +M3844 A117 +M3845 A1249 +M3846 A831 +M3848 A517 +M3849 A44 +M3852 A817 +M3853 A385 +M3854 A641 +M3857 A304 +M3859 A644 +M3869 A1088 +M3873 A783 +M3874 A947 +M3876 A38 +M3879 A1054 +M3880 A334 +M3882 A254 +M3883 A172 +M3884 A1213 +M3886 A627 +M3888 A974 +M3889 A881 +M3891 A826 +M3892 A389 +M3894 A903 +M3896 A612 +M3897 A65 +M3898 A127 +M3907 A974 +M3908 A1046 +M3910 A648 +M3911 A706 +M3912 A787 +M3913 A591 +M3915 A965 +M3916 A611 +M3918 A991 +M3919 A959 +M3920 A847 +M3921 A1382 +M3922 A1183 +M3924 A471 +M3925 A1339 +M3927 A150 +M3928 A83 +M3936 A375 +M3938 A903 +M3940 A250 +M3942 A895 +M3944 A620 +M3945 A1162 +M3947 A964 +M3952 A1127 +M3956 A485 +M3961 A1065 +M3967 A9 +M3968 A439 +M3969 A935 +M3972 A622 +M3980 A28 +M3981 A419 +M3984 A1111 +M3987 A1022 +M3988 A445 +M3991 A615 +M3994 A1336 +M3999 A691 +M4001 A700 +M4003 A365 +M4009 A886 +M4011 A1355 +M4019 A348 +M4023 A265 +M4025 A1235 +M4029 A657 +M4032 A910 +M4034 A707 +M4035 A553 +M4036 A1286 +M4041 A875 +M4044 A567 +M4046 A62 +M4050 A375 +M4051 A1007 +M4053 A604 +M4054 A649 +M4055 A954 +M4057 A64 +M4058 A356 +M4060 A951 +M4063 A760 +M4066 A952 +M4067 A1291 +M4068 A462 +M4072 A1064 +M4074 A312 +M4077 A261 +M4078 A1004 +M4085 A391 +M4086 A422 +M4091 A355 +M4092 A284 +M4096 A176 +M4097 A550 +M4098 A820 +M4099 A70 +M4100 A166 +M4101 A858 +M4102 A831 +M4103 A944 +M4104 A742 +M4105 A644 +M4110 A960 +M4112 A166 +M4118 A367 +M4120 A972 +M4124 A66 +M4128 A742 +M4132 A517 +M4135 A875 +M4137 A342 +M4141 A783 +M4145 A512 +M4151 A686 +M4158 A265 +M4159 A1158 +M4161 A101 +M4162 A830 +M4165 A875 +M4167 A24 +M4168 A265 +M4171 A922 +M4173 A742 +M4180 A601 +M4182 A1186 +M4183 A224 +M4188 A1127 +M4189 A553 +M4195 A90 +M4198 A1129 +M4202 A571 +M4208 A718 +M4212 A1007 +M4216 A1115 +M4220 A1 +M4222 A107 +M4223 A695 +M4226 A870 +M4230 A37 +M4231 A741 +M4239 A83 +M4247 A439 +M4250 A881 +M4252 A881 +M4254 A138 +M4256 A573 +M4259 A120 +M4265 A490 +M4266 A694 +M4268 A1110 +M4269 A655 +M4274 A351 +M4277 A698 +M4278 A1047 +M4279 A246 +M4282 A685 +M4286 A1194 +M4290 A993 +M4293 A1298 +M4295 A775 +M4302 A506 +M4303 A286 +M4308 A589 +M4313 A683 +M4315 A539 +M4316 A1008 +M4324 A881 +M4330 A641 +M4331 A342 +M4338 A649 +M4344 A139 +M4345 A801 +M4346 A1117 +M4350 A1018 +M4352 A742 +M4357 A795 +M4358 A119 +M4359 A1357 +M4362 A1286 +M4366 A855 +M4369 A977 +M4375 A699 +M4379 A422 +M4380 A1286 +M4381 A1111 +M4384 A919 +M4388 A787 +M4389 A200 +M4396 A566 +M4401 A147 +M4404 A1182 +M4405 A861 +M4408 A515 +M4411 A993 +M4412 A661 +M4413 A724 +M4419 A770 +M4421 A705 +M4423 A437 +M4432 A602 +M4437 A737 +M4446 A1050 +M4458 A816 +M4461 A332 +M4462 A1345 +M4466 A245 +M4472 A1143 +M4474 A1139 +M4481 A1286 +M4483 A255 +M4484 A1359 +M4485 A1214 +M4486 A1366 +M4489 A1127 +M4491 A1131 +M4493 A245 +M4494 A987 +M4496 A855 +M4498 A977 +M4511 A1298 +M4516 A919 +M4530 A363 +M4532 A1089 +M4533 A594 +M4535 A577 +M4541 A848 +M4543 A383 +M4551 A955 +M4556 A831 +M4557 A698 +M4563 A1040 +M4564 A672 +M4565 A1111 +M4568 A789 +M4569 A1072 +M4573 A265 +M4574 A746 +M4575 A588 +M4577 A1008 +M4584 A1265 +M4589 A46 +M4594 A514 +M4596 A871 +M4599 A1310 +M4606 A1333 +M4614 A581 +M4623 A61 +M4631 A861 +M4636 A464 +M4638 A119 +M4643 A659 +M4649 A36 +M4650 A338 +M4654 A273 +M4657 A944 +M4661 A1071 +M4667 A164 +M4674 A566 +M4677 A584 +M4679 A715 +M4680 A514 +M4681 A70 +M4685 A731 +M4690 A418 +M4691 A1087 +M4694 A1043 +M4695 A815 +M4710 A1218 +M4730 A418 +M4734 A793 +M4738 A793 +M4741 A463 +M4744 A672 +M4745 A1122 +M4752 A274 +M4761 A94 +M4762 A993 +M4765 A286 +M4773 A1014 +M4779 A999 +M4781 A604 +M4791 A260 +M4792 A1033 +M4795 A141 +M4804 A1093 +M4813 A365 +M4821 A1089 +M4822 A837 +M4830 A284 +M4839 A105 +M4842 A81 +M4852 A351 +M4853 A455 +M4857 A10 +M4860 A485 +M4866 A489 +M4868 A1191 +M4882 A117 +M4888 A713 +M4894 A573 +M4896 A1393 +M4897 A977 +M4905 A349 +M4909 A166 +M4923 A811 +M4927 A695 +M4936 A1090 +M4941 A649 +M4942 A1381 +M4949 A751 +M4950 A751 +M4955 A385 +M4960 A477 +M4971 A807 +M4973 A296 +M4979 A589 +M4997 A554 +M5007 A710 +M5008 A1193 +M5012 A211 +M5014 A735 +M5021 A840 +M5026 A345 +M0 A752 +M1 A263 +M2 A1105 +M3 A826 +M5 A614 +M6 A910 +M8 A1040 +M9 A1073 +M10 A771 +M11 A119 +M12 A60 +M13 A263 +M14 A639 +M15 A517 +M17 A1040 +M18 A1049 +M19 A1036 +M20 A140 +M21 A359 +M22 A1129 +M23 A140 +M24 A1125 +M25 A882 +M26 A156 +M27 A974 +M28 A329 +M29 A1310 +M30 A235 +M31 A910 +M32 A1393 +M33 A996 +M34 A548 +M36 A433 +M37 A1038 +M38 A1157 +M39 A359 +M40 A1122 +M41 A882 +M42 A15 +M44 A851 +M45 A1024 +M46 A178 +M47 A418 +M48 A993 +M49 A832 +M50 A1210 +M51 A868 +M52 A958 +M54 A947 +M58 A483 +M59 A545 +M60 A1216 +M61 A51 +M62 A1157 +M63 A329 +M65 A539 +M66 A389 +M67 A352 +M68 A560 +M69 A340 +M70 A962 +M71 A1382 +M72 A691 +M73 A241 +M74 A9 +M77 A546 +M78 A1269 +M79 A1048 +M80 A974 +M83 A1310 +M86 A1035 +M88 A780 +M92 A782 +M93 A422 +M94 A579 +M95 A1373 +M96 A243 +M97 A713 +M99 A140 +M100 A1373 +M101 A448 +M102 A539 +M103 A831 +M104 A788 +M105 A1066 +M106 A996 +M107 A141 +M108 A432 +M111 A234 +M112 A542 +M113 A133 +M114 A1073 +M115 A1073 +M116 A242 +M117 A657 +M118 A962 +M119 A53 +M120 A419 +M121 A445 +M122 A255 +M123 A1117 +M127 A1039 +M128 A242 +M129 A1188 +M130 A1039 +M134 A1018 +M135 A317 +M137 A329 +M141 A1050 +M142 A381 +M143 A736 +M144 A156 +M145 A633 +M147 A263 +M148 A1326 +M149 A272 +M151 A1345 +M152 A861 +M153 A808 +M155 A317 +M157 A306 +M158 A807 +M159 A1302 +M160 A425 +M161 A910 +M162 A318 +M164 A572 +M165 A191 +M166 A252 +M168 A36 +M169 A560 +M171 A28 +M174 A885 +M175 A178 +M176 A131 +M178 A860 +M179 A713 +M181 A947 +M183 A1392 +M184 A585 +M185 A783 +M186 A490 +M187 A885 +M188 A401 +M189 A768 +M190 A431 +M192 A190 +M193 A2 +M194 A377 +M195 A70 +M197 A154 +M200 A255 +M202 A205 +M203 A340 +M205 A263 +M207 A831 +M210 A1028 +M211 A1373 +M212 A794 +M213 A448 +M216 A880 +M217 A865 +M218 A1173 +M219 A546 +M220 A279 +M221 A404 +M222 A466 +M223 A757 +M226 A1007 +M227 A242 +M228 A1329 +M229 A1348 +M230 A82 +M231 A1281 +M234 A603 +M235 A1050 +M236 A962 +M237 A962 +M238 A53 +M240 A419 +M241 A562 +M245 A1029 +M248 A773 +M249 A1144 +M250 A255 +M251 A466 +M252 A272 +M253 A709 +M254 A246 +M255 A133 +M256 A498 +M257 A482 +M259 A1111 +M264 A498 +M266 A951 +M267 A15 +M268 A597 +M270 A263 +M271 A208 +M272 A445 +M274 A993 +M275 A263 +M276 A1234 +M277 A1196 +M278 A1331 +M280 A1345 +M281 A1377 +M282 A133 +M283 A1290 +M284 A965 +M285 A220 +M286 A144 +M287 A706 +M288 A568 +M289 A826 +M290 A461 +M291 A950 +M292 A1221 +M293 A747 +M294 A29 +M295 A622 +M296 A478 +M297 A1097 +M298 A509 +M299 A363 +M300 A553 +M303 A633 +M305 A133 +M306 A296 +M307 A318 +M308 A550 +M311 A81 +M312 A1150 +M314 A754 +M315 A1326 +M316 A1162 +M318 A1392 +M321 A902 +M324 A846 +M325 A691 +M326 A419 +M329 A1131 +M330 A176 +M332 A245 +M334 A57 +M335 A54 +M336 A1322 +M337 A721 +M338 A1010 +M339 A859 +M340 A263 +M341 A318 +M342 A621 +M344 A469 +M345 A1047 +M347 A981 +M348 A603 +M349 A703 +M350 A90 +M351 A861 +M352 A602 +M353 A53 +M354 A861 +M356 A1192 +M357 A532 +M359 A609 +M360 A1272 +M361 A351 +M363 A208 +M364 A567 +M366 A794 +M369 A1107 +M370 A1111 +M372 A982 +M373 A1129 +M374 A247 +M375 A107 +M376 A933 +M378 A232 +M379 A133 +M380 A9 +M382 A49 +M383 A1290 +M384 A315 +M385 A284 +M386 A314 +M387 A178 +M389 A1144 +M390 A690 +M391 A934 +M392 A1234 +M393 A705 +M394 A1254 +M395 A1373 +M397 A1054 +M398 A1153 +M399 A70 +M400 A1007 +M401 A441 +M402 A982 +M405 A1117 +M406 A141 +M407 A570 +M408 A754 +M409 A1027 +M410 A43 +M411 A351 +M412 A1065 +M413 A498 +M415 A861 +M416 A943 +M417 A690 +M420 A178 +M423 A1234 +M424 A477 +M425 A221 +M427 A718 +M428 A333 +M430 A1327 +M431 A734 +M432 A617 +M434 A641 +M435 A313 +M436 A590 +M437 A363 +M438 A795 +M439 A490 +M441 A984 +M442 A590 +M443 A761 +M444 A246 +M445 A1393 +M446 A808 +M448 A98 +M449 A982 +M450 A36 +M451 A1393 +M453 A935 +M455 A1177 +M456 A1319 +M457 A117 +M458 A748 +M460 A412 +M461 A1 +M462 A1039 +M463 A1157 +M465 A701 +M467 A1349 +M468 A1350 +M470 A441 +M471 A314 +M474 A533 +M475 A1129 +M476 A216 +M478 A982 +M482 A1278 +M483 A961 +M484 A347 +M486 A1367 +M487 A389 +M488 A1326 +M490 A1317 +M491 A1033 +M493 A250 +M498 A908 +M500 A288 +M501 A890 +M503 A1087 +M505 A684 +M508 A65 +M509 A1234 +M510 A36 +M512 A808 +M513 A250 +M514 A982 +M515 A981 +M516 A910 +M517 A825 +M520 A1230 +M521 A17 +M522 A709 +M523 A759 +M524 A1135 +M525 A1165 +M526 A576 +M527 A9 +M528 A66 +M534 A1064 +M535 A982 +M536 A538 +M538 A480 +M539 A880 +M540 A224 +M542 A624 +M544 A337 +M545 A699 +M546 A107 +M547 A768 +M548 A1210 +M549 A429 +M550 A260 +M551 A1219 +M556 A937 +M557 A993 +M558 A582 +M560 A1224 +M561 A1263 +M562 A245 +M564 A1281 +M565 A79 +M568 A947 +M569 A1280 +M570 A1008 +M571 A533 +M572 A1021 +M574 A872 +M576 A1327 +M577 A706 +M579 A1310 +M580 A936 +M581 A1002 +M583 A732 +M584 A517 +M587 A352 +M588 A178 +M589 A246 +M590 A754 +M591 A1168 +M592 A863 +M594 A253 +M595 A238 +M596 A272 +M598 A603 +M599 A9 +M600 A378 +M602 A549 +M603 A680 +M604 A856 +M605 A351 +M607 A65 +M609 A245 +M610 A1383 +M611 A690 +M612 A21 +M613 A606 +M618 A981 +M620 A520 +M624 A284 +M627 A355 +M628 A997 +M629 A979 +M631 A885 +M632 A119 +M633 A17 +M635 A9 +M639 A602 +M640 A278 +M641 A169 +M642 A168 +M643 A28 +M644 A1353 +M646 A1080 +M648 A1373 +M650 A384 +M651 A1010 +M652 A542 +M653 A1327 +M655 A1321 +M657 A749 +M658 A214 +M660 A482 +M662 A1280 +M663 A774 +M664 A932 +M665 A16 +M666 A836 +M667 A884 +M668 A1068 +M669 A762 +M670 A802 +M671 A410 +M672 A216 +M673 A609 +M674 A822 +M675 A987 +M678 A199 +M679 A1230 +M681 A528 +M682 A490 +M683 A301 +M686 A622 +M687 A649 +M690 A1046 +M691 A245 +M692 A795 +M693 A294 +M696 A242 +M697 A1291 +M698 A1339 +M701 A415 +M702 A882 +M703 A836 +M706 A117 +M707 A423 +M708 A1137 +M709 A539 +M710 A747 +M711 A889 +M712 A298 +M714 A483 +M715 A782 +M717 A271 +M718 A479 +M719 A620 +M721 A384 +M722 A1133 +M723 A1137 +M724 A242 +M725 A857 +M726 A881 +M728 A935 +M730 A701 +M731 A246 +M732 A961 +M733 A9 +M734 A546 +M735 A795 +M736 A445 +M737 A1305 +M738 A1068 +M739 A935 +M740 A313 +M743 A1361 +M745 A1254 +M746 A94 +M747 A752 +M748 A1319 +M749 A537 +M750 A967 +M751 A750 +M753 A245 +M754 A572 +M755 A327 +M760 A258 +M761 A577 +M763 A471 +M764 A1197 +M766 A513 +M767 A29 +M768 A324 +M769 A908 +M771 A284 +M772 A9 +M773 A692 +M774 A1111 +M775 A488 +M778 A443 +M781 A947 +M783 A1098 +M784 A197 +M785 A1321 +M786 A1010 +M787 A1009 +M788 A588 +M789 A1305 +M793 A1156 +M794 A1040 +M796 A1287 +M798 A352 +M801 A760 +M803 A1332 +M804 A593 +M805 A1115 +M806 A234 +M807 A722 +M808 A1016 +M809 A1185 +M814 A1109 +M815 A966 +M817 A253 +M818 A753 +M821 A982 +M822 A124 +M823 A516 +M824 A199 +M827 A197 +M828 A833 +M829 A1390 +M830 A961 +M831 A11 +M834 A1329 +M835 A892 +M836 A1096 +M838 A747 +M840 A1395 +M841 A622 +M842 A313 +M843 A278 +M844 A1204 +M845 A362 +M846 A910 +M848 A1018 +M849 A40 +M850 A250 +M851 A249 +M853 A847 +M854 A190 +M855 A865 +M859 A1190 +M860 A714 +M862 A572 +M864 A1369 +M865 A796 +M866 A569 +M868 A681 +M869 A484 +M871 A879 +M873 A1215 +M876 A552 +M877 A928 +M878 A9 +M879 A249 +M880 A677 +M881 A1281 +M882 A1293 +M886 A531 +M887 A73 +M890 A786 +M891 A777 +M892 A882 +M893 A861 +M895 A778 +M896 A762 +M898 A1197 +M900 A808 +M901 A464 +M902 A548 +M903 A1257 +M904 A1185 +M905 A856 +M906 A780 +M907 A533 +M908 A861 +M909 A1351 +M910 A935 +M911 A224 +M912 A1317 +M913 A1371 +M914 A714 +M915 A1120 +M917 A990 +M918 A1122 +M920 A256 +M923 A239 +M924 A315 +M926 A885 +M929 A9 +M930 A772 +M931 A547 +M933 A831 +M934 A29 +M935 A982 +M936 A721 +M937 A594 +M938 A593 +M939 A529 +M940 A1050 +M941 A588 +M942 A882 +M943 A281 +M944 A718 +M945 A714 +M946 A1343 +M947 A656 +M948 A271 +M949 A351 +M950 A402 +M951 A550 +M953 A562 +M955 A732 +M956 A964 +M957 A9 +M958 A625 +M960 A794 +M964 A730 +M965 A1370 +M966 A1132 +M969 A210 +M970 A1347 +M972 A566 +M973 A296 +M974 A1199 +M975 A1316 +M977 A1393 +M978 A236 +M979 A181 +M981 A1283 +M982 A316 +M983 A935 +M984 A569 +M987 A963 +M989 A923 +M991 A846 +M993 A772 +M996 A1310 +M997 A608 +M998 A511 +M999 A363 +M1001 A1070 +M1002 A1209 +M1003 A1229 +M1004 A661 +M1005 A1219 +M1006 A1041 +M1008 A1229 +M1009 A661 +M1011 A156 +M1012 A527 +M1013 A1064 +M1014 A1043 +M1015 A674 +M1017 A588 +M1018 A201 +M1019 A747 +M1020 A610 +M1021 A935 +M1022 A147 +M1024 A648 +M1025 A643 +M1026 A441 +M1028 A984 +M1029 A29 +M1031 A1335 +M1032 A308 +M1034 A19 +M1037 A474 +M1038 A849 +M1039 A530 +M1041 A1348 +M1042 A133 +M1043 A183 +M1045 A280 +M1048 A340 +M1049 A987 +M1050 A853 +M1051 A506 +M1052 A441 +M1053 A279 +M1054 A1315 +M1055 A937 +M1057 A1377 +M1058 A1084 +M1059 A578 +M1060 A450 +M1065 A560 +M1066 A1215 +M1067 A400 +M1069 A351 +M1070 A393 +M1072 A543 +M1073 A1137 +M1074 A731 +M1077 A691 +M1078 A936 +M1079 A246 +M1080 A1167 +M1081 A342 +M1083 A1226 +M1084 A641 +M1085 A821 +M1086 A852 +M1087 A825 +M1089 A799 +M1090 A898 +M1092 A770 +M1094 A419 +M1095 A265 +M1096 A448 +M1097 A174 +M1098 A732 +M1100 A29 +M1103 A1303 +M1104 A982 +M1105 A857 +M1106 A148 +M1108 A341 +M1111 A714 +M1112 A957 +M1114 A156 +M1115 A980 +M1116 A1352 +M1118 A1152 +M1122 A333 +M1123 A1093 +M1124 A37 +M1125 A506 +M1126 A1000 +M1127 A448 +M1128 A1318 +M1131 A937 +M1134 A543 +M1135 A1323 +M1137 A193 +M1138 A789 +M1139 A216 +M1140 A178 +M1142 A1199 +M1144 A194 +M1145 A1263 +M1146 A11 +M1148 A250 +M1149 A19 +M1151 A1110 +M1153 A807 +M1156 A942 +M1157 A108 +M1158 A507 +M1161 A1276 +M1162 A482 +M1163 A65 +M1164 A907 +M1165 A1246 +M1166 A68 +M1167 A308 +M1168 A242 +M1171 A78 +M1172 A818 +M1173 A583 +M1176 A1160 +M1177 A788 +M1179 A754 +M1181 A1163 +M1183 A164 +M1185 A826 +M1186 A373 +M1189 A9 +M1190 A731 +M1191 A1382 +M1192 A550 +M1193 A277 +M1194 A1375 +M1196 A853 +M1199 A1319 +M1203 A808 +M1204 A584 +M1205 A517 +M1206 A351 +M1207 A889 +M1208 A993 +M1209 A243 +M1210 A1270 +M1211 A599 +M1212 A914 +M1213 A218 +M1214 A1392 +M1215 A1393 +M1216 A934 +M1218 A1022 +M1219 A178 +M1220 A774 +M1221 A43 +M1223 A453 +M1224 A1003 +M1225 A1333 +M1227 A587 +M1228 A1314 +M1230 A674 +M1232 A90 +M1233 A1054 +M1234 A478 +M1237 A1055 +M1238 A657 +M1240 A177 +M1243 A1072 +M1246 A655 +M1247 A177 +M1248 A9 +M1250 A1241 +M1253 A592 +M1256 A354 +M1257 A780 +M1258 A480 +M1259 A583 +M1263 A1163 +M1267 A242 +M1268 A1181 +M1271 A739 +M1272 A1046 +M1276 A15 +M1278 A974 +M1281 A151 +M1282 A420 +M1285 A910 +M1286 A1234 +M1287 A1068 +M1288 A968 +M1289 A1067 +M1290 A291 +M1291 A313 +M1292 A942 +M1293 A611 +M1295 A714 +M1296 A327 +M1297 A971 +M1301 A1154 +M1303 A153 +M1304 A1382 +M1305 A11 +M1306 A1192 +M1307 A734 +M1308 A897 +M1310 A546 +M1311 A1146 +M1312 A521 +M1314 A913 +M1317 A1003 +M1318 A1293 +M1319 A115 +M1320 A948 +M1322 A14 +M1325 A832 +M1326 A651 +M1328 A233 +M1331 A1114 +M1332 A1373 +M1333 A1339 +M1337 A363 +M1338 A78 +M1339 A584 +M1340 A1371 +M1342 A741 +M1345 A478 +M1348 A1174 +M1349 A1161 +M1351 A1236 +M1353 A1042 +M1354 A90 +M1355 A437 +M1356 A47 +M1357 A570 +M1360 A1191 +M1363 A519 +M1366 A476 +M1369 A1350 +M1370 A546 +M1371 A178 +M1373 A1122 +M1374 A126 +M1375 A828 +M1378 A1120 +M1379 A1346 +M1380 A149 +M1383 A579 +M1385 A1267 +M1387 A674 +M1388 A1161 +M1389 A123 +M1390 A561 +M1393 A75 +M1394 A1234 +M1395 A481 +M1396 A847 +M1397 A227 +M1399 A1380 +M1400 A1190 +M1401 A279 +M1402 A347 +M1403 A129 +M1405 A732 +M1406 A1243 +M1407 A340 +M1408 A243 +M1409 A1244 +M1412 A81 +M1413 A583 +M1415 A795 +M1417 A772 +M1418 A444 +M1420 A724 +M1421 A381 +M1423 A728 +M1424 A414 +M1425 A460 +M1426 A411 +M1427 A1301 +M1428 A639 +M1429 A352 +M1431 A1007 +M1434 A260 +M1436 A197 +M1438 A812 +M1439 A224 +M1440 A838 +M1441 A1122 +M1443 A456 +M1445 A953 +M1448 A56 +M1449 A448 +M1451 A370 +M1452 A246 +M1453 A1043 +M1455 A756 +M1456 A501 +M1458 A1155 +M1460 A79 +M1461 A664 +M1462 A276 +M1463 A1107 +M1465 A1311 +M1467 A208 +M1471 A602 +M1472 A828 +M1475 A236 +M1476 A41 +M1478 A958 +M1479 A1393 +M1480 A598 +M1483 A1050 +M1486 A880 +M1487 A1282 +M1488 A1213 +M1489 A348 +M1490 A226 +M1492 A339 +M1493 A753 +M1495 A602 +M1498 A594 +M1500 A1204 +M1502 A1111 +M1503 A845 +M1505 A360 +M1510 A749 +M1513 A611 +M1514 A44 +M1516 A467 +M1518 A663 +M1519 A242 +M1521 A546 +M1523 A1377 +M1524 A1199 +M1525 A739 +M1526 A1135 +M1530 A481 +M1534 A1276 +M1535 A249 +M1537 A333 +M1539 A883 +M1540 A588 +M1541 A93 +M1542 A1244 +M1543 A400 +M1544 A597 +M1545 A809 +M1546 A910 +M1548 A242 +M1549 A617 +M1551 A1263 +M1552 A1100 +M1554 A561 +M1555 A627 +M1556 A62 +M1558 A1337 +M1559 A448 +M1564 A634 +M1567 A916 +M1568 A929 +M1569 A838 +M1571 A119 +M1574 A1232 +M1575 A671 +M1576 A993 +M1578 A1111 +M1579 A1278 +M1581 A190 +M1584 A252 +M1586 A982 +M1587 A1149 +M1588 A53 +M1589 A1254 +M1591 A691 +M1592 A1179 +M1593 A1021 +M1594 A1047 +M1595 A1010 +M1597 A276 +M1598 A80 +M1599 A1067 +M1600 A178 +M1601 A289 +M1603 A878 +M1604 A9 +M1605 A643 +M1606 A728 +M1608 A464 +M1610 A747 +M1611 A178 +M1612 A589 +M1615 A245 +M1616 A753 +M1618 A590 +M1619 A565 +M1621 A310 +M1624 A456 +M1626 A1310 +M1630 A1011 +M1632 A326 +M1633 A1309 +M1636 A1229 +M1637 A1227 +M1641 A186 +M1642 A962 +M1645 A997 +M1646 A549 +M1647 A109 +M1648 A935 +M1650 A1278 +M1654 A324 +M1655 A76 +M1657 A817 +M1660 A68 +M1661 A227 +M1662 A1310 +M1665 A228 +M1666 A32 +M1668 A388 +M1674 A1129 +M1675 A86 +M1676 A396 +M1677 A216 +M1681 A282 +M1682 A170 +M1683 A769 +M1685 A958 +M1688 A243 +M1689 A857 +M1690 A242 +M1691 A111 +M1692 A485 +M1694 A898 +M1699 A873 +M1701 A20 +M1707 A1332 +M1708 A394 +M1711 A1081 +M1713 A9 +M1714 A915 +M1715 A1294 +M1716 A377 +M1718 A1066 +M1722 A317 +M1725 A705 +M1726 A399 +M1735 A541 +M1739 A21 +M1741 A988 +M1742 A89 +M1743 A1353 +M1744 A400 +M1747 A916 +M1751 A308 +M1753 A1382 +M1754 A245 +M1755 A1042 +M1756 A826 +M1757 A357 +M1758 A620 +M1759 A760 +M1760 A1310 +M1762 A661 +M1763 A380 +M1764 A9 +M1767 A934 +M1768 A329 +M1775 A590 +M1776 A810 +M1778 A448 +M1783 A796 +M1784 A776 +M1785 A1192 +M1787 A740 +M1788 A405 +M1789 A574 +M1792 A1004 +M1796 A683 +M1798 A1303 +M1799 A497 +M1801 A641 +M1803 A523 +M1804 A1176 +M1805 A1048 +M1806 A807 +M1808 A747 +M1811 A1224 +M1812 A9 +M1813 A880 +M1814 A1156 +M1816 A1129 +M1820 A926 +M1821 A432 +M1822 A357 +M1824 A1300 +M1825 A774 +M1827 A831 +M1828 A958 +M1829 A964 +M1830 A272 +M1834 A382 +M1837 A1098 +M1838 A571 +M1839 A279 +M1840 A899 +M1841 A284 +M1846 A1154 +M1849 A147 +M1850 A1344 +M1852 A641 +M1853 A1227 +M1854 A1064 +M1856 A1053 +M1859 A79 +M1861 A1067 +M1862 A34 +M1864 A502 +M1865 A1165 +M1867 A452 +M1868 A1041 +M1870 A880 +M1872 A173 +M1873 A79 +M1874 A1299 +M1875 A851 +M1876 A1212 +M1877 A718 +M1879 A819 +M1881 A1166 +M1882 A1086 +M1885 A1010 +M1886 A564 +M1889 A934 +M1890 A1138 +M1891 A166 +M1893 A352 +M1895 A269 +M1898 A156 +M1899 A564 +M1900 A965 +M1901 A847 +M1902 A29 +M1903 A79 +M1904 A1227 +M1905 A375 +M1906 A335 +M1907 A971 +M1908 A230 +M1910 A1014 +M1914 A944 +M1915 A422 +M1918 A285 +M1920 A714 +M1924 A1128 +M1925 A49 +M1928 A1017 +M1929 A701 +M1931 A1220 +M1935 A1203 +M1937 A298 +M1938 A626 +M1939 A724 +M1941 A714 +M1945 A1141 +M1948 A37 +M1949 A1145 +M1952 A376 +M1955 A227 +M1959 A976 +M1961 A970 +M1962 A666 +M1965 A1297 +M1968 A752 +M1970 A538 +M1973 A1111 +M1974 A705 +M1975 A392 +M1976 A1289 +M1978 A965 +M1979 A419 +M1980 A960 +M1981 A349 +M1982 A588 +M1985 A1268 +M1986 A302 +M1987 A204 +M1989 A242 +M1992 A520 +M1994 A481 +M1998 A1396 +M1999 A478 +M2000 A549 +M2005 A341 +M2008 A233 +M2011 A178 +M2015 A325 +M2016 A1212 +M2017 A250 +M2018 A1244 +M2019 A915 +M2020 A1392 +M2021 A445 +M2022 A620 +M2023 A586 +M2024 A111 +M2025 A511 +M2027 A1103 +M2028 A1146 +M2031 A1148 +M2033 A944 +M2034 A740 +M2035 A571 +M2036 A335 +M2039 A344 +M2040 A785 +M2042 A506 +M2043 A579 +M2046 A777 +M2047 A747 +M2048 A1048 +M2049 A882 +M2050 A21 +M2051 A1262 +M2052 A221 +M2054 A1360 +M2055 A831 +M2056 A94 +M2057 A361 +M2062 A48 +M2065 A539 +M2070 A950 +M2071 A242 +M2074 A658 +M2079 A1134 +M2081 A807 +M2082 A724 +M2083 A1242 +M2084 A1068 +M2085 A93 +M2086 A714 +M2090 A941 +M2091 A391 +M2093 A158 +M2094 A1280 +M2095 A1300 +M2096 A674 +M2099 A11 +M2102 A247 +M2103 A1370 +M2104 A1149 +M2105 A1345 +M2107 A349 +M2108 A835 +M2109 A910 +M2110 A1248 +M2111 A884 +M2113 A1396 +M2114 A694 +M2115 A1130 +M2118 A120 +M2121 A259 +M2124 A1141 +M2125 A413 +M2126 A176 +M2127 A373 +M2128 A670 +M2129 A878 +M2131 A497 +M2133 A141 +M2134 A832 +M2136 A1063 +M2137 A577 +M2138 A880 +M2139 A391 +M2144 A87 +M2146 A1110 +M2151 A1379 +M2152 A829 +M2153 A477 +M2154 A830 +M2156 A1052 +M2158 A880 +M2160 A457 +M2161 A940 +M2163 A701 +M2164 A828 +M2165 A840 +M2166 A115 +M2167 A946 +M2168 A1046 +M2170 A234 +M2174 A193 +M2175 A587 +M2176 A1312 +M2177 A513 +M2179 A1128 +M2181 A1068 +M2184 A1111 +M2189 A1177 +M2192 A1319 +M2193 A690 +M2196 A104 +M2198 A931 +M2199 A531 +M2205 A822 +M2207 A909 +M2209 A1110 +M2210 A821 +M2212 A373 +M2214 A806 +M2217 A1251 +M2219 A701 +M2221 A1123 +M2222 A299 +M2223 A762 +M2224 A1101 +M2225 A1035 +M2227 A1346 +M2230 A311 +M2231 A1227 +M2232 A328 +M2234 A1337 +M2237 A585 +M2238 A675 +M2239 A116 +M2240 A1046 +M2243 A366 +M2244 A993 +M2245 A743 +M2246 A637 +M2249 A961 +M2250 A1129 +M2251 A946 +M2253 A1382 +M2255 A1110 +M2260 A794 +M2262 A1120 +M2263 A212 +M2265 A649 +M2267 A928 +M2268 A239 +M2269 A1309 +M2270 A1359 +M2274 A958 +M2275 A643 +M2277 A187 +M2278 A237 +M2279 A1151 +M2281 A892 +M2282 A966 +M2284 A667 +M2285 A465 +M2286 A844 +M2287 A1118 +M2289 A679 +M2290 A1199 +M2291 A50 +M2292 A832 +M2293 A772 +M2294 A674 +M2297 A907 +M2298 A13 +M2304 A1366 +M2305 A1384 +M2307 A892 +M2308 A500 +M2310 A250 +M2311 A1127 +M2312 A822 +M2315 A314 +M2316 A1124 +M2317 A873 +M2319 A389 +M2321 A261 +M2323 A445 +M2324 A139 +M2326 A621 +M2328 A1268 +M2329 A376 +M2331 A44 +M2333 A133 +M2334 A241 +M2337 A761 +M2352 A1305 +M2354 A1259 +M2355 A100 +M2357 A1371 +M2358 A542 +M2359 A724 +M2360 A1062 +M2361 A1299 +M2362 A1184 +M2363 A518 +M2364 A1359 +M2367 A1375 +M2369 A28 +M2372 A148 +M2375 A808 +M2377 A181 +M2380 A66 +M2381 A57 +M2383 A117 +M2386 A714 +M2387 A869 +M2389 A899 +M2393 A1367 +M2396 A1244 +M2397 A118 +M2398 A944 +M2399 A1365 +M2400 A554 +M2401 A386 +M2402 A239 +M2403 A63 +M2405 A247 +M2406 A739 +M2407 A335 +M2408 A592 +M2409 A423 +M2411 A651 +M2413 A889 +M2414 A1043 +M2417 A1146 +M2418 A9 +M2420 A1327 +M2422 A651 +M2425 A1098 +M2429 A1093 +M2430 A1367 +M2432 A978 +M2433 A1211 +M2434 A617 +M2435 A539 +M2437 A273 +M2439 A1089 +M2441 A88 +M2442 A1289 +M2449 A1048 +M2450 A156 +M2452 A908 +M2454 A1364 +M2456 A176 +M2457 A327 +M2463 A301 +M2465 A262 +M2470 A380 +M2474 A519 +M2475 A1175 +M2476 A285 +M2481 A279 +M2488 A414 +M2489 A442 +M2492 A1083 +M2493 A78 +M2495 A963 +M2496 A1064 +M2497 A269 +M2498 A410 +M2499 A1122 +M2501 A217 +M2502 A700 +M2508 A450 +M2509 A1224 +M2510 A1 +M2513 A701 +M2516 A906 +M2517 A546 +M2520 A643 +M2521 A941 +M2523 A794 +M2527 A914 +M2531 A1089 +M2532 A147 +M2533 A794 +M2535 A156 +M2536 A1044 +M2538 A933 +M2539 A863 +M2542 A573 +M2543 A508 +M2546 A395 +M2547 A1048 +M2548 A1355 +M2553 A1019 +M2554 A821 +M2560 A433 +M2562 A1068 +M2563 A350 +M2565 A1363 +M2568 A1365 +M2571 A1245 +M2572 A224 +M2577 A1065 +M2578 A724 +M2579 A1296 +M2582 A47 +M2584 A11 +M2589 A451 +M2590 A104 +M2592 A1154 +M2595 A798 +M2599 A845 +M2600 A1282 +M2601 A1033 +M2602 A259 +M2603 A320 +M2604 A107 +M2606 A1359 +M2607 A1376 +M2608 A1031 +M2611 A270 +M2613 A1188 +M2614 A1105 +M2615 A1315 +M2616 A1123 +M2617 A743 +M2619 A1083 +M2620 A902 +M2623 A1021 +M2624 A171 +M2625 A762 +M2626 A900 +M2628 A1004 +M2629 A714 +M2630 A762 +M2632 A1317 +M2634 A1382 +M2636 A363 +M2638 A589 +M2639 A123 +M2640 A533 +M2641 A376 +M2642 A586 +M2644 A493 +M2645 A576 +M2647 A412 +M2648 A1065 +M2650 A448 +M2651 A854 +M2652 A228 +M2653 A1315 +M2655 A779 +M2659 A963 +M2660 A181 +M2664 A1013 +M2668 A618 +M2669 A646 +M2672 A1155 +M2677 A402 +M2681 A1357 +M2682 A176 +M2689 A81 +M2691 A943 +M2692 A323 +M2695 A186 +M2698 A1027 +M2700 A506 +M2701 A380 +M2703 A340 +M2705 A1119 +M2706 A716 +M2707 A130 +M2709 A1111 +M2710 A1194 +M2714 A123 +M2716 A1327 +M2717 A971 +M2719 A183 +M2721 A558 +M2723 A326 +M2725 A1043 +M2726 A474 +M2731 A1096 +M2736 A14 +M2738 A880 +M2746 A1396 +M2755 A949 +M2757 A1317 +M2760 A9 +M2761 A1183 +M2763 A765 +M2764 A80 +M2768 A777 +M2769 A16 +M2770 A234 +M2772 A450 +M2773 A302 +M2774 A1055 +M2776 A391 +M2777 A1212 +M2780 A430 +M2781 A1213 +M2783 A927 +M2785 A1062 +M2786 A454 +M2787 A248 +M2788 A89 +M2789 A1141 +M2794 A23 +M2795 A352 +M2798 A1004 +M2800 A253 +M2802 A60 +M2803 A620 +M2805 A96 +M2806 A858 +M2809 A795 +M2813 A92 +M2816 A477 +M2818 A380 +M2819 A389 +M2820 A1029 +M2821 A136 +M2822 A660 +M2823 A976 +M2826 A570 +M2832 A1311 +M2835 A1157 +M2836 A1281 +M2837 A197 +M2838 A599 +M2840 A307 +M2841 A584 +M2844 A586 +M2845 A389 +M2848 A616 +M2850 A1285 +M2851 A368 +M2852 A1231 +M2856 A792 +M2857 A82 +M2860 A865 +M2862 A1068 +M2864 A561 +M2865 A445 +M2867 A837 +M2868 A194 +M2869 A29 +M2876 A942 +M2882 A641 +M2883 A1373 +M2886 A5 +M2887 A1379 +M2888 A549 +M2895 A1085 +M2896 A728 +M2897 A1299 +M2898 A70 +M2900 A197 +M2901 A1197 +M2902 A461 +M2905 A83 +M2907 A1396 +M2908 A1150 +M2910 A388 +M2915 A732 +M2917 A439 +M2918 A1149 +M2921 A382 +M2923 A34 +M2924 A1396 +M2926 A250 +M2928 A277 +M2929 A1199 +M2930 A737 +M2932 A766 +M2933 A921 +M2934 A1201 +M2937 A1277 +M2938 A571 +M2939 A1068 +M2942 A483 +M2944 A144 +M2945 A1305 +M2948 A968 +M2949 A382 +M2951 A1164 +M2954 A421 +M2957 A633 +M2959 A689 +M2961 A1192 +M2962 A1025 +M2963 A424 +M2965 A841 +M2966 A302 +M2967 A784 +M2968 A1200 +M2969 A51 +M2971 A603 +M2973 A682 +M2974 A640 +M2979 A523 +M2980 A1339 +M2984 A930 +M2986 A410 +M2988 A1057 +M2989 A1093 +M2994 A1032 +M2995 A78 +M2997 A237 +M2998 A767 +M3000 A167 +M3001 A52 +M3002 A1118 +M3003 A840 +M3004 A792 +M3007 A998 +M3008 A941 +M3010 A401 +M3017 A178 +M3019 A1222 +M3023 A200 +M3030 A457 +M3031 A934 +M3035 A970 +M3037 A139 +M3038 A660 +M3039 A386 +M3040 A720 +M3041 A1088 +M3045 A1181 +M3050 A920 +M3053 A218 +M3054 A1008 +M3055 A284 +M3056 A1224 +M3058 A219 +M3060 A1259 +M3061 A1119 +M3062 A643 +M3064 A1388 +M3066 A244 +M3067 A1345 +M3069 A812 +M3070 A1295 +M3071 A86 +M3076 A970 +M3078 A292 +M3080 A1255 +M3089 A351 +M3091 A720 +M3093 A1243 +M3095 A740 +M3096 A570 +M3097 A720 +M3099 A1312 +M3100 A14 +M3103 A740 +M3104 A647 +M3106 A931 +M3108 A860 +M3110 A6 +M3111 A138 +M3112 A967 +M3113 A1023 +M3114 A1303 +M3117 A178 +M3119 A1198 +M3120 A937 +M3123 A744 +M3124 A1017 +M3127 A883 +M3128 A300 +M3132 A914 +M3135 A561 +M3138 A729 +M3139 A1290 +M3140 A1004 +M3141 A137 +M3143 A282 +M3144 A146 +M3146 A1291 +M3148 A151 +M3150 A226 +M3155 A519 +M3156 A150 +M3158 A1358 +M3160 A762 +M3161 A1010 +M3163 A1165 +M3164 A170 +M3165 A741 +M3168 A913 +M3170 A133 +M3173 A1010 +M3175 A1123 +M3184 A976 +M3185 A1253 +M3193 A391 +M3198 A313 +M3200 A1006 +M3205 A243 +M3206 A910 +M3209 A717 +M3212 A677 +M3213 A790 +M3215 A543 +M3216 A142 +M3220 A360 +M3227 A702 +M3231 A625 +M3240 A1253 +M3241 A814 +M3249 A1188 +M3251 A753 +M3256 A426 +M3258 A683 +M3260 A1303 +M3267 A1088 +M3270 A705 +M3271 A1213 +M3274 A762 +M3277 A76 +M3284 A445 +M3285 A963 +M3288 A708 +M3290 A483 +M3291 A70 +M3293 A763 +M3294 A1061 +M3296 A1322 +M3297 A980 +M3300 A904 +M3304 A1189 +M3305 A1308 +M3306 A1208 +M3307 A423 +M3308 A396 +M3317 A1107 +M3331 A372 +M3332 A55 +M3337 A520 +M3338 A606 +M3343 A554 +M3344 A504 +M3345 A511 +M3353 A370 +M3355 A770 +M3366 A963 +M3368 A589 +M3370 A1327 +M3374 A1179 +M3378 A1285 +M3380 A906 +M3382 A210 +M3384 A588 +M3386 A820 +M3388 A446 +M3389 A12 +M3390 A572 +M3391 A1396 +M3392 A1369 +M3393 A313 +M3394 A1022 +M3396 A929 +M3399 A894 +M3400 A1294 +M3401 A950 +M3405 A1213 +M3414 A684 +M3417 A970 +M3424 A1122 +M3430 A413 +M3435 A1146 +M3438 A769 +M3439 A712 +M3440 A1000 +M3441 A521 +M3442 A838 +M3443 A538 +M3447 A1157 +M3448 A732 +M3450 A33 +M3452 A391 +M3453 A77 +M3457 A1185 +M3459 A574 +M3461 A910 +M3463 A645 +M3465 A668 +M3466 A119 +M3468 A1018 +M3470 A196 +M3471 A0 +M3473 A1227 +M3475 A391 +M3476 A1210 +M3477 A1108 +M3479 A1345 +M3480 A1379 +M3492 A468 +M3493 A235 +M3498 A202 +M3499 A625 +M3501 A613 +M3503 A294 +M3505 A18 +M3512 A1034 +M3514 A971 +M3515 A143 +M3516 A1096 +M3523 A128 +M3530 A863 +M3531 A486 +M3537 A689 +M3540 A511 +M3542 A593 +M3543 A1211 +M3559 A727 +M3560 A40 +M3561 A608 +M3566 A476 +M3567 A1259 +M3569 A458 +M3570 A735 +M3574 A614 +M3575 A1390 +M3578 A1385 +M3580 A1193 +M3581 A327 +M3582 A777 +M3586 A1171 +M3587 A208 +M3591 A1253 +M3592 A643 +M3594 A914 +M3597 A1339 +M3598 A1362 +M3599 A805 +M3602 A465 +M3603 A701 +M3605 A1353 +M3607 A169 +M3618 A889 +M3621 A54 +M3627 A861 +M3631 A115 +M3637 A154 +M3638 A797 +M3640 A1000 +M3641 A1226 +M3647 A1122 +M3648 A20 +M3652 A686 +M3654 A511 +M3663 A463 +M3668 A439 +M3671 A1316 +M3674 A1345 +M3675 A1213 +M3679 A222 +M3680 A1011 +M3681 A770 +M3688 A1042 +M3689 A919 +M3696 A613 +M3697 A310 +M3699 A457 +M3704 A1358 +M3709 A1128 +M3713 A52 +M3714 A645 +M3716 A730 +M3717 A1338 +M3718 A1193 +M3719 A1306 +M3722 A719 +M3726 A482 +M3727 A1263 +M3729 A1388 +M3732 A510 +M3733 A43 +M3734 A1279 +M3741 A475 +M3746 A170 +M3751 A1168 +M3753 A1303 +M3760 A763 +M3762 A1386 +M3765 A672 +M3766 A1313 +M3767 A18 +M3769 A372 +M3771 A1379 +M3773 A238 +M3775 A289 +M3778 A945 +M3779 A117 +M3780 A725 +M3781 A429 +M3782 A1283 +M3783 A1287 +M3784 A1285 +M3788 A778 +M3795 A1081 +M3811 A165 +M3814 A194 +M3817 A1163 +M3821 A183 +M3824 A291 +M3825 A341 +M3831 A795 +M3844 A1052 +M3846 A861 +M3849 A296 +M3852 A1011 +M3854 A31 +M3857 A267 +M3858 A291 +M3867 A69 +M3869 A1231 +M3873 A947 +M3879 A633 +M3880 A1211 +M3882 A472 +M3884 A942 +M3886 A869 +M3888 A1048 +M3889 A854 +M3891 A1302 +M3892 A1181 +M3894 A1041 +M3896 A1385 +M3898 A1284 +M3907 A1353 +M3908 A706 +M3910 A1303 +M3911 A1014 +M3912 A358 +M3913 A572 +M3915 A666 +M3917 A601 +M3918 A1084 +M3920 A538 +M3921 A857 +M3922 A983 +M3924 A839 +M3925 A483 +M3928 A1391 +M3929 A705 +M3936 A299 +M3938 A226 +M3940 A755 +M3942 A1008 +M3945 A1219 +M3947 A1043 +M3955 A398 +M3961 A784 +M3967 A1188 +M3969 A1084 +M3972 A615 +M3980 A552 +M3981 A90 +M3984 A753 +M3987 A920 +M3988 A522 +M3991 A897 +M3994 A344 +M3998 A629 +M3999 A1077 +M4009 A879 +M4011 A662 +M4023 A537 +M4025 A1199 +M4032 A1028 +M4035 A1221 +M4040 A667 +M4041 A1313 +M4044 A1391 +M4046 A829 +M4049 A738 +M4050 A291 +M4051 A1135 +M4053 A1383 +M4057 A922 +M4063 A14 +M4067 A1249 +M4068 A689 +M4069 A488 +M4072 A149 +M4076 A459 +M4077 A787 +M4085 A1351 +M4086 A10 +M4092 A1204 +M4097 A293 +M4098 A1310 +M4099 A471 +M4102 A1367 +M4104 A1163 +M4110 A635 +M4112 A917 +M4124 A712 +M4128 A996 +M4132 A423 +M4135 A417 +M4141 A1322 +M4158 A1181 +M4159 A869 +M4171 A763 +M4173 A242 +M4180 A1298 +M4182 A576 +M4183 A242 +M4188 A1396 +M4189 A1389 +M4198 A195 +M4202 A1010 +M4208 A560 +M4212 A692 +M4214 A1133 +M4216 A890 +M4220 A542 +M4223 A44 +M4230 A1069 +M4231 A352 +M4239 A650 +M4252 A1189 +M4254 A6 +M4256 A786 +M4257 A179 +M4260 A385 +M4265 A494 +M4274 A132 +M4277 A826 +M4278 A1037 +M4279 A852 +M4282 A1364 +M4290 A405 +M4293 A651 +M4295 A1237 +M4300 A596 +M4303 A121 +M4313 A1297 +M4315 A774 +M4330 A579 +M4331 A299 +M4336 A218 +M4344 A159 +M4346 A836 +M4350 A1310 +M4352 A724 +M4358 A1277 +M4359 A615 +M4369 A689 +M4381 A1155 +M4396 A830 +M4401 A760 +M4408 A998 +M4411 A1287 +M4412 A723 +M4413 A613 +M4423 A179 +M4437 A1255 +M4446 A935 +M4458 A448 +M4462 A930 +M4466 A1321 +M4472 A1292 +M4485 A412 +M4486 A122 +M4489 A1350 +M4491 A904 +M4493 A9 +M4494 A740 +M4496 A1345 +M4508 A676 +M4511 A849 +M4526 A1182 +M4532 A1327 +M4535 A1315 +M4536 A316 +M4541 A571 +M4543 A1066 +M4551 A306 +M4557 A645 +M4564 A314 +M4565 A753 +M4568 A805 +M4569 A966 +M4573 A1088 +M4575 A554 +M4577 A992 +M4584 A721 +M4589 A948 +M4594 A166 +M4596 A1200 +M4604 A280 +M4623 A777 +M4631 A11 +M4636 A600 +M4638 A1277 +M4645 A1342 +M4649 A1317 +M4650 A293 +M4663 A1342 +M4677 A840 +M4678 A623 +M4681 A395 +M4690 A771 +M4694 A882 +M4695 A370 +M4730 A1175 +M4741 A1071 +M4744 A492 +M4745 A589 +M4752 A401 +M4761 A1254 +M4762 A154 +M4765 A1000 +M4773 A1325 +M4778 A1157 +M4791 A324 +M4795 A1201 +M4821 A1083 +M4830 A609 +M4852 A1092 +M4853 A810 +M4860 A627 +M4863 A1356 +M4866 A618 +M4882 A1194 +M4895 A491 +M4905 A388 +M4914 A1169 +M4927 A44 +M4930 A781 +M4942 A461 +M4944 A494 +M4949 A485 +M4950 A485 +M4960 A195 +M4971 A412 +M4979 A514 +M5001 A1307 +M5012 A339 +M5014 A266 +M5021 A268 +M0 A1151 +M1 A800 +M3 A338 +M6 A762 +M8 A974 +M9 A220 +M11 A90 +M12 A1105 +M13 A800 +M14 A1111 +M15 A692 +M17 A974 +M18 A1115 +M20 A604 +M23 A604 +M24 A795 +M25 A901 +M27 A1035 +M29 A679 +M30 A1105 +M31 A762 +M32 A961 +M33 A243 +M36 A1221 +M37 A548 +M38 A910 +M39 A551 +M40 A674 +M41 A396 +M44 A1064 +M45 A1373 +M46 A211 +M47 A1054 +M50 A491 +M53 A433 +M54 A1213 +M58 A84 +M60 A891 +M61 A70 +M62 A214 +M65 A226 +M66 A9 +M69 A1393 +M70 A947 +M71 A233 +M72 A797 +M73 A1301 +M74 A590 +M75 A621 +M79 A1208 +M80 A1393 +M83 A632 +M84 A804 +M86 A783 +M87 A1273 +M92 A1324 +M93 A895 +M95 A318 +M96 A428 +M97 A338 +M99 A604 +M100 A1355 +M101 A458 +M102 A284 +M103 A490 +M105 A190 +M106 A243 +M107 A970 +M109 A321 +M111 A690 +M112 A433 +M113 A1364 +M114 A205 +M115 A220 +M116 A794 +M118 A1383 +M119 A450 +M120 A9 +M121 A1135 +M122 A208 +M127 A808 +M128 A154 +M129 A1316 +M130 A808 +M134 A962 +M135 A1295 +M136 A638 +M140 A802 +M141 A794 +M142 A387 +M143 A912 +M145 A258 +M147 A530 +M148 A1135 +M149 A275 +M150 A733 +M151 A907 +M152 A602 +M155 A427 +M158 A664 +M159 A402 +M160 A993 +M161 A762 +M162 A422 +M164 A1150 +M165 A983 +M167 A660 +M169 A352 +M171 A783 +M172 A1055 +M174 A1120 +M175 A1064 +M176 A1129 +M178 A757 +M179 A862 +M181 A1010 +M182 A503 +M183 A594 +M184 A736 +M185 A85 +M186 A843 +M187 A1120 +M188 A824 +M189 A898 +M190 A1232 +M191 A1363 +M193 A441 +M194 A1263 +M195 A220 +M197 A148 +M200 A208 +M202 A1380 +M203 A168 +M205 A800 +M207 A490 +M208 A957 +M210 A781 +M211 A36 +M213 A82 +M214 A1238 +M215 A1258 +M216 A1218 +M218 A563 +M219 A782 +M220 A1150 +M221 A276 +M222 A190 +M224 A101 +M225 A251 +M226 A652 +M227 A1295 +M228 A717 +M229 A657 +M231 A1376 +M234 A1232 +M235 A106 +M236 A617 +M237 A617 +M238 A622 +M240 A866 +M241 A903 +M243 A620 +M247 A187 +M248 A1329 +M250 A208 +M251 A716 +M252 A271 +M253 A1111 +M256 A1146 +M257 A40 +M264 A154 +M270 A859 +M271 A686 +M272 A572 +M274 A538 +M276 A1021 +M277 A1187 +M278 A913 +M280 A318 +M281 A1208 +M282 A935 +M283 A581 +M285 A2 +M286 A253 +M287 A893 +M288 A811 +M289 A1115 +M290 A1280 +M291 A1128 +M292 A575 +M293 A1185 +M295 A30 +M296 A251 +M298 A206 +M299 A245 +M303 A258 +M304 A110 +M305 A754 +M306 A1396 +M307 A1114 +M308 A1393 +M309 A930 +M310 A499 +M311 A1213 +M312 A1167 +M314 A888 +M315 A471 +M316 A532 +M318 A352 +M321 A915 +M324 A1194 +M326 A1213 +M330 A832 +M332 A70 +M334 A1246 +M336 A182 +M337 A891 +M338 A1329 +M339 A484 +M340 A859 +M341 A1000 +M344 A924 +M345 A89 +M346 A665 +M347 A917 +M348 A1232 +M351 A208 +M352 A1335 +M353 A585 +M354 A1092 +M356 A990 +M359 A540 +M360 A8 +M361 A947 +M363 A729 +M364 A1156 +M365 A357 +M368 A436 +M369 A98 +M370 A882 +M371 A647 +M372 A54 +M373 A1058 +M374 A675 +M375 A623 +M376 A540 +M378 A729 +M379 A318 +M380 A963 +M382 A684 +M385 A1371 +M386 A50 +M387 A681 +M390 A353 +M391 A784 +M392 A202 +M393 A542 +M394 A372 +M395 A1355 +M397 A288 +M399 A655 +M401 A263 +M402 A1367 +M405 A176 +M406 A1248 +M407 A1324 +M410 A405 +M411 A178 +M412 A1268 +M413 A1146 +M415 A832 +M416 A665 +M420 A381 +M423 A1029 +M426 A949 +M429 A96 +M430 A1362 +M434 A159 +M435 A807 +M436 A768 +M437 A19 +M438 A929 +M440 A994 +M442 A1339 +M443 A1372 +M444 A1340 +M445 A935 +M449 A1367 +M450 A243 +M453 A659 +M455 A1153 +M457 A281 +M458 A647 +M460 A149 +M462 A687 +M463 A70 +M465 A561 +M471 A1363 +M474 A146 +M476 A449 +M482 A112 +M483 A176 +M486 A971 +M487 A377 +M488 A862 +M491 A199 +M496 A240 +M498 A1 +M499 A522 +M508 A1324 +M510 A923 +M512 A376 +M513 A131 +M514 A180 +M516 A428 +M517 A941 +M520 A1263 +M521 A208 +M522 A31 +M524 A503 +M526 A1028 +M527 A1064 +M528 A1023 +M534 A928 +M535 A1382 +M539 A402 +M541 A133 +M542 A1187 +M544 A930 +M545 A60 +M546 A981 +M547 A1339 +M548 A290 +M550 A1339 +M552 A1220 +M556 A1234 +M557 A756 +M558 A761 +M560 A1297 +M561 A990 +M562 A928 +M564 A880 +M565 A1081 +M568 A1198 +M570 A711 +M571 A571 +M572 A164 +M576 A298 +M579 A1129 +M580 A1181 +M583 A931 +M584 A80 +M587 A252 +M588 A478 +M589 A506 +M590 A888 +M591 A1094 +M592 A1272 +M594 A621 +M595 A651 +M597 A98 +M598 A520 +M599 A94 +M601 A1221 +M602 A594 +M603 A231 +M604 A794 +M605 A651 +M606 A404 +M609 A467 +M611 A688 +M612 A225 +M614 A500 +M618 A1338 +M623 A1103 +M624 A817 +M627 A596 +M631 A589 +M632 A1368 +M633 A565 +M635 A547 +M636 A967 +M639 A930 +M640 A185 +M642 A993 +M644 A472 +M646 A298 +M648 A351 +M650 A391 +M651 A1314 +M653 A934 +M655 A750 +M656 A1238 +M657 A1242 +M658 A243 +M659 A149 +M661 A557 +M662 A595 +M663 A766 +M664 A192 +M666 A276 +M667 A122 +M668 A553 +M669 A486 +M671 A320 +M672 A980 +M673 A173 +M675 A1371 +M676 A300 +M677 A437 +M678 A887 +M679 A1153 +M684 A872 +M686 A202 +M687 A759 +M690 A567 +M691 A1125 +M692 A14 +M695 A344 +M696 A535 +M698 A5 +M699 A155 +M701 A920 +M702 A1333 +M703 A509 +M706 A106 +M707 A260 +M709 A1001 +M710 A1185 +M711 A526 +M712 A899 +M714 A1363 +M717 A221 +M718 A1102 +M721 A84 +M722 A1309 +M723 A390 +M725 A545 +M726 A52 +M728 A902 +M729 A277 +M731 A191 +M732 A1192 +M734 A1272 +M736 A930 +M737 A484 +M738 A524 +M739 A1047 +M740 A299 +M746 A292 +M747 A923 +M751 A320 +M753 A1293 +M754 A432 +M755 A155 +M761 A123 +M763 A155 +M766 A327 +M767 A1106 +M768 A1093 +M769 A550 +M771 A75 +M773 A1389 +M774 A373 +M775 A1200 +M776 A339 +M778 A378 +M781 A373 +M784 A997 +M785 A1378 +M786 A247 +M787 A242 +M788 A705 +M789 A446 +M793 A750 +M794 A974 +M795 A387 +M796 A79 +M801 A1177 +M804 A21 +M806 A222 +M807 A332 +M809 A620 +M815 A1042 +M817 A1116 +M818 A1029 +M821 A1367 +M823 A227 +M824 A869 +M827 A242 +M828 A886 +M830 A511 +M831 A775 +M834 A1108 +M838 A1185 +M840 A1197 +M841 A149 +M842 A1058 +M843 A45 +M844 A483 +M846 A590 +M847 A1098 +M850 A1180 +M853 A30 +M854 A118 +M856 A280 +M860 A5 +M862 A1311 +M863 A150 +M864 A705 +M865 A736 +M869 A33 +M871 A784 +M874 A492 +M876 A1364 +M877 A118 +M878 A433 +M879 A361 +M880 A942 +M881 A1232 +M887 A91 +M890 A668 +M891 A177 +M892 A1263 +M893 A877 +M894 A745 +M895 A1224 +M896 A1310 +M897 A350 +M900 A433 +M901 A122 +M902 A213 +M903 A1150 +M905 A482 +M906 A891 +M907 A928 +M908 A106 +M909 A1284 +M911 A645 +M913 A512 +M914 A1044 +M915 A243 +M916 A1389 +M917 A1119 +M918 A1228 +M920 A164 +M924 A909 +M925 A1078 +M926 A1120 +M929 A471 +M930 A1223 +M931 A107 +M933 A412 +M934 A590 +M935 A1359 +M937 A27 +M938 A730 +M940 A762 +M942 A1158 +M945 A589 +M946 A680 +M947 A192 +M949 A168 +M950 A1209 +M951 A588 +M953 A590 +M955 A1027 +M956 A178 +M957 A252 +M958 A193 +M959 A912 +M960 A922 +M964 A678 +M966 A888 +M969 A1159 +M970 A388 +M972 A584 +M973 A880 +M974 A1371 +M977 A18 +M978 A987 +M979 A1096 +M982 A1170 +M983 A833 +M987 A1169 +M991 A791 +M995 A437 +M996 A208 +M997 A686 +M998 A992 +M1001 A135 +M1003 A779 +M1005 A1316 +M1008 A704 +M1011 A387 +M1012 A83 +M1013 A934 +M1015 A892 +M1017 A910 +M1018 A113 +M1021 A1199 +M1022 A606 +M1024 A1392 +M1025 A1335 +M1026 A549 +M1027 A1148 +M1028 A1029 +M1029 A652 +M1031 A1208 +M1032 A659 +M1034 A352 +M1036 A184 +M1041 A449 +M1042 A975 +M1048 A400 +M1049 A670 +M1050 A1152 +M1051 A1222 +M1052 A1082 +M1053 A813 +M1057 A492 +M1058 A1314 +M1060 A362 +M1065 A623 +M1066 A1061 +M1067 A378 +M1069 A880 +M1072 A1099 +M1073 A537 +M1074 A1063 +M1075 A764 +M1078 A80 +M1079 A807 +M1080 A262 +M1081 A734 +M1083 A1015 +M1084 A966 +M1085 A777 +M1087 A503 +M1089 A1396 +M1090 A815 +M1092 A1328 +M1094 A22 +M1095 A53 +M1096 A1045 +M1098 A252 +M1100 A935 +M1102 A1142 +M1104 A1300 +M1105 A479 +M1107 A1333 +M1111 A246 +M1112 A493 +M1113 A1195 +M1119 A180 +M1124 A176 +M1125 A1153 +M1126 A479 +M1127 A1151 +M1128 A302 +M1131 A468 +M1134 A146 +M1137 A1108 +M1138 A782 +M1139 A956 +M1140 A677 +M1141 A209 +M1142 A314 +M1144 A1294 +M1145 A1322 +M1146 A102 +M1147 A369 +M1148 A1137 +M1149 A506 +M1151 A444 +M1154 A227 +M1155 A475 +M1157 A1065 +M1159 A1384 +M1162 A1028 +M1166 A244 +M1167 A561 +M1168 A548 +M1171 A345 +M1172 A1133 +M1181 A1000 +M1184 A198 +M1185 A123 +M1186 A703 +M1188 A518 +M1189 A210 +M1190 A432 +M1191 A741 +M1192 A284 +M1193 A1223 +M1196 A241 +M1199 A586 +M1200 A951 +M1201 A518 +M1203 A70 +M1204 A527 +M1205 A476 +M1206 A800 +M1207 A227 +M1209 A252 +M1210 A934 +M1212 A692 +M1214 A1129 +M1219 A246 +M1220 A766 +M1221 A730 +M1224 A823 +M1227 A788 +M1228 A316 +M1230 A471 +M1231 A1008 +M1232 A20 +M1233 A974 +M1234 A1243 +M1237 A638 +M1238 A1132 +M1239 A959 +M1240 A479 +M1243 A1064 +M1246 A561 +M1247 A484 +M1248 A550 +M1253 A526 +M1258 A750 +M1261 A932 +M1263 A417 +M1266 A595 +M1267 A547 +M1271 A675 +M1272 A1356 +M1277 A767 +M1278 A856 +M1284 A141 +M1285 A1308 +M1287 A337 +M1288 A1224 +M1289 A501 +M1290 A602 +M1291 A150 +M1295 A235 +M1296 A116 +M1299 A460 +M1303 A1396 +M1304 A304 +M1305 A102 +M1306 A871 +M1307 A1303 +M1308 A1356 +M1311 A1034 +M1312 A922 +M1313 A440 +M1319 A449 +M1325 A1057 +M1326 A360 +M1328 A184 +M1331 A912 +M1332 A1355 +M1333 A395 +M1345 A674 +M1348 A656 +M1351 A189 +M1352 A134 +M1353 A8 +M1354 A756 +M1355 A145 +M1357 A4 +M1358 A1 +M1360 A1023 +M1362 A1037 +M1366 A177 +M1368 A185 +M1370 A730 +M1371 A1058 +M1373 A100 +M1375 A164 +M1377 A1229 +M1378 A589 +M1379 A314 +M1380 A1253 +M1381 A730 +M1383 A1311 +M1385 A1061 +M1386 A1229 +M1387 A1102 +M1388 A522 +M1389 A1048 +M1390 A703 +M1391 A122 +M1392 A519 +M1396 A828 +M1397 A1303 +M1399 A344 +M1400 A1006 +M1401 A394 +M1402 A557 +M1403 A933 +M1405 A955 +M1409 A911 +M1410 A85 +M1411 A271 +M1412 A54 +M1415 A957 +M1416 A437 +M1417 A879 +M1418 A883 +M1421 A116 +M1423 A371 +M1424 A690 +M1426 A108 +M1428 A551 +M1431 A512 +M1433 A1269 +M1434 A180 +M1436 A314 +M1437 A272 +M1438 A703 +M1439 A1010 +M1441 A411 +M1445 A1001 +M1449 A1045 +M1451 A323 +M1454 A530 +M1455 A6 +M1458 A1026 +M1460 A931 +M1463 A1063 +M1465 A437 +M1474 A1132 +M1475 A802 +M1478 A1217 +M1479 A1079 +M1483 A359 +M1488 A882 +M1490 A205 +M1495 A518 +M1498 A868 +M1500 A1081 +M1501 A155 +M1502 A458 +M1508 A804 +M1510 A1123 +M1513 A557 +M1514 A296 +M1519 A740 +M1521 A1310 +M1523 A704 +M1524 A164 +M1525 A934 +M1530 A508 +M1533 A49 +M1534 A105 +M1535 A381 +M1539 A1175 +M1540 A29 +M1542 A704 +M1544 A374 +M1546 A2 +M1548 A313 +M1549 A1068 +M1551 A343 +M1554 A462 +M1555 A497 +M1556 A1093 +M1558 A1129 +M1561 A1288 +M1564 A362 +M1565 A1261 +M1567 A1327 +M1568 A376 +M1569 A975 +M1571 A935 +M1576 A1270 +M1577 A668 +M1578 A335 +M1579 A237 +M1581 A620 +M1582 A733 +M1584 A813 +M1586 A397 +M1587 A987 +M1589 A572 +M1591 A1254 +M1592 A1092 +M1593 A932 +M1594 A929 +M1595 A752 +M1597 A1293 +M1598 A1071 +M1599 A1114 +M1600 A1144 +M1601 A333 +M1604 A600 +M1605 A563 +M1606 A607 +M1608 A597 +M1611 A458 +M1616 A315 +M1617 A959 +M1621 A1176 +M1624 A1076 +M1637 A704 +M1638 A810 +M1641 A734 +M1646 A1276 +M1647 A44 +M1648 A1012 +M1655 A150 +M1657 A544 +M1661 A583 +M1662 A343 +M1665 A433 +M1666 A759 +M1673 A455 +M1674 A912 +M1675 A799 +M1676 A315 +M1677 A1392 +M1680 A112 +M1681 A1014 +M1683 A347 +M1685 A999 +M1688 A1310 +M1689 A656 +M1690 A1155 +M1691 A654 +M1694 A965 +M1699 A1151 +M1701 A437 +M1708 A1380 +M1711 A388 +M1712 A330 +M1713 A1131 +M1714 A1093 +M1716 A22 +M1717 A221 +M1718 A456 +M1722 A176 +M1725 A1097 +M1739 A284 +M1741 A1174 +M1742 A446 +M1743 A860 +M1744 A31 +M1751 A412 +M1755 A532 +M1759 A1146 +M1760 A1130 +M1762 A492 +M1763 A1027 +M1764 A382 +M1765 A1055 +M1768 A29 +M1771 A651 +M1772 A575 +M1773 A1309 +M1775 A645 +M1777 A704 +M1778 A770 +M1783 A18 +M1784 A806 +M1786 A889 +M1787 A654 +M1788 A193 +M1789 A726 +M1794 A1280 +M1798 A1135 +M1799 A638 +M1801 A714 +M1803 A1244 +M1805 A1208 +M1806 A309 +M1812 A216 +M1813 A176 +M1814 A757 +M1815 A215 +M1816 A6 +M1820 A183 +M1824 A955 +M1825 A780 +M1827 A780 +M1829 A885 +M1833 A1116 +M1835 A74 +M1838 A57 +M1840 A627 +M1841 A237 +M1846 A122 +M1847 A177 +M1848 A575 +M1849 A546 +M1852 A748 +M1853 A1383 +M1856 A1353 +M1857 A1215 +M1859 A497 +M1861 A680 +M1862 A1123 +M1864 A843 +M1868 A55 +M1870 A934 +M1871 A75 +M1875 A1066 +M1877 A1154 +M1879 A707 +M1881 A1261 +M1885 A1091 +M1886 A1292 +M1890 A912 +M1891 A1269 +M1892 A218 +M1894 A125 +M1895 A1061 +M1898 A375 +M1900 A1347 +M1901 A105 +M1902 A590 +M1903 A1014 +M1905 A894 +M1906 A404 +M1908 A688 +M1909 A862 +M1910 A18 +M1914 A538 +M1915 A1337 +M1917 A1123 +M1920 A329 +M1921 A772 +M1925 A942 +M1926 A322 +M1929 A191 +M1937 A276 +M1938 A896 +M1939 A758 +M1941 A246 +M1944 A1323 +M1945 A861 +M1948 A592 +M1949 A653 +M1955 A551 +M1959 A660 +M1961 A59 +M1965 A511 +M1973 A1010 +M1974 A380 +M1975 A849 +M1978 A433 +M1979 A246 +M1981 A1281 +M1982 A807 +M1989 A935 +M1994 A508 +M1995 A1161 +M1998 A1250 +M2000 A508 +M2005 A673 +M2011 A567 +M2015 A849 +M2016 A393 +M2017 A762 +M2018 A911 +M2019 A994 +M2020 A352 +M2022 A175 +M2024 A654 +M2025 A487 +M2026 A1133 +M2028 A14 +M2034 A929 +M2035 A1234 +M2036 A35 +M2038 A968 +M2040 A516 +M2041 A516 +M2042 A810 +M2046 A1303 +M2047 A459 +M2049 A901 +M2055 A1376 +M2056 A981 +M2059 A1323 +M2062 A673 +M2065 A705 +M2070 A223 +M2071 A1091 +M2076 A1320 +M2079 A669 +M2082 A758 +M2083 A1181 +M2084 A1019 +M2085 A877 +M2088 A1220 +M2091 A759 +M2095 A518 +M2099 A102 +M2103 A79 +M2104 A1193 +M2105 A318 +M2107 A1032 +M2109 A965 +M2110 A406 +M2111 A1294 +M2113 A1094 +M2115 A141 +M2118 A290 +M2122 A163 +M2124 A40 +M2127 A320 +M2128 A782 +M2129 A237 +M2133 A746 +M2134 A22 +M2137 A123 +M2138 A894 +M2139 A1351 +M2151 A432 +M2152 A1006 +M2153 A1033 +M2156 A1282 +M2160 A128 +M2164 A608 +M2165 A446 +M2166 A449 +M2168 A521 +M2170 A415 +M2171 A838 +M2174 A366 +M2176 A171 +M2177 A27 +M2181 A445 +M2184 A1340 +M2192 A483 +M2193 A353 +M2195 A72 +M2199 A423 +M2205 A1226 +M2207 A746 +M2209 A1229 +M2210 A563 +M2212 A334 +M2221 A150 +M2222 A102 +M2223 A1111 +M2225 A342 +M2227 A1108 +M2230 A616 +M2231 A1051 +M2232 A402 +M2237 A45 +M2238 A666 +M2240 A261 +M2244 A356 +M2245 A1226 +M2248 A545 +M2249 A864 +M2250 A1327 +M2251 A524 +M2253 A732 +M2255 A319 +M2260 A1165 +M2262 A589 +M2263 A392 +M2268 A1301 +M2270 A283 +M2274 A151 +M2275 A513 +M2276 A7 +M2278 A575 +M2279 A745 +M2282 A632 +M2284 A1342 +M2286 A958 +M2287 A497 +M2289 A1140 +M2292 A22 +M2293 A424 +M2294 A179 +M2297 A1135 +M2298 A1119 +M2307 A84 +M2308 A1202 +M2310 A113 +M2311 A1338 +M2312 A232 +M2314 A297 +M2315 A1165 +M2316 A1315 +M2317 A827 +M2321 A989 +M2323 A191 +M2326 A1165 +M2328 A1344 +M2329 A582 +M2331 A1084 +M2337 A1394 +M2344 A627 +M2352 A326 +M2356 A472 +M2358 A361 +M2361 A335 +M2364 A521 +M2369 A413 +M2372 A440 +M2375 A1139 +M2377 A1142 +M2380 A736 +M2383 A942 +M2389 A361 +M2391 A1301 +M2392 A1144 +M2393 A1081 +M2395 A1298 +M2396 A911 +M2399 A129 +M2401 A481 +M2402 A978 +M2403 A344 +M2406 A1386 +M2409 A126 +M2411 A682 +M2413 A1153 +M2414 A1002 +M2418 A1131 +M2420 A1336 +M2421 A703 +M2425 A629 +M2428 A1297 +M2429 A1289 +M2430 A313 +M2434 A795 +M2435 A1036 +M2436 A869 +M2437 A483 +M2439 A296 +M2442 A1349 +M2448 A163 +M2449 A968 +M2450 A606 +M2451 A515 +M2452 A1111 +M2454 A416 +M2457 A948 +M2463 A1167 +M2465 A1391 +M2470 A295 +M2473 A353 +M2474 A529 +M2475 A672 +M2476 A502 +M2481 A332 +M2486 A568 +M2488 A314 +M2489 A248 +M2490 A579 +M2491 A1030 +M2492 A1020 +M2493 A345 +M2495 A841 +M2496 A1130 +M2498 A835 +M2499 A674 +M2502 A410 +M2503 A776 +M2508 A1028 +M2509 A225 +M2510 A603 +M2513 A553 +M2517 A520 +M2520 A253 +M2521 A88 +M2535 A1111 +M2538 A806 +M2539 A523 +M2542 A837 +M2543 A835 +M2547 A651 +M2548 A926 +M2553 A1014 +M2556 A1309 +M2558 A125 +M2560 A204 +M2562 A445 +M2567 A96 +M2568 A129 +M2571 A1031 +M2572 A897 +M2577 A1093 +M2579 A137 +M2583 A1077 +M2584 A534 +M2590 A1153 +M2592 A990 +M2601 A1339 +M2602 A319 +M2603 A830 +M2607 A1322 +M2611 A545 +M2613 A597 +M2615 A215 +M2616 A1307 +M2617 A247 +M2619 A1020 +M2620 A1268 +M2624 A435 +M2625 A770 +M2627 A872 +M2628 A790 +M2629 A1011 +M2630 A1371 +M2632 A1270 +M2634 A740 +M2636 A937 +M2638 A422 +M2639 A1048 +M2641 A169 +M2642 A312 +M2644 A25 +M2645 A1395 +M2646 A50 +M2648 A45 +M2650 A82 +M2652 A1081 +M2659 A468 +M2663 A693 +M2664 A860 +M2666 A696 +M2669 A711 +M2675 A711 +M2678 A907 +M2680 A872 +M2681 A1333 +M2682 A402 +M2689 A757 +M2691 A635 +M2692 A975 +M2695 A667 +M2698 A1184 +M2700 A1213 +M2701 A819 +M2703 A1345 +M2704 A811 +M2706 A1074 +M2709 A970 +M2714 A54 +M2716 A599 +M2718 A1136 +M2721 A32 +M2723 A1346 +M2725 A832 +M2726 A1352 +M2731 A91 +M2736 A1093 +M2738 A16 +M2741 A1053 +M2755 A1116 +M2757 A450 +M2760 A1008 +M2763 A1356 +M2764 A1097 +M2770 A424 +M2772 A362 +M2773 A692 +M2776 A627 +M2777 A393 +M2778 A280 +M2780 A563 +M2786 A1197 +M2787 A694 +M2788 A563 +M2789 A1056 +M2790 A10 +M2793 A1328 +M2794 A1273 +M2795 A167 +M2796 A1217 +M2798 A790 +M2803 A725 +M2809 A22 +M2818 A20 +M2819 A243 +M2823 A1267 +M2826 A1036 +M2827 A455 +M2829 A100 +M2833 A575 +M2835 A296 +M2836 A1376 +M2837 A935 +M2840 A294 +M2844 A1292 +M2845 A1388 +M2851 A391 +M2852 A461 +M2857 A298 +M2859 A1273 +M2860 A1253 +M2864 A689 +M2865 A149 +M2868 A799 +M2869 A762 +M2876 A1240 +M2877 A139 +M2878 A204 +M2882 A1092 +M2883 A1130 +M2886 A237 +M2887 A291 +M2888 A279 +M2891 A30 +M2896 A502 +M2898 A313 +M2902 A1081 +M2905 A554 +M2908 A1258 +M2910 A759 +M2915 A934 +M2917 A940 +M2918 A987 +M2921 A586 +M2922 A1135 +M2923 A1244 +M2924 A727 +M2926 A862 +M2929 A1308 +M2930 A326 +M2931 A1123 +M2934 A1262 +M2938 A1290 +M2939 A236 +M2942 A1173 +M2944 A253 +M2945 A1041 +M2948 A1082 +M2949 A1203 +M2954 A1153 +M2955 A319 +M2959 A886 +M2961 A32 +M2962 A1267 +M2963 A449 +M2965 A568 +M2966 A114 +M2967 A160 +M2969 A1111 +M2971 A1232 +M2979 A958 +M2980 A1381 +M2982 A47 +M2984 A1082 +M2995 A345 +M2997 A1194 +M2998 A972 +M3001 A1315 +M3002 A616 +M3003 A176 +M3004 A972 +M3008 A134 +M3010 A824 +M3017 A448 +M3024 A1262 +M3026 A611 +M3028 A1211 +M3030 A128 +M3031 A755 +M3035 A1341 +M3036 A41 +M3039 A67 +M3041 A1231 +M3042 A624 +M3044 A845 +M3045 A174 +M3046 A198 +M3050 A180 +M3054 A1171 +M3055 A847 +M3056 A1299 +M3058 A744 +M3060 A894 +M3061 A1260 +M3062 A723 +M3064 A1081 +M3067 A396 +M3069 A703 +M3070 A407 +M3076 A941 +M3080 A139 +M3089 A677 +M3091 A71 +M3092 A1052 +M3095 A477 +M3096 A4 +M3098 A1016 +M3099 A312 +M3100 A404 +M3102 A195 +M3103 A365 +M3108 A137 +M3111 A270 +M3113 A1366 +M3116 A285 +M3117 A448 +M3118 A110 +M3119 A115 +M3120 A931 +M3123 A8 +M3124 A177 +M3125 A819 +M3130 A244 +M3132 A1303 +M3135 A884 +M3138 A1387 +M3139 A1000 +M3140 A415 +M3143 A1271 +M3148 A902 +M3150 A176 +M3155 A458 +M3156 A237 +M3158 A1217 +M3160 A1319 +M3161 A324 +M3163 A1296 +M3164 A142 +M3165 A43 +M3166 A845 +M3170 A754 +M3173 A1078 +M3175 A1218 +M3179 A1085 +M3188 A270 +M3193 A1370 +M3196 A992 +M3198 A445 +M3200 A1220 +M3203 A1077 +M3205 A1213 +M3206 A501 +M3209 A647 +M3212 A472 +M3213 A886 +M3228 A153 +M3233 A392 +M3241 A32 +M3249 A1322 +M3256 A889 +M3258 A509 +M3262 A1055 +M3267 A24 +M3270 A374 +M3271 A795 +M3274 A1352 +M3281 A668 +M3284 A312 +M3287 A152 +M3290 A1344 +M3294 A1261 +M3300 A160 +M3302 A1228 +M3306 A47 +M3307 A35 +M3317 A1063 +M3331 A1145 +M3345 A487 +M3351 A198 +M3353 A1014 +M3355 A447 +M3358 A1030 +M3366 A1217 +M3368 A851 +M3370 A1362 +M3374 A1364 +M3380 A1102 +M3382 A1159 +M3384 A1154 +M3386 A958 +M3390 A522 +M3391 A684 +M3392 A354 +M3393 A854 +M3394 A1027 +M3404 A1259 +M3414 A938 +M3417 A407 +M3421 A1006 +M3424 A448 +M3435 A865 +M3444 A134 +M3447 A958 +M3448 A689 +M3452 A1370 +M3457 A526 +M3461 A762 +M3463 A560 +M3466 A935 +M3468 A588 +M3470 A550 +M3475 A302 +M3476 A491 +M3477 A978 +M3479 A1382 +M3480 A291 +M3483 A1055 +M3484 A1386 +M3488 A184 +M3489 A926 +M3492 A1022 +M3493 A1105 +M3498 A487 +M3502 A673 +M3503 A496 +M3510 A496 +M3511 A449 +M3512 A268 +M3514 A249 +M3515 A55 +M3530 A731 +M3531 A136 +M3537 A283 +M3542 A981 +M3560 A314 +M3566 A1347 +M3569 A819 +M3570 A1155 +M3574 A100 +M3580 A397 +M3581 A1088 +M3582 A480 +M3586 A1324 +M3587 A686 +M3589 A1152 +M3591 A41 +M3592 A164 +M3597 A971 +M3599 A145 +M3603 A27 +M3618 A880 +M3619 A810 +M3621 A1389 +M3624 A1261 +M3627 A1100 +M3641 A929 +M3647 A1155 +M3649 A981 +M3654 A992 +M3662 A496 +M3663 A479 +M3668 A488 +M3669 A1220 +M3674 A1173 +M3675 A22 +M3680 A969 +M3681 A397 +M3696 A71 +M3697 A720 +M3699 A128 +M3704 A1217 +M3709 A76 +M3713 A500 +M3714 A373 +M3726 A208 +M3729 A1081 +M3732 A26 +M3733 A499 +M3734 A459 +M3741 A757 +M3746 A361 +M3751 A602 +M3762 A1094 +M3768 A913 +M3779 A1144 +M3788 A1084 +M3805 A817 +M3811 A267 +M3814 A1327 +M3817 A987 +M3821 A1311 +M3824 A475 +M3830 A897 +M3841 A669 +M3843 A74 +M3844 A984 +M3846 A781 +M3858 A1352 +M3867 A1069 +M3869 A213 +M3879 A258 +M3884 A767 +M3889 A1184 +M3891 A402 +M3894 A64 +M3907 A407 +M3908 A893 +M3910 A18 +M3911 A673 +M3913 A904 +M3918 A958 +M3921 A701 +M3925 A32 +M3928 A951 +M3929 A1010 +M3936 A64 +M3942 A776 +M3947 A402 +M3952 A1082 +M3955 A1295 +M3956 A798 +M3967 A597 +M3969 A952 +M3970 A1005 +M3980 A555 +M3981 A20 +M3987 A239 +M3988 A927 +M3994 A786 +M4009 A784 +M4011 A193 +M4023 A1134 +M4025 A1124 +M4035 A189 +M4046 A1070 +M4047 A668 +M4049 A1005 +M4050 A832 +M4053 A1176 +M4054 A152 +M4055 A998 +M4057 A763 +M4058 A362 +M4059 A1343 +M4063 A899 +M4066 A25 +M4068 A192 +M4077 A24 +M4085 A157 +M4097 A921 +M4102 A847 +M4112 A733 +M4124 A618 +M4128 A243 +M4132 A565 +M4137 A254 +M4141 A182 +M4145 A1005 +M4150 A125 +M4158 A830 +M4165 A837 +M4168 A537 +M4171 A74 +M4173 A740 +M4180 A1203 +M4182 A1395 +M4183 A1 +M4202 A752 +M4212 A190 +M4216 A774 +M4222 A905 +M4223 A161 +M4230 A1136 +M4231 A877 +M4239 A262 +M4247 A668 +M4252 A1077 +M4256 A668 +M4268 A536 +M4277 A342 +M4279 A312 +M4282 A416 +M4290 A291 +M4293 A280 +M4303 A387 +M4313 A511 +M4331 A995 +M4344 A813 +M4350 A343 +M4357 A163 +M4379 A792 +M4381 A829 +M4387 A738 +M4401 A1146 +M4404 A1005 +M4411 A1379 +M4421 A943 +M4437 A69 +M4446 A1047 +M4458 A500 +M4462 A854 +M4466 A1378 +M4485 A720 +M4486 A1030 +M4490 A1320 +M4491 A50 +M4492 A1249 +M4493 A216 +M4494 A841 +M4496 A511 +M4530 A1386 +M4532 A1336 +M4535 A1181 +M4536 A1255 +M4537 A668 +M4543 A1308 +M4556 A45 +M4557 A560 +M4564 A1174 +M4569 A1042 +M4573 A1231 +M4575 A341 +M4577 A1136 +M4584 A891 +M4594 A1255 +M4599 A280 +M4604 A825 +M4631 A534 +M4636 A507 +M4638 A174 +M4643 A463 +M4649 A1270 +M4650 A1099 +M4667 A479 +M4677 A84 +M4679 A596 +M4690 A893 +M4694 A901 +M4695 A323 +M4730 A1344 +M4739 A813 +M4741 A1118 +M4744 A1273 +M4752 A824 +M4761 A1297 +M4765 A919 +M4778 A910 +M4791 A813 +M4821 A1020 +M4822 A206 +M4827 A765 +M4830 A502 +M4842 A1195 +M4852 A397 +M4863 A1288 +M4927 A161 +M4930 A231 +M4942 A1081 +M4949 A801 +M4950 A801 +M4960 A607 +M4979 A1285 +M5014 A1250 diff --git a/examples/dhn/dhn_trainer.py b/examples/dhn/dhn_trainer.py new file mode 100644 index 00000000..7de50008 --- /dev/null +++ b/examples/dhn/dhn_trainer.py @@ -0,0 +1,361 @@ +import random +import numpy as np +import tensorlayerx as tlx +from tensorlayerx.model import TrainOneStep +import tensorflow as tf + +from gammagl.data import HeteroGraph +from gammagl.models.dhn import DHNModel, NODE_TYPE, K_HOP, NUM_FEA, NUM_NEIGHBOR, type2idx +from gammagl.utils import k_hop_subgraph + +# 全局忽略UserWarning +import warnings + +warnings.filterwarnings("ignore", category=UserWarning) + +random.seed(0) # 确保各个算法的数据,邻居等信息一致,保证公平 + +PATH = 'MA.txt' + +G = HeteroGraph() + + +def load_ACM(test_ratio=0.2): + edge_index_M = [] + edge_index_A = [] + + with open(PATH, 'r') as f: + for line in f.readlines(): + src, dst = line.strip().split() # 假设每行包含两个由空格分隔的节点标识符 + src_type, src_id = src[0], src[1:] # 解析源节点类型和ID + dst_type, dst_id = dst[0], dst[1:] # 解析目标节点类型和ID + + # 将节点ID转换为整数索引,并放入列表中 + if src[0] == 'M': + edge_index_M.append(int(src_id)) + elif src[0] == 'A': + edge_index_A.append(-int(src_id) - 1) + + if dst[0] == 'M': + edge_index_M.append(int(dst_id)) + elif dst[0] == 'A': + edge_index_A.append(-int(dst_id) - 1) + + edge_index = tlx.convert_to_tensor([edge_index_M, edge_index_A]) + G['M', 'MA', 'A'].edge_index = edge_index + + # 计算分割点 + sp = 1 - test_ratio * 2 + num_edge = len(edge_index_M) + sp1 = int(num_edge * sp) + sp2 = int(num_edge * test_ratio) + + G_train = HeteroGraph() + G_val = HeteroGraph() + G_test = HeteroGraph() + + # 划分训练集,验证集和测试集 + G_train['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[:sp1], edge_index_A[:sp1]]) + G_val['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1:sp1 + sp2], edge_index_A[sp1:sp1 + sp2]]) + G_test['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1 + sp2:], edge_index_A[sp1 + sp2:]]) + + print( + f"all edge: {len(G['M', 'MA', 'A'].edge_index[0])}, train edge: {len(G_train['M', 'MA', 'A'].edge_index[0])}, val edge: {len(G_val['M', 'MA', 'A'].edge_index[0])}, test edge: {len(G_test['M', 'MA', 'A'].edge_index[0])}") + + return G_train, G_val, G_test + + +def find_all_simple_paths(edge_index, src, dest, max_length): + # 将edge_index转换为邻接列表表示 + num_nodes = max(edge_index[0].max().item(), + edge_index[1].max().item(), + -edge_index[0].min().item(), + -edge_index[1].min().item(), + src.item()) + 1 + adj_list = [[] for _ in range(num_nodes)] + for u, v in zip(edge_index[0].tolist(), edge_index[1].tolist()): + adj_list[u].append(v) + + src = src.item() + + paths = [] + visited = set() + stack = [(src, [src])] + + while stack: + (node, path) = stack.pop() + + if node == dest: + paths.append(path) + elif len(path) < max_length: + for neighbor in adj_list[node]: + if neighbor not in path: + visited.add((node, neighbor)) + stack.append((neighbor, path + [neighbor])) + for neighbor in adj_list[node]: + if (node, neighbor) in visited: + visited.remove((node, neighbor)) + + return paths + + +def dist_encoder(src, dest, G, K_HOP, one_hot=True): + if (G.size(1) == 0): + paths = [] + else: + paths = find_all_simple_paths(G, src, dest, K_HOP + 2) + + cnt = [K_HOP + 1] * NODE_TYPE # 超过max_spd的默认截断 + for path in paths: + res = [0] * NODE_TYPE + for i in path: + if i >= 0: + res[type2idx['M']] += 1 + else: + res[type2idx['A']] += 1 + + for k in range(NODE_TYPE): + cnt[k] = min(cnt[k], res[k]) + + # 生成one-hot编码 + if one_hot: + one_hot_list = [np.eye(K_HOP + 2, dtype=np.float64)[cnt[i]] + for i in range(NODE_TYPE)] + return np.concatenate(one_hot_list) + return cnt + + +def type_encoder(node): + res = [0] * NODE_TYPE + if node.item() >= 0: + res[type2idx['M']] = 1.0 + else: + res[type2idx['A']] = 1.0 + return res + + +mini_batch = [] +fea_batch = [] + + +def gen_fea_batch(G, root, fea_dict, hop): + fea_batch = [] + mini_batch.append(root) + + a = [0] * (K_HOP + 2) * 4 + type_encoder(root) + + fea_batch.append(np.asarray(a, + dtype=np.float32 + ).reshape(-1, NUM_FEA) + ) + + # 一阶邻居采样 + ns_1 = [] + src, dst = G + for node in mini_batch[-1]: + if node.item() >= 0: + neighbors_mask = src == node + else: + neighbors_mask = dst == node + neighbors = list(dst[neighbors_mask].numpy()) + neighbors.append(node.item()) + random_choice_list = np.random.choice(neighbors, NUM_NEIGHBOR, replace=True) + ns_1.append(random_choice_list.tolist()) + ns_1 = tlx.convert_to_tensor(ns_1) + mini_batch.append(ns_1[0]) + + de_1 = [ + np.concatenate([fea_dict[ns_1[0][i].item()], np.asarray(type_encoder(ns_1[0][i]))], axis=0) + for i in range(0, ns_1[0].shape[0]) + ] + + fea_batch.append(np.asarray(de_1, + dtype=np.float32).reshape(1, -1) + ) + + # 二阶邻居采样 + ns_2 = [] + for node in mini_batch[-1]: + if node.item() >= 0: + neighbors_mask = src == node + else: + neighbors_mask = dst == node + neighbors = list(dst[neighbors_mask].numpy()) + neighbors.append(node.item()) + random_choice_list = np.random.choice(neighbors, NUM_NEIGHBOR, replace=True) + ns_2.append(random_choice_list.tolist()) + ns_2 = tlx.convert_to_tensor(ns_2) + + de_2 = [] + for i in range(len(ns_2)): + tmp = [] + for j in range(len(ns_2[0])): + tmp.append( + np.concatenate([fea_dict[ns_2[i][j].item()], np.asarray(type_encoder(ns_2[i][j]))], axis=0) + ) + de_2.append(tmp) + + fea_batch.append(np.asarray(de_2, + dtype=np.float32).reshape(1, -1) + ) + + return np.concatenate(fea_batch, axis=1) + + +def subgraph_sampling_with_DE_node_pair(G, node_pair, K_HOP=2): + [A, B] = node_pair + + edge_index = tlx.concat([G['M', 'MA', 'A'].edge_index, reversed(G['M', 'MA', 'A'].edge_index)], axis=1) + + # 求A和B的K跳子图 + sub_G_for_AB = k_hop_subgraph([A, B], K_HOP, edge_index) + + # 使用布尔索引删除边 + # 注意:只是删除边,点仍然保留 + edge_index_np = sub_G_for_AB[1].numpy() + remove_indices = tlx.convert_to_tensor([ + ((edge_index_np[0, i] == A) & (edge_index_np[1, i] == B)) | ( + (edge_index_np[0, i] == B) & (edge_index_np[1, i] == A)) + for i in range(sub_G_for_AB[1].shape[1]) + ]) + remove_indices = remove_indices.numpy() + sub_G_index = sub_G_for_AB[1][:, ~remove_indices] + + sub_G_nodes = set(np.unique(sub_G_for_AB[0].numpy())) | set( + np.unique(sub_G_for_AB[1].numpy())) # 获取图中的点 + sub_G_nodes = tlx.convert_to_tensor(list(sub_G_nodes)) + + # 子图中所有点到node pair的距离 + SPD_based_on_node_pair = {} + for node in sub_G_nodes: + tmpA = dist_encoder(A, node, sub_G_index, K_HOP) + tmpB = dist_encoder(B, node, sub_G_index, K_HOP) + + SPD_based_on_node_pair[node.item()] = np.concatenate([tmpA, tmpB], axis=0) + + A_fea_batch = gen_fea_batch(sub_G_index, A, + SPD_based_on_node_pair, K_HOP) + B_fea_batch = gen_fea_batch(sub_G_index, B, + SPD_based_on_node_pair, K_HOP) + + return A_fea_batch, B_fea_batch + + +def batch_data(G, + batch_size=3): + edge_index = G['M', 'MA', 'A'].edge_index + nodes = set(tlx.convert_to_tensor(np.unique(edge_index[0].numpy()))) | set( + tlx.convert_to_tensor(np.unique(edge_index[1].numpy()))) + + nodes_list = [] + for node in nodes: + nodes_list.append(node.item()) + + num_batch = int(len(edge_index[0]) / batch_size) + + # 打乱边的顺序 + edge_index_np = np.array(edge_index) + permutation = np.random.permutation(edge_index_np.shape[1]) # 生成一个随机排列的索引 + edge_index_np = edge_index_np[:, permutation] # 使用这个排列索引来打乱 edge_index + edge_index = tlx.convert_to_tensor(edge_index_np) + + for idx in range(num_batch): + batch_edge = edge_index[:, idx * batch_size:(idx + 1) * batch_size] # 取出batch_size条边 + batch_label = [1.0] * batch_size + + batch_A_fea = [] + batch_B_fea = [] + batch_x = [] + batch_y = [] + + i = 0 + for by in batch_label: + bx = batch_edge[:, i:i + 1] + + # 正样本 + posA, posB = subgraph_sampling_with_DE_node_pair(G, bx, K_HOP=K_HOP) + batch_A_fea.append(posA) + batch_B_fea.append(posB) + batch_y.append(np.asarray(by, dtype=np.float32)) + + # 负样本 + neg_tmpB_id = random.choice(nodes_list) + node_pair = tlx.convert_to_tensor([[bx[0].item()], [neg_tmpB_id]]) + + negA, negB = subgraph_sampling_with_DE_node_pair(G, node_pair, K_HOP=K_HOP) + batch_A_fea.append(negA) + batch_B_fea.append(negB) + batch_y.append(np.asarray(0.0, dtype=np.float32)) + + yield np.asarray(np.squeeze(batch_A_fea)), np.asarray(np.squeeze(batch_B_fea)), np.asarray( + batch_y).reshape(batch_size * 2, 1) + + +G_train, G_val, G_test = load_ACM(test_ratio=0.3) + +m = DHNModel() + +lr = 0.0002 +optim = tlx.optimizers.Adam(lr=lr, weight_decay=0.01) + +train_weights = m.trainable_weights + + +class Loss(tlx.model.WithLoss): + def __init__(self, net, loss_fn): + super(Loss, self).__init__(backbone=net, loss_fn=loss_fn) + + def forward(self, data, y): + logits = self.backbone_network(data['n1'], data['n2'], data['label']) + y = tlx.convert_to_tensor(y) + loss = self._loss_fn(logits, y) + return loss + + +net_with_loss = Loss(m, loss_fn=tlx.losses.sigmoid_cross_entropy) +net_with_train = TrainOneStep(net_with_loss, optim, train_weights) + +EPOCH = 100 +BATCH_SIZE = 32 + +tra_auc_cul = tf.keras.metrics.AUC() +val_auc_cul = tf.keras.metrics.AUC() +test_auc_cul = tf.keras.metrics.AUC() + +for epoch in range(EPOCH): + print("-----Epoch {}/{}-----".format(epoch + 1, EPOCH)) + + # train + m.set_train() + tra_batch_A_fea, tra_batch_B_fea, tra_batch_y = batch_data(G_train, BATCH_SIZE).__next__() + tra_out = m(tra_batch_A_fea, tra_batch_B_fea, tra_batch_y) + + data = { + "n1": tra_batch_A_fea, + "n2": tra_batch_B_fea, + "label": tra_batch_y + } + + tra_loss = net_with_train(data, tra_batch_y) + tra_auc_cul.update_state(y_true=tra_batch_y, y_pred=tlx.sigmoid(tra_out).detach().numpy()) + tra_auc = tra_auc_cul.result().numpy() + print('train: ', tra_loss, tra_auc) + + # val + m.set_eval() + val_batch_A_fea, val_batch_B_fea, val_batch_y = batch_data(G_val, BATCH_SIZE).__next__() + val_out = m(val_batch_A_fea, val_batch_B_fea, val_batch_y) + + val_loss = tlx.losses.sigmoid_cross_entropy(output=val_out, target=tlx.convert_to_tensor(val_batch_y)) + val_auc_cul.update_state(y_true=val_batch_y, y_pred=tlx.sigmoid(val_out).detach().numpy()) + val_auc = val_auc_cul.result().numpy() + print("val: ", val_loss.item(), val_auc) + + # test + test_batch_A_fea, test_batch_B_fea, test_batch_y = batch_data(G_test, BATCH_SIZE).__next__() + test_out = m(test_batch_A_fea, test_batch_B_fea, test_batch_y) + + test_loss = tlx.losses.sigmoid_cross_entropy(output=test_out, target=tlx.convert_to_tensor(test_batch_y)) + test_auc_cul.update_state(y_true=test_batch_y, y_pred=tlx.sigmoid(test_out).detach().numpy()) + test_auc = test_auc_cul.result().numpy() + print("test: ", test_loss.item(), test_auc) diff --git a/gammagl/models/dhn.py b/gammagl/models/dhn.py new file mode 100644 index 00000000..af8bd069 --- /dev/null +++ b/gammagl/models/dhn.py @@ -0,0 +1,82 @@ +import tensorlayerx as tlx + +type2idx = { + 'M': 0, + 'A': 1, + # 'C': 2, + # 'T': 3 +} + +NODE_TYPE = len(type2idx) +K_HOP = 2 + +NUM_FEA = (K_HOP + 2) * 4 + NODE_TYPE +NUM_NEIGHBOR = 5 + + +class DHN(tlx.nn.Module): + def __init__(self): + super().__init__() + self.lin1 = tlx.nn.Linear(in_features=36, out_features=64, act=tlx.nn.ELU(), W_init="xavier_uniform") + self.lin2 = tlx.nn.Linear(in_features=82, out_features=64, act=tlx.nn.ELU(), W_init="xavier_uniform") + self.lin3 = tlx.nn.Linear(in_features=64, out_features=64, act=tlx.nn.ELU(), W_init="xavier_uniform") + + def forward(self, fea): + node = tlx.convert_to_tensor(fea[:, :NUM_FEA]) + + # 提取neigh1和neigh2 + neigh1 = tlx.convert_to_tensor(fea[:, NUM_FEA:NUM_FEA * (NUM_NEIGHBOR + 1)]) + neigh1 = tlx.reshape(neigh1, [-1, NUM_NEIGHBOR, NUM_FEA]) + + neigh2 = tlx.convert_to_tensor(fea[:, NUM_FEA * (NUM_NEIGHBOR + 1):]) + neigh2 = tlx.reshape(neigh2, [-1, NUM_NEIGHBOR, NUM_NEIGHBOR, NUM_FEA]) + + # 对neigh2进行聚合 + neigh2_agg = tlx.reduce_mean(neigh2, axis=2) + + # 连接node和聚合后的neigh2 + tmp = tlx.concat( + [neigh1, neigh2_agg], + axis=2 + ) + + # 将tmp重塑为二维张量 + flattened_tmp = tmp.view(64 * 5, 36) + + # 将二维张量传递给线性层 + flattened_output = self.lin1(flattened_tmp) + + # 将输出张量重新整形为三维形状 + tmp = flattened_output.view(64, 5, 64) + + # 对node和tmp进行聚合 + emb = tlx.concat( + [ + node, tlx.reduce_mean(tmp, axis=1) + ], + axis=1 + ) + + # 通过其他线性层 + emb = self.lin2(emb) + emb = self.lin3(emb) + + return emb + + +class DHNModel(tlx.nn.Module): + def __init__(self): + super().__init__() + self.dhn1 = DHN() + self.dhn2 = DHN() + self.lin1 = tlx.nn.Linear(in_features=128, out_features=32, act=tlx.nn.ELU(), W_init="xavier_uniform") + self.lin2 = tlx.nn.Linear(in_features=32, out_features=1, act=tlx.nn.ELU(), W_init="xavier_uniform") + + def forward(self, n1, n2, label): + n1_emb = self.dhn1(n1) + n2_emb = self.dhn2(n2) + + pred = self.lin1(tlx.concat([n1_emb, n2_emb], axis=1)) + pred = self.lin2(pred) + + return pred From 9058ebf6f4852581c89945cf4995d5b5d04aa0df Mon Sep 17 00:00:00 2001 From: liberty <2700472871@qq.com> Date: Sun, 30 Jun 2024 19:51:27 +0800 Subject: [PATCH 2/8] Modify the dhn code and use MessagePassing --- examples/dhn/dhn_trainer.py | 184 ++++++++++++++++++-------------- gammagl/layers/conv/dhn_conv.py | 90 ++++++++++++++++ gammagl/models/dhn.py | 82 -------------- 3 files changed, 195 insertions(+), 161 deletions(-) create mode 100644 gammagl/layers/conv/dhn_conv.py delete mode 100644 gammagl/models/dhn.py diff --git a/examples/dhn/dhn_trainer.py b/examples/dhn/dhn_trainer.py index 7de50008..d0cb1ee2 100644 --- a/examples/dhn/dhn_trainer.py +++ b/examples/dhn/dhn_trainer.py @@ -1,21 +1,20 @@ +import argparse import random import numpy as np import tensorlayerx as tlx from tensorlayerx.model import TrainOneStep -import tensorflow as tf +from sklearn.metrics import roc_auc_score from gammagl.data import HeteroGraph -from gammagl.models.dhn import DHNModel, NODE_TYPE, K_HOP, NUM_FEA, NUM_NEIGHBOR, type2idx +from gammagl.layers.conv.dhn_conv import DHNModel, NODE_TYPE, K_HOP, NUM_FEA, NUM_NEIGHBOR, BATCH_SIZE, type2idx from gammagl.utils import k_hop_subgraph -# 全局忽略UserWarning +# The UserWarning is ignored globally import warnings warnings.filterwarnings("ignore", category=UserWarning) -random.seed(0) # 确保各个算法的数据,邻居等信息一致,保证公平 - -PATH = 'MA.txt' +random.seed(0) G = HeteroGraph() @@ -24,13 +23,13 @@ def load_ACM(test_ratio=0.2): edge_index_M = [] edge_index_A = [] - with open(PATH, 'r') as f: + with open(args.dataset_path, 'r') as f: for line in f.readlines(): - src, dst = line.strip().split() # 假设每行包含两个由空格分隔的节点标识符 - src_type, src_id = src[0], src[1:] # 解析源节点类型和ID - dst_type, dst_id = dst[0], dst[1:] # 解析目标节点类型和ID + src, dst = line.strip().split() + src_type, src_id = src[0], src[1:] # Resolves the source node type and ID + dst_type, dst_id = dst[0], dst[1:] # Resolve the target node type and ID - # 将节点ID转换为整数索引,并放入列表中 + # Convert the node ID to an integer index and place it in a list if src[0] == 'M': edge_index_M.append(int(src_id)) elif src[0] == 'A': @@ -44,7 +43,7 @@ def load_ACM(test_ratio=0.2): edge_index = tlx.convert_to_tensor([edge_index_M, edge_index_A]) G['M', 'MA', 'A'].edge_index = edge_index - # 计算分割点 + # Computed split point sp = 1 - test_ratio * 2 num_edge = len(edge_index_M) sp1 = int(num_edge * sp) @@ -54,7 +53,7 @@ def load_ACM(test_ratio=0.2): G_val = HeteroGraph() G_test = HeteroGraph() - # 划分训练集,验证集和测试集 + # Divide the training set, the verification set, and the test set G_train['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[:sp1], edge_index_A[:sp1]]) G_val['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1:sp1 + sp2], edge_index_A[sp1:sp1 + sp2]]) G_test['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1 + sp2:], edge_index_A[sp1 + sp2:]]) @@ -66,12 +65,12 @@ def load_ACM(test_ratio=0.2): def find_all_simple_paths(edge_index, src, dest, max_length): - # 将edge_index转换为邻接列表表示 + # Converts edge_index to an adjacency list representation num_nodes = max(edge_index[0].max().item(), edge_index[1].max().item(), -edge_index[0].min().item(), -edge_index[1].min().item(), - src.item()) + 1 + abs(src.item())) + 1 adj_list = [[] for _ in range(num_nodes)] for u, v in zip(edge_index[0].tolist(), edge_index[1].tolist()): adj_list[u].append(v) @@ -99,13 +98,13 @@ def find_all_simple_paths(edge_index, src, dest, max_length): return paths -def dist_encoder(src, dest, G, K_HOP, one_hot=True): +def dist_encoder(src, dest, G, K_HOP): if (G.size(1) == 0): paths = [] else: paths = find_all_simple_paths(G, src, dest, K_HOP + 2) - cnt = [K_HOP + 1] * NODE_TYPE # 超过max_spd的默认截断 + cnt = [K_HOP + 1] * NODE_TYPE # Default truncation for max_spd exceeded for path in paths: res = [0] * NODE_TYPE for i in path: @@ -117,8 +116,8 @@ def dist_encoder(src, dest, G, K_HOP, one_hot=True): for k in range(NODE_TYPE): cnt[k] = min(cnt[k], res[k]) - # 生成one-hot编码 - if one_hot: + # Generate one-hot encoding + if args.one_hot: one_hot_list = [np.eye(K_HOP + 2, dtype=np.float64)[cnt[i]] for i in range(NODE_TYPE)] return np.concatenate(one_hot_list) @@ -149,7 +148,7 @@ def gen_fea_batch(G, root, fea_dict, hop): ).reshape(-1, NUM_FEA) ) - # 一阶邻居采样 + # 1-order neighbor sampling ns_1 = [] src, dst = G for node in mini_batch[-1]: @@ -173,7 +172,7 @@ def gen_fea_batch(G, root, fea_dict, hop): dtype=np.float32).reshape(1, -1) ) - # 二阶邻居采样 + # 2-order neighbor sampling ns_2 = [] for node in mini_batch[-1]: if node.item() >= 0: @@ -207,11 +206,11 @@ def subgraph_sampling_with_DE_node_pair(G, node_pair, K_HOP=2): edge_index = tlx.concat([G['M', 'MA', 'A'].edge_index, reversed(G['M', 'MA', 'A'].edge_index)], axis=1) - # 求A和B的K跳子图 + # Find k-hop subgraphs of A and B sub_G_for_AB = k_hop_subgraph([A, B], K_HOP, edge_index) - # 使用布尔索引删除边 - # 注意:只是删除边,点仍然保留 + # Remove edges using Boolean indexes + # Note: Just remove the edges, the points remain edge_index_np = sub_G_for_AB[1].numpy() remove_indices = tlx.convert_to_tensor([ ((edge_index_np[0, i] == A) & (edge_index_np[1, i] == B)) | ( @@ -222,10 +221,10 @@ def subgraph_sampling_with_DE_node_pair(G, node_pair, K_HOP=2): sub_G_index = sub_G_for_AB[1][:, ~remove_indices] sub_G_nodes = set(np.unique(sub_G_for_AB[0].numpy())) | set( - np.unique(sub_G_for_AB[1].numpy())) # 获取图中的点 + np.unique(sub_G_for_AB[1].numpy())) # Gets the points in the graph sub_G_nodes = tlx.convert_to_tensor(list(sub_G_nodes)) - # 子图中所有点到node pair的距离 + # Distance from all points in the subgraph to the node pair SPD_based_on_node_pair = {} for node in sub_G_nodes: tmpA = dist_encoder(A, node, sub_G_index, K_HOP) @@ -253,14 +252,14 @@ def batch_data(G, num_batch = int(len(edge_index[0]) / batch_size) - # 打乱边的顺序 + # Shuffle the order of the edges edge_index_np = np.array(edge_index) - permutation = np.random.permutation(edge_index_np.shape[1]) # 生成一个随机排列的索引 - edge_index_np = edge_index_np[:, permutation] # 使用这个排列索引来打乱 edge_index + permutation = np.random.permutation(edge_index_np.shape[1]) # Generate a randomly arranged index + edge_index_np = edge_index_np[:, permutation] # Use this permutation index to scramble edge_index edge_index = tlx.convert_to_tensor(edge_index_np) for idx in range(num_batch): - batch_edge = edge_index[:, idx * batch_size:(idx + 1) * batch_size] # 取出batch_size条边 + batch_edge = edge_index[:, idx * batch_size:(idx + 1) * batch_size] # Take out batch_size edges batch_label = [1.0] * batch_size batch_A_fea = [] @@ -272,13 +271,13 @@ def batch_data(G, for by in batch_label: bx = batch_edge[:, i:i + 1] - # 正样本 + # Positive sample posA, posB = subgraph_sampling_with_DE_node_pair(G, bx, K_HOP=K_HOP) batch_A_fea.append(posA) batch_B_fea.append(posB) batch_y.append(np.asarray(by, dtype=np.float32)) - # 负样本 + # Negative sample neg_tmpB_id = random.choice(nodes_list) node_pair = tlx.convert_to_tensor([[bx[0].item()], [neg_tmpB_id]]) @@ -291,16 +290,6 @@ def batch_data(G, batch_y).reshape(batch_size * 2, 1) -G_train, G_val, G_test = load_ACM(test_ratio=0.3) - -m = DHNModel() - -lr = 0.0002 -optim = tlx.optimizers.Adam(lr=lr, weight_decay=0.01) - -train_weights = m.trainable_weights - - class Loss(tlx.model.WithLoss): def __init__(self, net, loss_fn): super(Loss, self).__init__(backbone=net, loss_fn=loss_fn) @@ -312,50 +301,87 @@ def forward(self, data, y): return loss -net_with_loss = Loss(m, loss_fn=tlx.losses.sigmoid_cross_entropy) -net_with_train = TrainOneStep(net_with_loss, optim, train_weights) +class AUCMetric: + def __init__(self): + self.true_labels = [] + self.predicted_scores = [] + + def update_state(self, y_true, y_pred): + self.true_labels.extend(y_true) + self.predicted_scores.extend(y_pred) + + def result(self): + auc = roc_auc_score(self.true_labels, self.predicted_scores) + return auc + + +def main(args): + if str.lower(args.dataset) not in ['acm']: + raise ValueError('Unknown dataset: {}'.format(args.dataset)) + if str.lower(args.dataset) == 'acm': + G_train, G_val, G_test = load_ACM(test_ratio=args.test_ratio) + + m = DHNModel() + + optim = tlx.optimizers.Adam(lr=args.lr, weight_decay=args.drop_rate) + train_weights = m.trainable_weights + + net_with_loss = Loss(m, loss_fn=tlx.losses.sigmoid_cross_entropy) + net_with_train = TrainOneStep(net_with_loss, optim, train_weights) + + tra_auc_metric = AUCMetric() + val_auc_metric = AUCMetric() + test_auc_metric = AUCMetric() + + for epoch in range(args.n_epoch): + print("-----Epoch {}/{}-----".format(epoch + 1, args.n_epoch)) -EPOCH = 100 -BATCH_SIZE = 32 + # train + m.set_train() + tra_batch_A_fea, tra_batch_B_fea, tra_batch_y = batch_data(G_train, BATCH_SIZE).__next__() + tra_out = m(tra_batch_A_fea, tra_batch_B_fea, tra_batch_y) -tra_auc_cul = tf.keras.metrics.AUC() -val_auc_cul = tf.keras.metrics.AUC() -test_auc_cul = tf.keras.metrics.AUC() + data = { + "n1": tra_batch_A_fea, + "n2": tra_batch_B_fea, + "label": tra_batch_y + } -for epoch in range(EPOCH): - print("-----Epoch {}/{}-----".format(epoch + 1, EPOCH)) + tra_loss = net_with_train(data, tra_batch_y) + tra_auc_metric.update_state(y_true=tra_batch_y, y_pred=tlx.sigmoid(tra_out).detach().numpy()) + tra_auc = tra_auc_metric.result() + print('train: ', tra_loss, tra_auc) - # train - m.set_train() - tra_batch_A_fea, tra_batch_B_fea, tra_batch_y = batch_data(G_train, BATCH_SIZE).__next__() - tra_out = m(tra_batch_A_fea, tra_batch_B_fea, tra_batch_y) + # val + m.set_eval() + val_batch_A_fea, val_batch_B_fea, val_batch_y = batch_data(G_val, BATCH_SIZE).__next__() + val_out = m(val_batch_A_fea, val_batch_B_fea, val_batch_y) - data = { - "n1": tra_batch_A_fea, - "n2": tra_batch_B_fea, - "label": tra_batch_y - } + val_loss = tlx.losses.sigmoid_cross_entropy(output=val_out, target=tlx.convert_to_tensor(val_batch_y)) + val_auc_metric.update_state(y_true=val_batch_y, y_pred=tlx.sigmoid(val_out).detach().numpy()) + val_auc = val_auc_metric.result() + print("val: ", val_loss.item(), val_auc) - tra_loss = net_with_train(data, tra_batch_y) - tra_auc_cul.update_state(y_true=tra_batch_y, y_pred=tlx.sigmoid(tra_out).detach().numpy()) - tra_auc = tra_auc_cul.result().numpy() - print('train: ', tra_loss, tra_auc) + # test + test_batch_A_fea, test_batch_B_fea, test_batch_y = batch_data(G_test, BATCH_SIZE).__next__() + test_out = m(test_batch_A_fea, test_batch_B_fea, test_batch_y) - # val - m.set_eval() - val_batch_A_fea, val_batch_B_fea, val_batch_y = batch_data(G_val, BATCH_SIZE).__next__() - val_out = m(val_batch_A_fea, val_batch_B_fea, val_batch_y) + test_loss = tlx.losses.sigmoid_cross_entropy(output=test_out, target=tlx.convert_to_tensor(test_batch_y)) + test_auc_metric.update_state(y_true=test_batch_y, y_pred=tlx.sigmoid(test_out).detach().numpy()) + test_auc = test_auc_metric.result() + print("test: ", test_loss.item(), test_auc) - val_loss = tlx.losses.sigmoid_cross_entropy(output=val_out, target=tlx.convert_to_tensor(val_batch_y)) - val_auc_cul.update_state(y_true=val_batch_y, y_pred=tlx.sigmoid(val_out).detach().numpy()) - val_auc = val_auc_cul.result().numpy() - print("val: ", val_loss.item(), val_auc) - # test - test_batch_A_fea, test_batch_B_fea, test_batch_y = batch_data(G_test, BATCH_SIZE).__next__() - test_out = m(test_batch_A_fea, test_batch_B_fea, test_batch_y) +if __name__ == '__main__': + # parameters setting + parser = argparse.ArgumentParser() + parser.add_argument("--test_ratio", type=float, default=0.3, help="ratio of dividing the data set") + parser.add_argument("--one_hot", type=bool, default=True, help="use one-hot encoding") + parser.add_argument("--lr", type=float, default=0.001, help="learnin rate") + parser.add_argument("--n_epoch", type=int, default=100, help="number of epoch") + parser.add_argument("--drop_rate", type=float, default=0.01, help="drop_rate") + parser.add_argument('--dataset', type=str, default='acm', help='dataset') + parser.add_argument("--dataset_path", type=str, default=r"MA.txt") - test_loss = tlx.losses.sigmoid_cross_entropy(output=test_out, target=tlx.convert_to_tensor(test_batch_y)) - test_auc_cul.update_state(y_true=test_batch_y, y_pred=tlx.sigmoid(test_out).detach().numpy()) - test_auc = test_auc_cul.result().numpy() - print("test: ", test_loss.item(), test_auc) + args = parser.parse_args() + main(args) diff --git a/gammagl/layers/conv/dhn_conv.py b/gammagl/layers/conv/dhn_conv.py new file mode 100644 index 00000000..dc651a6a --- /dev/null +++ b/gammagl/layers/conv/dhn_conv.py @@ -0,0 +1,90 @@ +import tensorlayerx as tlx +from gammagl.layers.conv import MessagePassing + +type2idx = { + 'M': 0, + 'A': 1, + # 'C': 2, + # 'T': 3 +} + +NODE_TYPE = len(type2idx) +K_HOP = 2 + +NUM_FEA = (K_HOP + 2) * 4 + NODE_TYPE +NUM_NEIGHBOR = 5 +BATCH_SIZE=32 + + +class DHNConv(MessagePassing): + def __init__(self): + super().__init__() + self.lin1 = tlx.nn.Linear(in_features=2*NUM_FEA, out_features=2*BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") + self.lin2 = tlx.nn.Linear(in_features=2*BATCH_SIZE+NUM_FEA, out_features=2*BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") + self.lin3 = tlx.nn.Linear(in_features=2*BATCH_SIZE, out_features=2*BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") + + def aggregate(self, msg, edge_index, num_nodes=None, aggr=None): + if len(msg.shape)==4: + return tlx.reduce_mean(msg, axis=2) + elif len(msg.shape)==3: + return tlx.reduce_mean(msg, axis=1) + + def forward(self, fea): + node = tlx.convert_to_tensor(fea[:, :NUM_FEA]) + + # Extract neigh1 and neigh2 + neigh1 = tlx.convert_to_tensor(fea[:, NUM_FEA:NUM_FEA * (NUM_NEIGHBOR + 1)]) + neigh1 = tlx.reshape(neigh1, [-1, NUM_NEIGHBOR, NUM_FEA]) + + neigh2 = tlx.convert_to_tensor(fea[:, NUM_FEA * (NUM_NEIGHBOR + 1):]) + neigh2 = tlx.reshape(neigh2, [-1, NUM_NEIGHBOR, NUM_NEIGHBOR, NUM_FEA]) + + # aggregate on neigh2 + neigh2_agg = self.propagate(edge_index=None, x=neigh2) + + # connect the node to the aggregated neigh2 + tmp = tlx.concat( + [neigh1, neigh2_agg], + axis=2 + ) + + # transform into a two-dimensional tensor + flattened_tmp = tmp.view(2*BATCH_SIZE * NUM_NEIGHBOR, 2*NUM_FEA) + flattened_output = self.lin1(flattened_tmp) + # Reshape the output tensor to a three-dimensional shape + tmp = flattened_output.view(2*BATCH_SIZE, NUM_NEIGHBOR, 2*BATCH_SIZE) + + # Aggregate node and tmp + emb = tlx.concat( + [ + node, self.propagate(edge_index=None,x=tmp) + ], + axis=1 + ) + + # Through other linear layers + emb = self.lin2(emb) + emb = self.lin3(emb) + + return emb + + def message(self, x, edge_index, edge_weight=None): + return x + + +class DHNModel(tlx.nn.Module): + def __init__(self): + super().__init__() + self.dhn1 = DHNConv() + self.dhn2 = DHNConv() + self.lin1 = tlx.nn.Linear(in_features=4*BATCH_SIZE, out_features=BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") + self.lin2 = tlx.nn.Linear(in_features=BATCH_SIZE, out_features=1, act=tlx.nn.ELU(), W_init="xavier_uniform") + + def forward(self, n1, n2, label): + n1_emb = self.dhn1(n1) + n2_emb = self.dhn2(n2) + + pred = self.lin1(tlx.concat([n1_emb, n2_emb], axis=1)) + pred = self.lin2(pred) + + return pred diff --git a/gammagl/models/dhn.py b/gammagl/models/dhn.py deleted file mode 100644 index af8bd069..00000000 --- a/gammagl/models/dhn.py +++ /dev/null @@ -1,82 +0,0 @@ -import tensorlayerx as tlx - -type2idx = { - 'M': 0, - 'A': 1, - # 'C': 2, - # 'T': 3 -} - -NODE_TYPE = len(type2idx) -K_HOP = 2 - -NUM_FEA = (K_HOP + 2) * 4 + NODE_TYPE -NUM_NEIGHBOR = 5 - - -class DHN(tlx.nn.Module): - def __init__(self): - super().__init__() - self.lin1 = tlx.nn.Linear(in_features=36, out_features=64, act=tlx.nn.ELU(), W_init="xavier_uniform") - self.lin2 = tlx.nn.Linear(in_features=82, out_features=64, act=tlx.nn.ELU(), W_init="xavier_uniform") - self.lin3 = tlx.nn.Linear(in_features=64, out_features=64, act=tlx.nn.ELU(), W_init="xavier_uniform") - - def forward(self, fea): - node = tlx.convert_to_tensor(fea[:, :NUM_FEA]) - - # 提取neigh1和neigh2 - neigh1 = tlx.convert_to_tensor(fea[:, NUM_FEA:NUM_FEA * (NUM_NEIGHBOR + 1)]) - neigh1 = tlx.reshape(neigh1, [-1, NUM_NEIGHBOR, NUM_FEA]) - - neigh2 = tlx.convert_to_tensor(fea[:, NUM_FEA * (NUM_NEIGHBOR + 1):]) - neigh2 = tlx.reshape(neigh2, [-1, NUM_NEIGHBOR, NUM_NEIGHBOR, NUM_FEA]) - - # 对neigh2进行聚合 - neigh2_agg = tlx.reduce_mean(neigh2, axis=2) - - # 连接node和聚合后的neigh2 - tmp = tlx.concat( - [neigh1, neigh2_agg], - axis=2 - ) - - # 将tmp重塑为二维张量 - flattened_tmp = tmp.view(64 * 5, 36) - - # 将二维张量传递给线性层 - flattened_output = self.lin1(flattened_tmp) - - # 将输出张量重新整形为三维形状 - tmp = flattened_output.view(64, 5, 64) - - # 对node和tmp进行聚合 - emb = tlx.concat( - [ - node, tlx.reduce_mean(tmp, axis=1) - ], - axis=1 - ) - - # 通过其他线性层 - emb = self.lin2(emb) - emb = self.lin3(emb) - - return emb - - -class DHNModel(tlx.nn.Module): - def __init__(self): - super().__init__() - self.dhn1 = DHN() - self.dhn2 = DHN() - self.lin1 = tlx.nn.Linear(in_features=128, out_features=32, act=tlx.nn.ELU(), W_init="xavier_uniform") - self.lin2 = tlx.nn.Linear(in_features=32, out_features=1, act=tlx.nn.ELU(), W_init="xavier_uniform") - - def forward(self, n1, n2, label): - n1_emb = self.dhn1(n1) - n2_emb = self.dhn2(n2) - - pred = self.lin1(tlx.concat([n1_emb, n2_emb], axis=1)) - pred = self.lin2(pred) - - return pred From 575eec57dbdba761589f048eb62810965b1f33a5 Mon Sep 17 00:00:00 2001 From: liberty <2700472871@qq.com> Date: Mon, 1 Jul 2024 21:05:51 +0800 Subject: [PATCH 3/8] Add dataset and test code --- examples/dhn/MA.txt | 7071 --------------------- gammagl/datasets/acm4dhn.py | 0 gammagl/models/dhn.py | 0 gammagl/utils/simple_path.py | 0 tests/utils/test_find_all_simple_paths.py | 0 5 files changed, 7071 deletions(-) delete mode 100644 examples/dhn/MA.txt create mode 100644 gammagl/datasets/acm4dhn.py create mode 100644 gammagl/models/dhn.py create mode 100644 gammagl/utils/simple_path.py create mode 100644 tests/utils/test_find_all_simple_paths.py diff --git a/examples/dhn/MA.txt b/examples/dhn/MA.txt deleted file mode 100644 index 3d275250..00000000 --- a/examples/dhn/MA.txt +++ /dev/null @@ -1,7071 +0,0 @@ -M0 A1177 -M1 A742 -M2 A478 -M3 A713 -M5 A955 -M6 A698 -M8 A99 -M9 A996 -M10 A580 -M11 A1235 -M12 A292 -M13 A742 -M14 A742 -M15 A580 -M16 A418 -M17 A99 -M18 A742 -M19 A1009 -M20 A188 -M21 A562 -M22 A753 -M23 A188 -M24 A962 -M25 A1043 -M26 A219 -M27 A1040 -M28 A419 -M29 A851 -M30 A594 -M31 A698 -M32 A1040 -M33 A742 -M34 A1054 -M36 A148 -M37 A887 -M39 A562 -M40 A340 -M41 A778 -M42 A1117 -M44 A826 -M45 A816 -M46 A1212 -M47 A287 -M48 A856 -M49 A794 -M50 A219 -M51 A641 -M52 A687 -M53 A148 -M54 A566 -M58 A53 -M59 A187 -M60 A284 -M61 A964 -M62 A349 -M63 A478 -M64 A1213 -M65 A287 -M66 A826 -M67 A53 -M68 A423 -M69 A1040 -M70 A1018 -M71 A1009 -M72 A19 -M73 A1009 -M74 A842 -M75 A1050 -M76 A142 -M77 A338 -M78 A423 -M79 A974 -M80 A1040 -M83 A70 -M84 A1341 -M86 A974 -M87 A1350 -M88 A1310 -M91 A224 -M92 A865 -M93 A908 -M94 A650 -M95 A123 -M96 A550 -M97 A219 -M99 A188 -M100 A1024 -M101 A178 -M102 A287 -M103 A287 -M104 A903 -M105 A842 -M106 A742 -M107 A411 -M108 A28 -M109 A698 -M110 A6 -M111 A645 -M112 A707 -M113 A808 -M114 A39 -M115 A39 -M116 A1009 -M117 A1009 -M118 A742 -M119 A937 -M120 A826 -M121 A1007 -M122 A591 -M123 A1054 -M126 A3 -M127 A99 -M128 A713 -M129 A224 -M130 A99 -M134 A742 -M135 A1050 -M136 A808 -M137 A478 -M141 A831 -M142 A349 -M144 A1054 -M145 A1054 -M146 A147 -M147 A178 -M148 A445 -M149 A702 -M150 A1381 -M151 A245 -M152 A1009 -M153 A964 -M155 A1050 -M157 A1371 -M158 A1050 -M159 A826 -M160 A99 -M161 A698 -M162 A908 -M163 A908 -M164 A176 -M165 A735 -M166 A19 -M168 A349 -M169 A550 -M171 A1035 -M172 A272 -M173 A248 -M174 A39 -M175 A591 -M176 A147 -M178 A1003 -M179 A219 -M181 A742 -M182 A856 -M183 A351 -M184 A133 -M185 A1310 -M186 A287 -M187 A39 -M188 A274 -M189 A1050 -M190 A1009 -M191 A1382 -M192 A133 -M193 A808 -M194 A519 -M195 A1073 -M197 A1009 -M200 A591 -M202 A1073 -M203 A1117 -M205 A742 -M207 A287 -M208 A224 -M209 A1178 -M210 A1054 -M211 A1024 -M212 A1040 -M213 A419 -M214 A1282 -M215 A1263 -M216 A317 -M217 A671 -M218 A21 -M219 A641 -M220 A1050 -M221 A829 -M222 A1035 -M224 A903 -M225 A351 -M226 A1199 -M227 A539 -M228 A1234 -M229 A351 -M230 A1373 -M231 A70 -M232 A592 -M234 A1050 -M235 A9 -M236 A1039 -M237 A1039 -M238 A1345 -M239 A1054 -M240 A1039 -M241 A1117 -M243 A903 -M245 A773 -M249 A1154 -M250 A591 -M251 A36 -M252 A984 -M253 A389 -M254 A178 -M255 A178 -M256 A156 -M257 A219 -M258 A555 -M259 A478 -M263 A1345 -M264 A1043 -M265 A1054 -M267 A1145 -M268 A566 -M269 A245 -M270 A962 -M271 A1213 -M272 A1009 -M274 A1009 -M275 A419 -M276 A643 -M277 A1340 -M278 A351 -M280 A974 -M282 A903 -M283 A318 -M284 A1050 -M285 A1073 -M286 A1125 -M287 A1046 -M288 A572 -M289 A742 -M290 A1179 -M291 A1089 -M292 A1179 -M293 A577 -M294 A36 -M295 A464 -M296 A219 -M297 A1199 -M298 A507 -M299 A816 -M300 A903 -M302 A1339 -M303 A1054 -M304 A490 -M305 A742 -M306 A1177 -M307 A219 -M308 A219 -M309 A671 -M310 A1027 -M311 A224 -M312 A1281 -M314 A36 -M315 A338 -M316 A29 -M318 A947 -M319 A280 -M320 A99 -M321 A861 -M322 A351 -M324 A543 -M325 A36 -M326 A219 -M327 A826 -M329 A1367 -M330 A466 -M331 A29 -M332 A1141 -M334 A916 -M335 A418 -M336 A783 -M337 A1265 -M338 A1374 -M339 A263 -M340 A962 -M341 A340 -M342 A133 -M344 A899 -M345 A910 -M346 A1326 -M347 A245 -M348 A546 -M349 A1110 -M351 A441 -M352 A1009 -M353 A224 -M354 A1179 -M356 A566 -M357 A886 -M358 A1314 -M359 A482 -M360 A1048 -M361 A219 -M363 A1040 -M364 A964 -M365 A245 -M366 A1040 -M368 A425 -M369 A473 -M370 A1050 -M371 A982 -M372 A418 -M373 A1163 -M374 A953 -M375 A550 -M376 A58 -M377 A434 -M378 A441 -M379 A908 -M380 A1073 -M381 A528 -M382 A178 -M383 A961 -M384 A243 -M385 A591 -M386 A961 -M387 A566 -M388 A419 -M389 A1154 -M390 A300 -M391 A919 -M392 A291 -M393 A340 -M394 A831 -M395 A1024 -M396 A224 -M397 A591 -M398 A351 -M399 A566 -M400 A178 -M401 A1141 -M402 A1345 -M405 A1179 -M406 A466 -M407 A1131 -M408 A156 -M409 A1009 -M410 A714 -M411 A197 -M412 A1393 -M413 A156 -M414 A506 -M415 A36 -M416 A335 -M417 A954 -M420 A808 -M421 A155 -M422 A870 -M423 A246 -M424 A589 -M425 A148 -M426 A32 -M427 A414 -M428 A95 -M429 A982 -M430 A259 -M431 A565 -M432 A885 -M433 A547 -M434 A1040 -M435 A935 -M436 A9 -M437 A816 -M438 A1050 -M439 A287 -M440 A123 -M441 A671 -M442 A245 -M443 A950 -M444 A1345 -M445 A9 -M446 A245 -M447 A982 -M448 A423 -M449 A1345 -M450 A1048 -M451 A1127 -M452 A219 -M453 A1393 -M454 A1213 -M455 A903 -M456 A982 -M457 A224 -M458 A982 -M460 A1345 -M461 A861 -M462 A831 -M463 A1179 -M464 A591 -M465 A419 -M467 A1305 -M468 A1127 -M469 A246 -M470 A178 -M471 A566 -M472 A411 -M474 A861 -M475 A70 -M476 A1179 -M478 A1345 -M481 A753 -M482 A242 -M483 A1054 -M484 A1214 -M486 A982 -M487 A351 -M488 A1039 -M490 A808 -M491 A245 -M492 A993 -M493 A363 -M496 A691 -M498 A1024 -M499 A1000 -M500 A593 -M501 A1373 -M503 A667 -M505 A1047 -M508 A593 -M509 A1131 -M510 A490 -M512 A831 -M513 A698 -M514 A197 -M515 A1024 -M516 A340 -M517 A1305 -M520 A448 -M521 A590 -M522 A1009 -M523 A1291 -M524 A445 -M525 A687 -M526 A1054 -M527 A133 -M528 A903 -M529 A1314 -M530 A982 -M531 A988 -M532 A248 -M534 A9 -M535 A1345 -M536 A224 -M538 A961 -M540 A831 -M541 A577 -M542 A391 -M544 A36 -M545 A1188 -M546 A245 -M547 A328 -M548 A580 -M549 A982 -M550 A1345 -M551 A245 -M552 A458 -M553 A233 -M554 A580 -M556 A351 -M557 A566 -M558 A1290 -M560 A691 -M561 A546 -M562 A964 -M564 A1350 -M565 A903 -M566 A139 -M568 A550 -M569 A982 -M570 A645 -M571 A29 -M572 A936 -M574 A641 -M576 A968 -M577 A363 -M579 A851 -M580 A284 -M581 A904 -M582 A970 -M583 A53 -M584 A246 -M585 A1373 -M587 A701 -M588 A539 -M589 A591 -M590 A36 -M591 A245 -M592 A317 -M594 A1050 -M595 A851 -M596 A963 -M597 A423 -M598 A1350 -M599 A908 -M600 A443 -M601 A773 -M602 A1345 -M603 A1103 -M604 A286 -M605 A1048 -M606 A66 -M607 A90 -M609 A1179 -M610 A580 -M611 A178 -M612 A349 -M613 A808 -M614 A36 -M615 A571 -M618 A245 -M620 A1272 -M625 A99 -M627 A1352 -M628 A363 -M631 A39 -M632 A577 -M633 A590 -M635 A419 -M638 A803 -M639 A197 -M641 A219 -M642 A590 -M643 A754 -M644 A907 -M646 A968 -M648 A224 -M650 A1310 -M651 A567 -M652 A9 -M653 A338 -M654 A1127 -M655 A224 -M656 A1282 -M657 A1052 -M658 A1054 -M659 A224 -M660 A29 -M661 A808 -M662 A1040 -M663 A336 -M664 A977 -M665 A363 -M666 A352 -M667 A245 -M668 A903 -M669 A246 -M671 A1050 -M672 A229 -M673 A1009 -M674 A713 -M675 A1117 -M676 A1365 -M677 A1215 -M678 A1141 -M679 A816 -M682 A885 -M683 A178 -M684 A550 -M686 A245 -M687 A313 -M690 A645 -M691 A338 -M692 A566 -M693 A928 -M694 A710 -M695 A1380 -M696 A903 -M697 A585 -M698 A546 -M699 A566 -M701 A643 -M702 A550 -M707 A29 -M708 A571 -M709 A908 -M710 A577 -M711 A1121 -M712 A224 -M714 A1339 -M715 A304 -M716 A351 -M718 A122 -M719 A681 -M721 A661 -M722 A1179 -M724 A816 -M725 A216 -M726 A363 -M728 A1050 -M729 A1120 -M731 A910 -M732 A903 -M733 A245 -M734 A197 -M735 A974 -M736 A1050 -M737 A36 -M738 A308 -M739 A1050 -M740 A1272 -M742 A351 -M743 A706 -M745 A588 -M746 A1179 -M747 A1040 -M748 A821 -M749 A817 -M751 A935 -M753 A698 -M754 A253 -M755 A778 -M760 A118 -M761 A287 -M763 A631 -M764 A1108 -M766 A567 -M767 A9 -M768 A1256 -M769 A826 -M770 A383 -M771 A1122 -M772 A351 -M773 A964 -M774 A246 -M778 A713 -M779 A1135 -M781 A103 -M783 A577 -M784 A577 -M785 A245 -M786 A1040 -M787 A351 -M788 A831 -M789 A1048 -M793 A582 -M794 A99 -M795 A572 -M796 A974 -M798 A958 -M799 A326 -M801 A188 -M802 A603 -M803 A279 -M804 A550 -M805 A691 -M806 A974 -M807 A742 -M808 A816 -M809 A133 -M811 A910 -M813 A772 -M814 A123 -M815 A1072 -M817 A260 -M818 A1206 -M821 A1120 -M822 A928 -M823 A54 -M824 A1141 -M827 A1127 -M828 A982 -M829 A546 -M830 A1382 -M831 A903 -M832 A826 -M834 A1373 -M835 A36 -M836 A224 -M837 A98 -M838 A577 -M840 A119 -M841 A445 -M842 A1009 -M843 A691 -M844 A1245 -M845 A224 -M846 A1157 -M847 A141 -M848 A1179 -M849 A506 -M850 A1179 -M851 A1009 -M852 A421 -M853 A1199 -M854 A903 -M855 A151 -M856 A1040 -M858 A865 -M859 A363 -M860 A245 -M861 A75 -M862 A284 -M863 A399 -M864 A19 -M865 A423 -M866 A177 -M868 A577 -M869 A1111 -M871 A886 -M872 A1290 -M873 A808 -M874 A351 -M876 A1382 -M877 A133 -M878 A1127 -M879 A577 -M880 A908 -M881 A214 -M882 A242 -M886 A147 -M887 A1038 -M889 A605 -M890 A573 -M891 A363 -M892 A844 -M893 A1009 -M894 A363 -M895 A197 -M896 A263 -M898 A1395 -M900 A156 -M901 A826 -M902 A762 -M903 A1213 -M904 A1345 -M905 A742 -M906 A1024 -M907 A908 -M908 A855 -M909 A1340 -M910 A1040 -M911 A219 -M912 A1376 -M913 A1393 -M914 A51 -M915 A123 -M916 A1142 -M917 A650 -M918 A1117 -M920 A577 -M923 A326 -M924 A1166 -M925 A1131 -M926 A39 -M929 A996 -M930 A1050 -M931 A1157 -M932 A10 -M933 A591 -M934 A566 -M935 A1345 -M937 A246 -M938 A550 -M939 A349 -M940 A178 -M941 A123 -M942 A36 -M943 A246 -M944 A29 -M945 A742 -M946 A1179 -M947 A739 -M948 A371 -M949 A974 -M950 A903 -M951 A123 -M953 A383 -M954 A1048 -M955 A1089 -M956 A831 -M957 A1235 -M958 A419 -M959 A36 -M960 A1039 -M964 A193 -M965 A284 -M966 A317 -M967 A1104 -M968 A196 -M969 A351 -M970 A702 -M972 A842 -M973 A977 -M974 A250 -M975 A656 -M977 A1127 -M978 A1245 -M979 A1235 -M980 A595 -M981 A222 -M982 A962 -M983 A1040 -M984 A1316 -M987 A1179 -M989 A1120 -M990 A219 -M991 A1192 -M993 A698 -M995 A1199 -M996 A562 -M997 A351 -M998 A383 -M999 A628 -M1000 A954 -M1001 A245 -M1003 A1290 -M1004 A977 -M1005 A1043 -M1006 A1345 -M1008 A1373 -M1009 A1048 -M1010 A550 -M1011 A1235 -M1012 A337 -M1013 A419 -M1014 A250 -M1015 A1024 -M1017 A1039 -M1018 A1043 -M1019 A1287 -M1020 A778 -M1021 A70 -M1022 A1043 -M1025 A66 -M1026 A908 -M1027 A1032 -M1028 A591 -M1029 A1141 -M1030 A9 -M1031 A1310 -M1032 A903 -M1033 A520 -M1034 A816 -M1036 A619 -M1037 A831 -M1038 A542 -M1039 A566 -M1040 A375 -M1041 A1054 -M1042 A1179 -M1043 A885 -M1045 A1310 -M1046 A713 -M1048 A1235 -M1049 A1054 -M1050 A691 -M1051 A903 -M1052 A826 -M1053 A419 -M1054 A961 -M1055 A1131 -M1058 A296 -M1059 A57 -M1060 A363 -M1063 A246 -M1065 A246 -M1066 A197 -M1067 A443 -M1068 A539 -M1069 A1179 -M1070 A1215 -M1072 A1139 -M1073 A697 -M1074 A419 -M1075 A586 -M1076 A1076 -M1077 A490 -M1078 A243 -M1079 A1179 -M1080 A670 -M1081 A9 -M1082 A566 -M1083 A482 -M1084 A1054 -M1085 A1179 -M1086 A996 -M1087 A987 -M1088 A14 -M1089 A963 -M1090 A349 -M1091 A320 -M1092 A916 -M1093 A578 -M1094 A51 -M1095 A1235 -M1096 A742 -M1097 A363 -M1098 A223 -M1100 A490 -M1102 A236 -M1103 A1141 -M1104 A473 -M1105 A1272 -M1106 A714 -M1107 A208 -M1108 A1384 -M1109 A306 -M1110 A1353 -M1111 A903 -M1112 A561 -M1113 A81 -M1114 A219 -M1115 A245 -M1116 A1373 -M1118 A864 -M1120 A86 -M1122 A95 -M1123 A1046 -M1124 A351 -M1125 A808 -M1126 A817 -M1127 A318 -M1128 A338 -M1129 A954 -M1130 A903 -M1131 A588 -M1134 A194 -M1137 A740 -M1138 A566 -M1139 A908 -M1140 A577 -M1141 A363 -M1142 A338 -M1144 A340 -M1145 A1038 -M1146 A1073 -M1147 A335 -M1148 A1345 -M1149 A9 -M1151 A1050 -M1153 A816 -M1154 A349 -M1155 A246 -M1156 A894 -M1157 A831 -M1158 A920 -M1159 A313 -M1161 A1382 -M1162 A9 -M1163 A340 -M1164 A1065 -M1166 A501 -M1167 A70 -M1168 A577 -M1170 A903 -M1171 A19 -M1172 A948 -M1173 A910 -M1176 A679 -M1177 A1146 -M1179 A389 -M1181 A245 -M1183 A1300 -M1184 A209 -M1185 A287 -M1186 A1117 -M1187 A993 -M1188 A1365 -M1189 A974 -M1190 A1376 -M1191 A363 -M1192 A1235 -M1195 A224 -M1196 A925 -M1201 A1365 -M1203 A1127 -M1204 A714 -M1205 A566 -M1206 A831 -M1207 A1048 -M1208 A1024 -M1209 A577 -M1210 A722 -M1211 A1151 -M1212 A1023 -M1213 A861 -M1214 A546 -M1215 A698 -M1216 A1097 -M1217 A1275 -M1218 A1018 -M1219 A698 -M1220 A336 -M1221 A111 -M1222 A223 -M1224 A224 -M1225 A559 -M1227 A768 -M1228 A762 -M1230 A580 -M1231 A550 -M1232 A419 -M1233 A826 -M1234 A1235 -M1237 A271 -M1238 A695 -M1239 A450 -M1240 A742 -M1242 A607 -M1243 A645 -M1246 A351 -M1247 A1040 -M1248 A808 -M1250 A303 -M1251 A876 -M1253 A1329 -M1255 A390 -M1256 A1106 -M1257 A903 -M1258 A471 -M1263 A1235 -M1264 A143 -M1266 A768 -M1267 A419 -M1268 A697 -M1269 A224 -M1271 A997 -M1272 A66 -M1273 A861 -M1274 A754 -M1275 A1274 -M1276 A119 -M1277 A257 -M1278 A1039 -M1280 A767 -M1281 A577 -M1282 A1381 -M1283 A1232 -M1284 A70 -M1285 A577 -M1286 A46 -M1287 A556 -M1288 A197 -M1290 A762 -M1291 A903 -M1292 A363 -M1293 A1043 -M1295 A1048 -M1296 A133 -M1298 A92 -M1299 A217 -M1301 A259 -M1303 A681 -M1304 A490 -M1305 A1073 -M1306 A652 -M1307 A1007 -M1308 A704 -M1310 A844 -M1311 A631 -M1312 A754 -M1313 A521 -M1314 A1035 -M1317 A947 -M1318 A196 -M1319 A104 -M1320 A133 -M1321 A392 -M1322 A117 -M1325 A1035 -M1326 A593 -M1328 A471 -M1332 A1024 -M1333 A968 -M1334 A709 -M1336 A1395 -M1337 A577 -M1338 A850 -M1339 A1 -M1340 A908 -M1341 A65 -M1342 A1345 -M1344 A78 -M1345 A39 -M1348 A1179 -M1349 A14 -M1353 A817 -M1354 A742 -M1355 A698 -M1356 A55 -M1357 A648 -M1358 A340 -M1359 A444 -M1360 A1373 -M1362 A107 -M1363 A1048 -M1365 A617 -M1366 A546 -M1368 A363 -M1369 A317 -M1370 A589 -M1371 A698 -M1373 A99 -M1374 A1025 -M1375 A245 -M1377 A9 -M1378 A885 -M1379 A1179 -M1380 A956 -M1383 A750 -M1386 A9 -M1387 A242 -M1388 A1373 -M1389 A562 -M1390 A741 -M1391 A275 -M1392 A808 -M1393 A312 -M1394 A327 -M1395 A678 -M1396 A1007 -M1397 A123 -M1399 A628 -M1400 A671 -M1401 A1232 -M1402 A252 -M1405 A741 -M1406 A1235 -M1407 A351 -M1408 A714 -M1409 A425 -M1410 A1393 -M1411 A577 -M1412 A1235 -M1414 A1007 -M1415 A51 -M1416 A1235 -M1417 A705 -M1418 A328 -M1419 A654 -M1420 A742 -M1421 A847 -M1422 A219 -M1423 A880 -M1424 A1035 -M1425 A400 -M1426 A1157 -M1427 A1018 -M1428 A224 -M1429 A1179 -M1431 A591 -M1433 A591 -M1434 A1367 -M1436 A742 -M1437 A1141 -M1438 A1207 -M1439 A698 -M1440 A1157 -M1441 A379 -M1443 A1124 -M1445 A1111 -M1449 A742 -M1450 A38 -M1451 A815 -M1452 A1039 -M1453 A219 -M1454 A448 -M1456 A709 -M1457 A308 -M1458 A691 -M1460 A1010 -M1461 A1312 -M1462 A1235 -M1463 A577 -M1464 A102 -M1467 A243 -M1471 A1040 -M1472 A630 -M1474 A1149 -M1475 A338 -M1476 A87 -M1477 A318 -M1478 A816 -M1479 A762 -M1480 A691 -M1483 A714 -M1484 A618 -M1485 A180 -M1486 A1235 -M1487 A201 -M1488 A109 -M1489 A107 -M1490 A178 -M1492 A211 -M1493 A389 -M1495 A760 -M1496 A338 -M1497 A1056 -M1498 A716 -M1500 A709 -M1501 A352 -M1502 A1213 -M1503 A139 -M1505 A1104 -M1508 A1341 -M1510 A14 -M1512 A1111 -M1513 A202 -M1514 A1054 -M1516 A903 -M1519 A742 -M1520 A281 -M1521 A908 -M1522 A858 -M1523 A1014 -M1524 A1050 -M1525 A636 -M1526 A1022 -M1530 A724 -M1533 A582 -M1534 A816 -M1535 A133 -M1538 A156 -M1539 A652 -M1540 A418 -M1541 A935 -M1542 A622 -M1543 A1048 -M1545 A995 -M1546 A349 -M1548 A577 -M1549 A1024 -M1551 A729 -M1552 A641 -M1553 A59 -M1554 A441 -M1555 A432 -M1556 A962 -M1558 A250 -M1559 A816 -M1560 A219 -M1561 A1008 -M1562 A903 -M1564 A326 -M1565 A1163 -M1567 A367 -M1568 A1048 -M1569 A1263 -M1571 A566 -M1573 A857 -M1574 A70 -M1575 A714 -M1576 A1179 -M1577 A1055 -M1578 A1048 -M1579 A808 -M1580 A64 -M1581 A546 -M1582 A1381 -M1584 A352 -M1585 A118 -M1586 A1345 -M1587 A1245 -M1588 A224 -M1589 A1127 -M1591 A566 -M1592 A383 -M1593 A880 -M1594 A196 -M1595 A571 -M1596 A661 -M1597 A6 -M1598 A243 -M1599 A327 -M1600 A9 -M1601 A1348 -M1603 A1308 -M1604 A977 -M1605 A577 -M1606 A383 -M1607 A1310 -M1610 A931 -M1611 A808 -M1612 A698 -M1613 A237 -M1615 A338 -M1616 A643 -M1617 A390 -M1618 A714 -M1619 A1157 -M1621 A863 -M1624 A243 -M1626 A645 -M1627 A249 -M1630 A964 -M1633 A367 -M1636 A908 -M1637 A993 -M1638 A856 -M1639 A929 -M1640 A1010 -M1642 A742 -M1645 A641 -M1646 A103 -M1647 A566 -M1648 A1163 -M1649 A277 -M1650 A18 -M1651 A29 -M1652 A1165 -M1654 A1319 -M1655 A577 -M1657 A1048 -M1660 A1390 -M1661 A224 -M1662 A1018 -M1665 A36 -M1666 A1007 -M1668 A349 -M1672 A1377 -M1673 A564 -M1674 A714 -M1675 A1179 -M1676 A560 -M1677 A722 -M1680 A1106 -M1681 A1007 -M1682 A1122 -M1683 A1141 -M1685 A46 -M1688 A641 -M1689 A197 -M1690 A317 -M1691 A245 -M1692 A1379 -M1694 A1376 -M1696 A112 -M1699 A826 -M1701 A1040 -M1703 A708 -M1705 A918 -M1707 A9 -M1708 A359 -M1711 A411 -M1712 A89 -M1713 A1179 -M1714 A577 -M1715 A28 -M1716 A197 -M1718 A349 -M1719 A376 -M1722 A178 -M1725 A816 -M1726 A908 -M1728 A858 -M1734 A589 -M1735 A843 -M1738 A1213 -M1739 A519 -M1741 A111 -M1742 A418 -M1743 A1179 -M1744 A588 -M1747 A591 -M1749 A566 -M1751 A9 -M1752 A714 -M1753 A742 -M1754 A996 -M1755 A1175 -M1756 A383 -M1757 A894 -M1759 A147 -M1760 A550 -M1762 A1048 -M1763 A740 -M1764 A577 -M1765 A530 -M1768 A1141 -M1770 A410 -M1771 A154 -M1772 A1171 -M1773 A985 -M1774 A908 -M1775 A473 -M1777 A566 -M1778 A419 -M1779 A1290 -M1780 A935 -M1783 A1051 -M1785 A399 -M1786 A452 -M1787 A816 -M1789 A321 -M1792 A1018 -M1794 A1024 -M1797 A1145 -M1798 A648 -M1801 A698 -M1803 A425 -M1804 A44 -M1805 A974 -M1806 A9 -M1807 A62 -M1808 A422 -M1811 A284 -M1812 A245 -M1813 A546 -M1814 A929 -M1815 A173 -M1816 A754 -M1820 A550 -M1821 A123 -M1822 A692 -M1824 A741 -M1825 A246 -M1826 A301 -M1827 A577 -M1828 A1272 -M1829 A577 -M1830 A1352 -M1832 A893 -M1833 A1089 -M1834 A590 -M1835 A1111 -M1837 A758 -M1838 A910 -M1839 A661 -M1840 A935 -M1841 A246 -M1844 A72 -M1845 A408 -M1846 A1110 -M1847 A546 -M1848 A36 -M1849 A974 -M1850 A66 -M1851 A880 -M1852 A1039 -M1853 A789 -M1854 A577 -M1857 A602 -M1859 A1317 -M1861 A881 -M1862 A641 -M1864 A1117 -M1865 A716 -M1867 A591 -M1868 A1050 -M1869 A977 -M1870 A519 -M1871 A419 -M1872 A311 -M1873 A14 -M1874 A419 -M1875 A562 -M1876 A856 -M1877 A414 -M1879 A266 -M1881 A1326 -M1882 A1066 -M1884 A577 -M1885 A375 -M1886 A934 -M1888 A756 -M1889 A584 -M1890 A748 -M1891 A1039 -M1892 A66 -M1893 A19 -M1895 A874 -M1896 A747 -M1898 A742 -M1899 A857 -M1900 A419 -M1901 A577 -M1903 A577 -M1904 A789 -M1905 A51 -M1906 A197 -M1907 A772 -M1908 A1046 -M1909 A698 -M1910 A240 -M1914 A149 -M1915 A1066 -M1917 A562 -M1918 A400 -M1919 A1350 -M1920 A340 -M1921 A51 -M1924 A19 -M1925 A714 -M1926 A349 -M1928 A267 -M1929 A1157 -M1933 A97 -M1935 A273 -M1937 A9 -M1939 A1048 -M1940 A367 -M1941 A856 -M1943 A634 -M1944 A1054 -M1945 A1179 -M1948 A349 -M1949 A1035 -M1952 A982 -M1958 A49 -M1959 A90 -M1961 A467 -M1962 A965 -M1965 A683 -M1966 A713 -M1967 A1155 -M1969 A376 -M1970 A645 -M1971 A56 -M1973 A964 -M1974 A389 -M1976 A688 -M1978 A713 -M1979 A996 -M1980 A777 -M1981 A338 -M1982 A687 -M1984 A93 -M1985 A691 -M1986 A329 -M1987 A237 -M1989 A250 -M1992 A841 -M1993 A808 -M1994 A724 -M1995 A1043 -M1998 A301 -M1999 A156 -M2000 A51 -M2003 A405 -M2005 A903 -M2007 A360 -M2008 A1186 -M2011 A539 -M2015 A209 -M2016 A1127 -M2017 A885 -M2018 A425 -M2019 A363 -M2020 A947 -M2021 A468 -M2022 A1039 -M2023 A382 -M2024 A245 -M2025 A513 -M2026 A29 -M2027 A340 -M2028 A628 -M2031 A9 -M2033 A789 -M2034 A133 -M2035 A695 -M2036 A863 -M2038 A284 -M2039 A1116 -M2040 A722 -M2041 A482 -M2042 A1235 -M2043 A1024 -M2046 A36 -M2047 A826 -M2048 A562 -M2049 A1043 -M2050 A982 -M2051 A566 -M2052 A1009 -M2053 A367 -M2054 A789 -M2055 A383 -M2056 A1373 -M2057 A1054 -M2058 A974 -M2059 A1054 -M2060 A1024 -M2062 A1039 -M2063 A918 -M2065 A349 -M2069 A767 -M2070 A464 -M2071 A910 -M2072 A924 -M2076 A973 -M2081 A1199 -M2082 A946 -M2083 A1052 -M2084 A546 -M2085 A36 -M2086 A977 -M2087 A222 -M2088 A1076 -M2090 A1112 -M2091 A513 -M2093 A1038 -M2094 A373 -M2095 A351 -M2096 A808 -M2099 A1073 -M2101 A350 -M2102 A743 -M2103 A46 -M2104 A29 -M2105 A974 -M2107 A974 -M2108 A861 -M2109 A816 -M2110 A202 -M2111 A1043 -M2113 A66 -M2115 A691 -M2118 A109 -M2121 A1010 -M2122 A51 -M2123 A870 -M2124 A577 -M2126 A826 -M2127 A1111 -M2128 A444 -M2129 A340 -M2132 A977 -M2133 A677 -M2134 A418 -M2136 A1127 -M2137 A287 -M2138 A43 -M2139 A1318 -M2140 A816 -M2141 A318 -M2144 A1339 -M2146 A641 -M2149 A287 -M2151 A117 -M2152 A566 -M2153 A876 -M2154 A651 -M2156 A655 -M2157 A1019 -M2158 A808 -M2160 A867 -M2161 A870 -M2162 A1089 -M2163 A428 -M2164 A1022 -M2165 A571 -M2166 A104 -M2167 A17 -M2168 A775 -M2170 A785 -M2171 A1172 -M2172 A1154 -M2173 A772 -M2174 A229 -M2175 A1109 -M2176 A636 -M2177 A742 -M2179 A1168 -M2180 A870 -M2181 A1157 -M2184 A1047 -M2189 A842 -M2190 A1068 -M2192 A151 -M2193 A300 -M2194 A191 -M2195 A1068 -M2196 A414 -M2198 A1127 -M2199 A591 -M2203 A324 -M2204 A178 -M2205 A531 -M2208 A1090 -M2209 A61 -M2212 A910 -M2214 A167 -M2217 A782 -M2218 A1111 -M2219 A630 -M2220 A1241 -M2221 A778 -M2222 A816 -M2223 A156 -M2224 A1089 -M2225 A1127 -M2226 A710 -M2230 A833 -M2231 A593 -M2232 A996 -M2234 A322 -M2236 A842 -M2237 A523 -M2239 A250 -M2242 A1336 -M2243 A556 -M2244 A196 -M2245 A80 -M2246 A690 -M2247 A1131 -M2248 A284 -M2249 A982 -M2250 A885 -M2251 A260 -M2253 A855 -M2255 A1040 -M2260 A1043 -M2262 A885 -M2263 A730 -M2267 A246 -M2268 A1319 -M2269 A453 -M2270 A1048 -M2273 A423 -M2274 A816 -M2275 A1213 -M2277 A691 -M2278 A903 -M2279 A948 -M2280 A802 -M2282 A1018 -M2284 A129 -M2285 A506 -M2286 A156 -M2287 A881 -M2289 A123 -M2290 A577 -M2291 A987 -M2292 A418 -M2293 A749 -M2294 A577 -M2296 A1178 -M2297 A432 -M2298 A818 -M2305 A741 -M2306 A1346 -M2308 A1213 -M2310 A539 -M2311 A1040 -M2312 A908 -M2314 A592 -M2315 A769 -M2316 A1047 -M2317 A1304 -M2319 A826 -M2321 A743 -M2323 A677 -M2324 A1237 -M2326 A947 -M2329 A826 -M2330 A94 -M2331 A242 -M2333 A178 -M2334 A1006 -M2337 A165 -M2343 A318 -M2344 A2 -M2346 A640 -M2352 A1141 -M2354 A519 -M2355 A699 -M2356 A31 -M2357 A411 -M2358 A197 -M2359 A12 -M2360 A35 -M2361 A1149 -M2363 A1365 -M2364 A153 -M2367 A827 -M2368 A366 -M2372 A94 -M2375 A419 -M2377 A426 -M2378 A482 -M2380 A695 -M2381 A1110 -M2383 A1345 -M2386 A903 -M2387 A310 -M2389 A742 -M2391 A529 -M2392 A956 -M2393 A224 -M2395 A718 -M2396 A425 -M2397 A1111 -M2398 A423 -M2399 A903 -M2400 A703 -M2401 A692 -M2402 A1007 -M2403 A29 -M2404 A13 -M2405 A743 -M2407 A1021 -M2408 A346 -M2409 A531 -M2411 A795 -M2413 A903 -M2414 A562 -M2415 A1259 -M2418 A1179 -M2420 A1089 -M2421 A546 -M2424 A690 -M2425 A577 -M2428 A548 -M2429 A910 -M2430 A881 -M2431 A295 -M2432 A1122 -M2433 A885 -M2434 A991 -M2435 A156 -M2436 A1254 -M2437 A1345 -M2439 A1073 -M2442 A1153 -M2443 A1354 -M2446 A727 -M2449 A742 -M2450 A698 -M2452 A713 -M2454 A685 -M2455 A993 -M2456 A762 -M2457 A881 -M2463 A593 -M2465 A1079 -M2469 A700 -M2470 A303 -M2473 A1059 -M2474 A577 -M2475 A562 -M2476 A527 -M2481 A1075 -M2482 A624 -M2485 A1176 -M2486 A66 -M2488 A628 -M2489 A227 -M2490 A561 -M2492 A1089 -M2493 A19 -M2495 A1317 -M2496 A1117 -M2497 A86 -M2498 A1012 -M2499 A340 -M2501 A196 -M2502 A12 -M2503 A158 -M2508 A603 -M2509 A571 -M2510 A1374 -M2513 A961 -M2516 A13 -M2517 A1310 -M2520 A1024 -M2521 A20 -M2523 A754 -M2527 A937 -M2531 A876 -M2532 A1040 -M2533 A754 -M2534 A1327 -M2535 A996 -M2536 A243 -M2538 A1008 -M2539 A591 -M2542 A1352 -M2543 A1092 -M2544 A1024 -M2546 A70 -M2547 A245 -M2548 A379 -M2553 A533 -M2554 A648 -M2556 A415 -M2560 A974 -M2562 A1157 -M2563 A1245 -M2565 A698 -M2567 A79 -M2568 A903 -M2570 A847 -M2571 A1367 -M2572 A1179 -M2577 A881 -M2578 A987 -M2579 A775 -M2582 A317 -M2583 A929 -M2584 A861 -M2589 A1206 -M2590 A1046 -M2592 A1091 -M2599 A1239 -M2600 A1052 -M2601 A876 -M2602 A328 -M2603 A1048 -M2604 A1050 -M2606 A1235 -M2607 A51 -M2608 A772 -M2611 A1340 -M2613 A9 -M2614 A856 -M2615 A1256 -M2616 A1155 -M2617 A1018 -M2619 A1089 -M2620 A1123 -M2622 A900 -M2623 A1339 -M2624 A636 -M2625 A826 -M2626 A1073 -M2627 A399 -M2628 A1227 -M2629 A577 -M2630 A577 -M2632 A36 -M2634 A1355 -M2636 A577 -M2638 A641 -M2639 A562 -M2640 A1024 -M2641 A214 -M2642 A58 -M2644 A1182 -M2645 A1186 -M2646 A109 -M2647 A807 -M2648 A800 -M2650 A419 -M2651 A964 -M2652 A1179 -M2653 A383 -M2655 A281 -M2658 A1312 -M2659 A400 -M2660 A677 -M2664 A974 -M2666 A808 -M2667 A961 -M2668 A477 -M2669 A549 -M2672 A1129 -M2675 A833 -M2677 A383 -M2678 A311 -M2679 A254 -M2680 A317 -M2681 A240 -M2682 A178 -M2683 A831 -M2687 A775 -M2689 A243 -M2691 A1373 -M2692 A222 -M2694 A1353 -M2695 A881 -M2698 A1339 -M2700 A577 -M2703 A831 -M2704 A411 -M2705 A927 -M2706 A133 -M2707 A910 -M2709 A51 -M2710 A117 -M2714 A562 -M2716 A351 -M2717 A186 -M2719 A1307 -M2721 A1040 -M2723 A1043 -M2725 A808 -M2726 A359 -M2728 A882 -M2731 A1043 -M2733 A506 -M2736 A1345 -M2738 A655 -M2741 A539 -M2742 A161 -M2746 A396 -M2755 A1048 -M2757 A219 -M2760 A977 -M2761 A851 -M2763 A1222 -M2764 A246 -M2768 A1050 -M2771 A93 -M2772 A363 -M2773 A368 -M2776 A857 -M2777 A1127 -M2778 A841 -M2779 A492 -M2780 A29 -M2781 A714 -M2784 A1303 -M2785 A920 -M2787 A1155 -M2788 A1319 -M2789 A99 -M2790 A422 -M2793 A778 -M2794 A577 -M2795 A400 -M2796 A1345 -M2798 A1227 -M2800 A412 -M2803 A156 -M2804 A844 -M2805 A250 -M2806 A502 -M2808 A499 -M2809 A51 -M2811 A1202 -M2813 A120 -M2815 A1081 -M2816 A351 -M2818 A399 -M2819 A641 -M2820 A773 -M2821 A1004 -M2822 A546 -M2823 A482 -M2825 A156 -M2826 A1281 -M2827 A118 -M2829 A882 -M2831 A974 -M2832 A591 -M2833 A1193 -M2835 A1039 -M2836 A70 -M2837 A577 -M2838 A386 -M2840 A645 -M2841 A645 -M2842 A1190 -M2844 A1175 -M2845 A338 -M2848 A653 -M2850 A949 -M2851 A1146 -M2852 A889 -M2856 A533 -M2857 A519 -M2859 A1116 -M2860 A648 -M2862 A762 -M2864 A698 -M2865 A1272 -M2867 A256 -M2868 A889 -M2869 A1117 -M2876 A1345 -M2877 A692 -M2878 A531 -M2880 A419 -M2882 A1039 -M2883 A418 -M2886 A519 -M2887 A1141 -M2888 A318 -M2891 A1265 -M2895 A270 -M2896 A1179 -M2898 A178 -M2900 A1235 -M2901 A281 -M2902 A1381 -M2905 A383 -M2907 A257 -M2908 A1111 -M2910 A803 -M2912 A1235 -M2915 A958 -M2916 A44 -M2917 A870 -M2918 A1245 -M2920 A688 -M2921 A368 -M2922 A386 -M2923 A425 -M2926 A566 -M2928 A349 -M2929 A245 -M2930 A577 -M2931 A1252 -M2932 A928 -M2933 A390 -M2934 A1184 -M2937 A1357 -M2938 A591 -M2939 A453 -M2942 A80 -M2944 A1125 -M2945 A1382 -M2948 A351 -M2949 A861 -M2951 A59 -M2953 A208 -M2954 A857 -M2955 A1139 -M2957 A162 -M2959 A1033 -M2961 A773 -M2962 A242 -M2963 A816 -M2965 A1110 -M2966 A1064 -M2967 A243 -M2968 A661 -M2969 A974 -M2970 A957 -M2971 A546 -M2974 A850 -M2979 A775 -M2980 A1371 -M2981 A717 -M2983 A1187 -M2984 A1265 -M2985 A117 -M2986 A5 -M2989 A935 -M2994 A305 -M2995 A954 -M2997 A398 -M2998 A1263 -M3000 A899 -M3001 A93 -M3002 A48 -M3003 A513 -M3004 A707 -M3007 A515 -M3008 A485 -M3010 A274 -M3013 A868 -M3016 A849 -M3017 A816 -M3019 A1321 -M3023 A1170 -M3024 A566 -M3026 A685 -M3027 A438 -M3028 A334 -M3029 A826 -M3030 A867 -M3031 A1222 -M3035 A394 -M3036 A94 -M3037 A712 -M3038 A765 -M3039 A414 -M3040 A86 -M3041 A265 -M3042 A625 -M3045 A363 -M3046 A1069 -M3048 A945 -M3050 A29 -M3053 A550 -M3054 A1117 -M3055 A419 -M3058 A742 -M3060 A794 -M3061 A971 -M3062 A661 -M3063 A411 -M3064 A1146 -M3066 A56 -M3067 A156 -M3069 A1207 -M3070 A726 -M3071 A820 -M3075 A525 -M3076 A677 -M3078 A756 -M3080 A37 -M3082 A1129 -M3086 A813 -M3089 A591 -M3091 A86 -M3092 A1048 -M3093 A762 -M3094 A965 -M3095 A1024 -M3096 A648 -M3097 A86 -M3098 A656 -M3099 A199 -M3100 A1050 -M3102 A755 -M3103 A414 -M3104 A982 -M3105 A1256 -M3106 A1127 -M3107 A581 -M3108 A1111 -M3111 A739 -M3112 A771 -M3113 A103 -M3114 A920 -M3116 A79 -M3117 A816 -M3119 A273 -M3120 A351 -M3122 A1315 -M3123 A543 -M3124 A445 -M3125 A421 -M3127 A1 -M3128 A1050 -M3130 A107 -M3132 A1318 -M3133 A1056 -M3135 A714 -M3138 A228 -M3139 A1048 -M3140 A980 -M3143 A1086 -M3144 A1179 -M3148 A546 -M3150 A550 -M3155 A214 -M3156 A482 -M3158 A785 -M3160 A1157 -M3161 A571 -M3163 A478 -M3164 A1393 -M3165 A590 -M3166 A717 -M3168 A1293 -M3170 A742 -M3173 A523 -M3175 A1092 -M3179 A1155 -M3182 A475 -M3184 A1376 -M3185 A988 -M3186 A826 -M3188 A1310 -M3192 A101 -M3193 A961 -M3196 A42 -M3200 A90 -M3201 A1043 -M3202 A1384 -M3203 A942 -M3205 A687 -M3206 A1035 -M3209 A857 -M3210 A550 -M3212 A831 -M3213 A803 -M3214 A1039 -M3215 A1123 -M3216 A993 -M3219 A723 -M3220 A1294 -M3227 A1330 -M3228 A778 -M3231 A1180 -M3233 A282 -M3240 A1303 -M3253 A1260 -M3255 A1057 -M3256 A199 -M3258 A885 -M3260 A920 -M3262 A1083 -M3264 A1294 -M3267 A697 -M3271 A1040 -M3272 A880 -M3274 A329 -M3276 A525 -M3277 A107 -M3278 A1090 -M3281 A1055 -M3282 A490 -M3284 A865 -M3285 A1317 -M3287 A649 -M3288 A342 -M3290 A1 -M3291 A340 -M3294 A1274 -M3296 A1364 -M3297 A831 -M3300 A477 -M3302 A14 -M3304 A661 -M3306 A191 -M3307 A208 -M3308 A826 -M3314 A1202 -M3317 A577 -M3320 A359 -M3331 A513 -M3332 A340 -M3337 A1131 -M3338 A524 -M3343 A1281 -M3344 A525 -M3345 A513 -M3347 A404 -M3351 A209 -M3353 A741 -M3355 A245 -M3358 A415 -M3360 A224 -M3362 A1238 -M3366 A199 -M3368 A338 -M3370 A259 -M3374 A1127 -M3377 A1321 -M3378 A1114 -M3380 A149 -M3382 A351 -M3384 A641 -M3386 A844 -M3387 A100 -M3389 A562 -M3390 A445 -M3391 A396 -M3393 A296 -M3394 A1091 -M3396 A808 -M3399 A1213 -M3400 A257 -M3401 A1046 -M3402 A937 -M3404 A506 -M3405 A51 -M3406 A523 -M3409 A555 -M3414 A1162 -M3417 A220 -M3421 A705 -M3424 A1024 -M3428 A137 -M3430 A1352 -M3434 A9 -M3435 A464 -M3438 A698 -M3439 A1068 -M3440 A28 -M3441 A40 -M3442 A1156 -M3443 A1145 -M3447 A698 -M3448 A340 -M3450 A614 -M3452 A961 -M3453 A305 -M3457 A689 -M3459 A1127 -M3461 A698 -M3463 A698 -M3465 A1055 -M3466 A197 -M3467 A369 -M3468 A338 -M3469 A1110 -M3470 A349 -M3472 A76 -M3473 A21 -M3475 A631 -M3476 A219 -M3477 A1040 -M3478 A831 -M3479 A855 -M3480 A1141 -M3483 A962 -M3484 A739 -M3485 A715 -M3488 A884 -M3489 A737 -M3491 A1351 -M3492 A1272 -M3493 A594 -M3494 A737 -M3496 A1036 -M3498 A64 -M3499 A677 -M3503 A355 -M3505 A1021 -M3508 A243 -M3510 A525 -M3511 A657 -M3512 A595 -M3514 A1381 -M3515 A617 -M3516 A1147 -M3519 A1050 -M3520 A1043 -M3527 A202 -M3530 A590 -M3531 A1118 -M3535 A844 -M3537 A1032 -M3540 A977 -M3542 A1141 -M3543 A334 -M3553 A438 -M3554 A400 -M3559 A417 -M3560 A914 -M3561 A1379 -M3562 A505 -M3566 A539 -M3567 A713 -M3569 A329 -M3570 A964 -M3574 A726 -M3575 A66 -M3577 A1115 -M3578 A612 -M3580 A1092 -M3582 A742 -M3586 A709 -M3587 A1213 -M3589 A1048 -M3591 A468 -M3592 A1235 -M3594 A1117 -M3595 A296 -M3596 A97 -M3597 A1371 -M3598 A1083 -M3599 A544 -M3602 A971 -M3603 A246 -M3605 A142 -M3607 A1047 -M3609 A550 -M3611 A1081 -M3618 A762 -M3619 A1213 -M3621 A274 -M3627 A617 -M3629 A327 -M3630 A952 -M3631 A217 -M3633 A614 -M3637 A1376 -M3638 A887 -M3640 A604 -M3641 A714 -M3647 A687 -M3648 A1290 -M3649 A814 -M3654 A383 -M3662 A716 -M3663 A1178 -M3664 A203 -M3668 A1256 -M3669 A406 -M3671 A621 -M3673 A977 -M3674 A974 -M3675 A156 -M3679 A1198 -M3680 A461 -M3681 A414 -M3688 A1350 -M3689 A506 -M3696 A724 -M3697 A1012 -M3699 A867 -M3704 A785 -M3709 A742 -M3711 A573 -M3713 A808 -M3714 A550 -M3716 A432 -M3718 A1092 -M3719 A1044 -M3726 A588 -M3727 A1129 -M3729 A1146 -M3730 A1086 -M3731 A199 -M3732 A228 -M3733 A885 -M3737 A13 -M3743 A550 -M3744 A1083 -M3746 A319 -M3753 A483 -M3760 A439 -M3762 A566 -M3765 A987 -M3767 A1393 -M3768 A1235 -M3769 A17 -M3771 A993 -M3773 A996 -M3775 A156 -M3776 A617 -M3778 A933 -M3779 A826 -M3781 A317 -M3782 A513 -M3783 A876 -M3784 A1078 -M3788 A250 -M3795 A1092 -M3803 A1053 -M3804 A1075 -M3805 A1245 -M3811 A1185 -M3812 A903 -M3817 A742 -M3821 A935 -M3823 A1068 -M3824 A208 -M3825 A659 -M3830 A622 -M3831 A383 -M3841 A319 -M3842 A598 -M3843 A795 -M3844 A117 -M3845 A1249 -M3846 A831 -M3848 A517 -M3849 A44 -M3852 A817 -M3853 A385 -M3854 A641 -M3857 A304 -M3859 A644 -M3869 A1088 -M3873 A783 -M3874 A947 -M3876 A38 -M3879 A1054 -M3880 A334 -M3882 A254 -M3883 A172 -M3884 A1213 -M3886 A627 -M3888 A974 -M3889 A881 -M3891 A826 -M3892 A389 -M3894 A903 -M3896 A612 -M3897 A65 -M3898 A127 -M3907 A974 -M3908 A1046 -M3910 A648 -M3911 A706 -M3912 A787 -M3913 A591 -M3915 A965 -M3916 A611 -M3918 A991 -M3919 A959 -M3920 A847 -M3921 A1382 -M3922 A1183 -M3924 A471 -M3925 A1339 -M3927 A150 -M3928 A83 -M3936 A375 -M3938 A903 -M3940 A250 -M3942 A895 -M3944 A620 -M3945 A1162 -M3947 A964 -M3952 A1127 -M3956 A485 -M3961 A1065 -M3967 A9 -M3968 A439 -M3969 A935 -M3972 A622 -M3980 A28 -M3981 A419 -M3984 A1111 -M3987 A1022 -M3988 A445 -M3991 A615 -M3994 A1336 -M3999 A691 -M4001 A700 -M4003 A365 -M4009 A886 -M4011 A1355 -M4019 A348 -M4023 A265 -M4025 A1235 -M4029 A657 -M4032 A910 -M4034 A707 -M4035 A553 -M4036 A1286 -M4041 A875 -M4044 A567 -M4046 A62 -M4050 A375 -M4051 A1007 -M4053 A604 -M4054 A649 -M4055 A954 -M4057 A64 -M4058 A356 -M4060 A951 -M4063 A760 -M4066 A952 -M4067 A1291 -M4068 A462 -M4072 A1064 -M4074 A312 -M4077 A261 -M4078 A1004 -M4085 A391 -M4086 A422 -M4091 A355 -M4092 A284 -M4096 A176 -M4097 A550 -M4098 A820 -M4099 A70 -M4100 A166 -M4101 A858 -M4102 A831 -M4103 A944 -M4104 A742 -M4105 A644 -M4110 A960 -M4112 A166 -M4118 A367 -M4120 A972 -M4124 A66 -M4128 A742 -M4132 A517 -M4135 A875 -M4137 A342 -M4141 A783 -M4145 A512 -M4151 A686 -M4158 A265 -M4159 A1158 -M4161 A101 -M4162 A830 -M4165 A875 -M4167 A24 -M4168 A265 -M4171 A922 -M4173 A742 -M4180 A601 -M4182 A1186 -M4183 A224 -M4188 A1127 -M4189 A553 -M4195 A90 -M4198 A1129 -M4202 A571 -M4208 A718 -M4212 A1007 -M4216 A1115 -M4220 A1 -M4222 A107 -M4223 A695 -M4226 A870 -M4230 A37 -M4231 A741 -M4239 A83 -M4247 A439 -M4250 A881 -M4252 A881 -M4254 A138 -M4256 A573 -M4259 A120 -M4265 A490 -M4266 A694 -M4268 A1110 -M4269 A655 -M4274 A351 -M4277 A698 -M4278 A1047 -M4279 A246 -M4282 A685 -M4286 A1194 -M4290 A993 -M4293 A1298 -M4295 A775 -M4302 A506 -M4303 A286 -M4308 A589 -M4313 A683 -M4315 A539 -M4316 A1008 -M4324 A881 -M4330 A641 -M4331 A342 -M4338 A649 -M4344 A139 -M4345 A801 -M4346 A1117 -M4350 A1018 -M4352 A742 -M4357 A795 -M4358 A119 -M4359 A1357 -M4362 A1286 -M4366 A855 -M4369 A977 -M4375 A699 -M4379 A422 -M4380 A1286 -M4381 A1111 -M4384 A919 -M4388 A787 -M4389 A200 -M4396 A566 -M4401 A147 -M4404 A1182 -M4405 A861 -M4408 A515 -M4411 A993 -M4412 A661 -M4413 A724 -M4419 A770 -M4421 A705 -M4423 A437 -M4432 A602 -M4437 A737 -M4446 A1050 -M4458 A816 -M4461 A332 -M4462 A1345 -M4466 A245 -M4472 A1143 -M4474 A1139 -M4481 A1286 -M4483 A255 -M4484 A1359 -M4485 A1214 -M4486 A1366 -M4489 A1127 -M4491 A1131 -M4493 A245 -M4494 A987 -M4496 A855 -M4498 A977 -M4511 A1298 -M4516 A919 -M4530 A363 -M4532 A1089 -M4533 A594 -M4535 A577 -M4541 A848 -M4543 A383 -M4551 A955 -M4556 A831 -M4557 A698 -M4563 A1040 -M4564 A672 -M4565 A1111 -M4568 A789 -M4569 A1072 -M4573 A265 -M4574 A746 -M4575 A588 -M4577 A1008 -M4584 A1265 -M4589 A46 -M4594 A514 -M4596 A871 -M4599 A1310 -M4606 A1333 -M4614 A581 -M4623 A61 -M4631 A861 -M4636 A464 -M4638 A119 -M4643 A659 -M4649 A36 -M4650 A338 -M4654 A273 -M4657 A944 -M4661 A1071 -M4667 A164 -M4674 A566 -M4677 A584 -M4679 A715 -M4680 A514 -M4681 A70 -M4685 A731 -M4690 A418 -M4691 A1087 -M4694 A1043 -M4695 A815 -M4710 A1218 -M4730 A418 -M4734 A793 -M4738 A793 -M4741 A463 -M4744 A672 -M4745 A1122 -M4752 A274 -M4761 A94 -M4762 A993 -M4765 A286 -M4773 A1014 -M4779 A999 -M4781 A604 -M4791 A260 -M4792 A1033 -M4795 A141 -M4804 A1093 -M4813 A365 -M4821 A1089 -M4822 A837 -M4830 A284 -M4839 A105 -M4842 A81 -M4852 A351 -M4853 A455 -M4857 A10 -M4860 A485 -M4866 A489 -M4868 A1191 -M4882 A117 -M4888 A713 -M4894 A573 -M4896 A1393 -M4897 A977 -M4905 A349 -M4909 A166 -M4923 A811 -M4927 A695 -M4936 A1090 -M4941 A649 -M4942 A1381 -M4949 A751 -M4950 A751 -M4955 A385 -M4960 A477 -M4971 A807 -M4973 A296 -M4979 A589 -M4997 A554 -M5007 A710 -M5008 A1193 -M5012 A211 -M5014 A735 -M5021 A840 -M5026 A345 -M0 A752 -M1 A263 -M2 A1105 -M3 A826 -M5 A614 -M6 A910 -M8 A1040 -M9 A1073 -M10 A771 -M11 A119 -M12 A60 -M13 A263 -M14 A639 -M15 A517 -M17 A1040 -M18 A1049 -M19 A1036 -M20 A140 -M21 A359 -M22 A1129 -M23 A140 -M24 A1125 -M25 A882 -M26 A156 -M27 A974 -M28 A329 -M29 A1310 -M30 A235 -M31 A910 -M32 A1393 -M33 A996 -M34 A548 -M36 A433 -M37 A1038 -M38 A1157 -M39 A359 -M40 A1122 -M41 A882 -M42 A15 -M44 A851 -M45 A1024 -M46 A178 -M47 A418 -M48 A993 -M49 A832 -M50 A1210 -M51 A868 -M52 A958 -M54 A947 -M58 A483 -M59 A545 -M60 A1216 -M61 A51 -M62 A1157 -M63 A329 -M65 A539 -M66 A389 -M67 A352 -M68 A560 -M69 A340 -M70 A962 -M71 A1382 -M72 A691 -M73 A241 -M74 A9 -M77 A546 -M78 A1269 -M79 A1048 -M80 A974 -M83 A1310 -M86 A1035 -M88 A780 -M92 A782 -M93 A422 -M94 A579 -M95 A1373 -M96 A243 -M97 A713 -M99 A140 -M100 A1373 -M101 A448 -M102 A539 -M103 A831 -M104 A788 -M105 A1066 -M106 A996 -M107 A141 -M108 A432 -M111 A234 -M112 A542 -M113 A133 -M114 A1073 -M115 A1073 -M116 A242 -M117 A657 -M118 A962 -M119 A53 -M120 A419 -M121 A445 -M122 A255 -M123 A1117 -M127 A1039 -M128 A242 -M129 A1188 -M130 A1039 -M134 A1018 -M135 A317 -M137 A329 -M141 A1050 -M142 A381 -M143 A736 -M144 A156 -M145 A633 -M147 A263 -M148 A1326 -M149 A272 -M151 A1345 -M152 A861 -M153 A808 -M155 A317 -M157 A306 -M158 A807 -M159 A1302 -M160 A425 -M161 A910 -M162 A318 -M164 A572 -M165 A191 -M166 A252 -M168 A36 -M169 A560 -M171 A28 -M174 A885 -M175 A178 -M176 A131 -M178 A860 -M179 A713 -M181 A947 -M183 A1392 -M184 A585 -M185 A783 -M186 A490 -M187 A885 -M188 A401 -M189 A768 -M190 A431 -M192 A190 -M193 A2 -M194 A377 -M195 A70 -M197 A154 -M200 A255 -M202 A205 -M203 A340 -M205 A263 -M207 A831 -M210 A1028 -M211 A1373 -M212 A794 -M213 A448 -M216 A880 -M217 A865 -M218 A1173 -M219 A546 -M220 A279 -M221 A404 -M222 A466 -M223 A757 -M226 A1007 -M227 A242 -M228 A1329 -M229 A1348 -M230 A82 -M231 A1281 -M234 A603 -M235 A1050 -M236 A962 -M237 A962 -M238 A53 -M240 A419 -M241 A562 -M245 A1029 -M248 A773 -M249 A1144 -M250 A255 -M251 A466 -M252 A272 -M253 A709 -M254 A246 -M255 A133 -M256 A498 -M257 A482 -M259 A1111 -M264 A498 -M266 A951 -M267 A15 -M268 A597 -M270 A263 -M271 A208 -M272 A445 -M274 A993 -M275 A263 -M276 A1234 -M277 A1196 -M278 A1331 -M280 A1345 -M281 A1377 -M282 A133 -M283 A1290 -M284 A965 -M285 A220 -M286 A144 -M287 A706 -M288 A568 -M289 A826 -M290 A461 -M291 A950 -M292 A1221 -M293 A747 -M294 A29 -M295 A622 -M296 A478 -M297 A1097 -M298 A509 -M299 A363 -M300 A553 -M303 A633 -M305 A133 -M306 A296 -M307 A318 -M308 A550 -M311 A81 -M312 A1150 -M314 A754 -M315 A1326 -M316 A1162 -M318 A1392 -M321 A902 -M324 A846 -M325 A691 -M326 A419 -M329 A1131 -M330 A176 -M332 A245 -M334 A57 -M335 A54 -M336 A1322 -M337 A721 -M338 A1010 -M339 A859 -M340 A263 -M341 A318 -M342 A621 -M344 A469 -M345 A1047 -M347 A981 -M348 A603 -M349 A703 -M350 A90 -M351 A861 -M352 A602 -M353 A53 -M354 A861 -M356 A1192 -M357 A532 -M359 A609 -M360 A1272 -M361 A351 -M363 A208 -M364 A567 -M366 A794 -M369 A1107 -M370 A1111 -M372 A982 -M373 A1129 -M374 A247 -M375 A107 -M376 A933 -M378 A232 -M379 A133 -M380 A9 -M382 A49 -M383 A1290 -M384 A315 -M385 A284 -M386 A314 -M387 A178 -M389 A1144 -M390 A690 -M391 A934 -M392 A1234 -M393 A705 -M394 A1254 -M395 A1373 -M397 A1054 -M398 A1153 -M399 A70 -M400 A1007 -M401 A441 -M402 A982 -M405 A1117 -M406 A141 -M407 A570 -M408 A754 -M409 A1027 -M410 A43 -M411 A351 -M412 A1065 -M413 A498 -M415 A861 -M416 A943 -M417 A690 -M420 A178 -M423 A1234 -M424 A477 -M425 A221 -M427 A718 -M428 A333 -M430 A1327 -M431 A734 -M432 A617 -M434 A641 -M435 A313 -M436 A590 -M437 A363 -M438 A795 -M439 A490 -M441 A984 -M442 A590 -M443 A761 -M444 A246 -M445 A1393 -M446 A808 -M448 A98 -M449 A982 -M450 A36 -M451 A1393 -M453 A935 -M455 A1177 -M456 A1319 -M457 A117 -M458 A748 -M460 A412 -M461 A1 -M462 A1039 -M463 A1157 -M465 A701 -M467 A1349 -M468 A1350 -M470 A441 -M471 A314 -M474 A533 -M475 A1129 -M476 A216 -M478 A982 -M482 A1278 -M483 A961 -M484 A347 -M486 A1367 -M487 A389 -M488 A1326 -M490 A1317 -M491 A1033 -M493 A250 -M498 A908 -M500 A288 -M501 A890 -M503 A1087 -M505 A684 -M508 A65 -M509 A1234 -M510 A36 -M512 A808 -M513 A250 -M514 A982 -M515 A981 -M516 A910 -M517 A825 -M520 A1230 -M521 A17 -M522 A709 -M523 A759 -M524 A1135 -M525 A1165 -M526 A576 -M527 A9 -M528 A66 -M534 A1064 -M535 A982 -M536 A538 -M538 A480 -M539 A880 -M540 A224 -M542 A624 -M544 A337 -M545 A699 -M546 A107 -M547 A768 -M548 A1210 -M549 A429 -M550 A260 -M551 A1219 -M556 A937 -M557 A993 -M558 A582 -M560 A1224 -M561 A1263 -M562 A245 -M564 A1281 -M565 A79 -M568 A947 -M569 A1280 -M570 A1008 -M571 A533 -M572 A1021 -M574 A872 -M576 A1327 -M577 A706 -M579 A1310 -M580 A936 -M581 A1002 -M583 A732 -M584 A517 -M587 A352 -M588 A178 -M589 A246 -M590 A754 -M591 A1168 -M592 A863 -M594 A253 -M595 A238 -M596 A272 -M598 A603 -M599 A9 -M600 A378 -M602 A549 -M603 A680 -M604 A856 -M605 A351 -M607 A65 -M609 A245 -M610 A1383 -M611 A690 -M612 A21 -M613 A606 -M618 A981 -M620 A520 -M624 A284 -M627 A355 -M628 A997 -M629 A979 -M631 A885 -M632 A119 -M633 A17 -M635 A9 -M639 A602 -M640 A278 -M641 A169 -M642 A168 -M643 A28 -M644 A1353 -M646 A1080 -M648 A1373 -M650 A384 -M651 A1010 -M652 A542 -M653 A1327 -M655 A1321 -M657 A749 -M658 A214 -M660 A482 -M662 A1280 -M663 A774 -M664 A932 -M665 A16 -M666 A836 -M667 A884 -M668 A1068 -M669 A762 -M670 A802 -M671 A410 -M672 A216 -M673 A609 -M674 A822 -M675 A987 -M678 A199 -M679 A1230 -M681 A528 -M682 A490 -M683 A301 -M686 A622 -M687 A649 -M690 A1046 -M691 A245 -M692 A795 -M693 A294 -M696 A242 -M697 A1291 -M698 A1339 -M701 A415 -M702 A882 -M703 A836 -M706 A117 -M707 A423 -M708 A1137 -M709 A539 -M710 A747 -M711 A889 -M712 A298 -M714 A483 -M715 A782 -M717 A271 -M718 A479 -M719 A620 -M721 A384 -M722 A1133 -M723 A1137 -M724 A242 -M725 A857 -M726 A881 -M728 A935 -M730 A701 -M731 A246 -M732 A961 -M733 A9 -M734 A546 -M735 A795 -M736 A445 -M737 A1305 -M738 A1068 -M739 A935 -M740 A313 -M743 A1361 -M745 A1254 -M746 A94 -M747 A752 -M748 A1319 -M749 A537 -M750 A967 -M751 A750 -M753 A245 -M754 A572 -M755 A327 -M760 A258 -M761 A577 -M763 A471 -M764 A1197 -M766 A513 -M767 A29 -M768 A324 -M769 A908 -M771 A284 -M772 A9 -M773 A692 -M774 A1111 -M775 A488 -M778 A443 -M781 A947 -M783 A1098 -M784 A197 -M785 A1321 -M786 A1010 -M787 A1009 -M788 A588 -M789 A1305 -M793 A1156 -M794 A1040 -M796 A1287 -M798 A352 -M801 A760 -M803 A1332 -M804 A593 -M805 A1115 -M806 A234 -M807 A722 -M808 A1016 -M809 A1185 -M814 A1109 -M815 A966 -M817 A253 -M818 A753 -M821 A982 -M822 A124 -M823 A516 -M824 A199 -M827 A197 -M828 A833 -M829 A1390 -M830 A961 -M831 A11 -M834 A1329 -M835 A892 -M836 A1096 -M838 A747 -M840 A1395 -M841 A622 -M842 A313 -M843 A278 -M844 A1204 -M845 A362 -M846 A910 -M848 A1018 -M849 A40 -M850 A250 -M851 A249 -M853 A847 -M854 A190 -M855 A865 -M859 A1190 -M860 A714 -M862 A572 -M864 A1369 -M865 A796 -M866 A569 -M868 A681 -M869 A484 -M871 A879 -M873 A1215 -M876 A552 -M877 A928 -M878 A9 -M879 A249 -M880 A677 -M881 A1281 -M882 A1293 -M886 A531 -M887 A73 -M890 A786 -M891 A777 -M892 A882 -M893 A861 -M895 A778 -M896 A762 -M898 A1197 -M900 A808 -M901 A464 -M902 A548 -M903 A1257 -M904 A1185 -M905 A856 -M906 A780 -M907 A533 -M908 A861 -M909 A1351 -M910 A935 -M911 A224 -M912 A1317 -M913 A1371 -M914 A714 -M915 A1120 -M917 A990 -M918 A1122 -M920 A256 -M923 A239 -M924 A315 -M926 A885 -M929 A9 -M930 A772 -M931 A547 -M933 A831 -M934 A29 -M935 A982 -M936 A721 -M937 A594 -M938 A593 -M939 A529 -M940 A1050 -M941 A588 -M942 A882 -M943 A281 -M944 A718 -M945 A714 -M946 A1343 -M947 A656 -M948 A271 -M949 A351 -M950 A402 -M951 A550 -M953 A562 -M955 A732 -M956 A964 -M957 A9 -M958 A625 -M960 A794 -M964 A730 -M965 A1370 -M966 A1132 -M969 A210 -M970 A1347 -M972 A566 -M973 A296 -M974 A1199 -M975 A1316 -M977 A1393 -M978 A236 -M979 A181 -M981 A1283 -M982 A316 -M983 A935 -M984 A569 -M987 A963 -M989 A923 -M991 A846 -M993 A772 -M996 A1310 -M997 A608 -M998 A511 -M999 A363 -M1001 A1070 -M1002 A1209 -M1003 A1229 -M1004 A661 -M1005 A1219 -M1006 A1041 -M1008 A1229 -M1009 A661 -M1011 A156 -M1012 A527 -M1013 A1064 -M1014 A1043 -M1015 A674 -M1017 A588 -M1018 A201 -M1019 A747 -M1020 A610 -M1021 A935 -M1022 A147 -M1024 A648 -M1025 A643 -M1026 A441 -M1028 A984 -M1029 A29 -M1031 A1335 -M1032 A308 -M1034 A19 -M1037 A474 -M1038 A849 -M1039 A530 -M1041 A1348 -M1042 A133 -M1043 A183 -M1045 A280 -M1048 A340 -M1049 A987 -M1050 A853 -M1051 A506 -M1052 A441 -M1053 A279 -M1054 A1315 -M1055 A937 -M1057 A1377 -M1058 A1084 -M1059 A578 -M1060 A450 -M1065 A560 -M1066 A1215 -M1067 A400 -M1069 A351 -M1070 A393 -M1072 A543 -M1073 A1137 -M1074 A731 -M1077 A691 -M1078 A936 -M1079 A246 -M1080 A1167 -M1081 A342 -M1083 A1226 -M1084 A641 -M1085 A821 -M1086 A852 -M1087 A825 -M1089 A799 -M1090 A898 -M1092 A770 -M1094 A419 -M1095 A265 -M1096 A448 -M1097 A174 -M1098 A732 -M1100 A29 -M1103 A1303 -M1104 A982 -M1105 A857 -M1106 A148 -M1108 A341 -M1111 A714 -M1112 A957 -M1114 A156 -M1115 A980 -M1116 A1352 -M1118 A1152 -M1122 A333 -M1123 A1093 -M1124 A37 -M1125 A506 -M1126 A1000 -M1127 A448 -M1128 A1318 -M1131 A937 -M1134 A543 -M1135 A1323 -M1137 A193 -M1138 A789 -M1139 A216 -M1140 A178 -M1142 A1199 -M1144 A194 -M1145 A1263 -M1146 A11 -M1148 A250 -M1149 A19 -M1151 A1110 -M1153 A807 -M1156 A942 -M1157 A108 -M1158 A507 -M1161 A1276 -M1162 A482 -M1163 A65 -M1164 A907 -M1165 A1246 -M1166 A68 -M1167 A308 -M1168 A242 -M1171 A78 -M1172 A818 -M1173 A583 -M1176 A1160 -M1177 A788 -M1179 A754 -M1181 A1163 -M1183 A164 -M1185 A826 -M1186 A373 -M1189 A9 -M1190 A731 -M1191 A1382 -M1192 A550 -M1193 A277 -M1194 A1375 -M1196 A853 -M1199 A1319 -M1203 A808 -M1204 A584 -M1205 A517 -M1206 A351 -M1207 A889 -M1208 A993 -M1209 A243 -M1210 A1270 -M1211 A599 -M1212 A914 -M1213 A218 -M1214 A1392 -M1215 A1393 -M1216 A934 -M1218 A1022 -M1219 A178 -M1220 A774 -M1221 A43 -M1223 A453 -M1224 A1003 -M1225 A1333 -M1227 A587 -M1228 A1314 -M1230 A674 -M1232 A90 -M1233 A1054 -M1234 A478 -M1237 A1055 -M1238 A657 -M1240 A177 -M1243 A1072 -M1246 A655 -M1247 A177 -M1248 A9 -M1250 A1241 -M1253 A592 -M1256 A354 -M1257 A780 -M1258 A480 -M1259 A583 -M1263 A1163 -M1267 A242 -M1268 A1181 -M1271 A739 -M1272 A1046 -M1276 A15 -M1278 A974 -M1281 A151 -M1282 A420 -M1285 A910 -M1286 A1234 -M1287 A1068 -M1288 A968 -M1289 A1067 -M1290 A291 -M1291 A313 -M1292 A942 -M1293 A611 -M1295 A714 -M1296 A327 -M1297 A971 -M1301 A1154 -M1303 A153 -M1304 A1382 -M1305 A11 -M1306 A1192 -M1307 A734 -M1308 A897 -M1310 A546 -M1311 A1146 -M1312 A521 -M1314 A913 -M1317 A1003 -M1318 A1293 -M1319 A115 -M1320 A948 -M1322 A14 -M1325 A832 -M1326 A651 -M1328 A233 -M1331 A1114 -M1332 A1373 -M1333 A1339 -M1337 A363 -M1338 A78 -M1339 A584 -M1340 A1371 -M1342 A741 -M1345 A478 -M1348 A1174 -M1349 A1161 -M1351 A1236 -M1353 A1042 -M1354 A90 -M1355 A437 -M1356 A47 -M1357 A570 -M1360 A1191 -M1363 A519 -M1366 A476 -M1369 A1350 -M1370 A546 -M1371 A178 -M1373 A1122 -M1374 A126 -M1375 A828 -M1378 A1120 -M1379 A1346 -M1380 A149 -M1383 A579 -M1385 A1267 -M1387 A674 -M1388 A1161 -M1389 A123 -M1390 A561 -M1393 A75 -M1394 A1234 -M1395 A481 -M1396 A847 -M1397 A227 -M1399 A1380 -M1400 A1190 -M1401 A279 -M1402 A347 -M1403 A129 -M1405 A732 -M1406 A1243 -M1407 A340 -M1408 A243 -M1409 A1244 -M1412 A81 -M1413 A583 -M1415 A795 -M1417 A772 -M1418 A444 -M1420 A724 -M1421 A381 -M1423 A728 -M1424 A414 -M1425 A460 -M1426 A411 -M1427 A1301 -M1428 A639 -M1429 A352 -M1431 A1007 -M1434 A260 -M1436 A197 -M1438 A812 -M1439 A224 -M1440 A838 -M1441 A1122 -M1443 A456 -M1445 A953 -M1448 A56 -M1449 A448 -M1451 A370 -M1452 A246 -M1453 A1043 -M1455 A756 -M1456 A501 -M1458 A1155 -M1460 A79 -M1461 A664 -M1462 A276 -M1463 A1107 -M1465 A1311 -M1467 A208 -M1471 A602 -M1472 A828 -M1475 A236 -M1476 A41 -M1478 A958 -M1479 A1393 -M1480 A598 -M1483 A1050 -M1486 A880 -M1487 A1282 -M1488 A1213 -M1489 A348 -M1490 A226 -M1492 A339 -M1493 A753 -M1495 A602 -M1498 A594 -M1500 A1204 -M1502 A1111 -M1503 A845 -M1505 A360 -M1510 A749 -M1513 A611 -M1514 A44 -M1516 A467 -M1518 A663 -M1519 A242 -M1521 A546 -M1523 A1377 -M1524 A1199 -M1525 A739 -M1526 A1135 -M1530 A481 -M1534 A1276 -M1535 A249 -M1537 A333 -M1539 A883 -M1540 A588 -M1541 A93 -M1542 A1244 -M1543 A400 -M1544 A597 -M1545 A809 -M1546 A910 -M1548 A242 -M1549 A617 -M1551 A1263 -M1552 A1100 -M1554 A561 -M1555 A627 -M1556 A62 -M1558 A1337 -M1559 A448 -M1564 A634 -M1567 A916 -M1568 A929 -M1569 A838 -M1571 A119 -M1574 A1232 -M1575 A671 -M1576 A993 -M1578 A1111 -M1579 A1278 -M1581 A190 -M1584 A252 -M1586 A982 -M1587 A1149 -M1588 A53 -M1589 A1254 -M1591 A691 -M1592 A1179 -M1593 A1021 -M1594 A1047 -M1595 A1010 -M1597 A276 -M1598 A80 -M1599 A1067 -M1600 A178 -M1601 A289 -M1603 A878 -M1604 A9 -M1605 A643 -M1606 A728 -M1608 A464 -M1610 A747 -M1611 A178 -M1612 A589 -M1615 A245 -M1616 A753 -M1618 A590 -M1619 A565 -M1621 A310 -M1624 A456 -M1626 A1310 -M1630 A1011 -M1632 A326 -M1633 A1309 -M1636 A1229 -M1637 A1227 -M1641 A186 -M1642 A962 -M1645 A997 -M1646 A549 -M1647 A109 -M1648 A935 -M1650 A1278 -M1654 A324 -M1655 A76 -M1657 A817 -M1660 A68 -M1661 A227 -M1662 A1310 -M1665 A228 -M1666 A32 -M1668 A388 -M1674 A1129 -M1675 A86 -M1676 A396 -M1677 A216 -M1681 A282 -M1682 A170 -M1683 A769 -M1685 A958 -M1688 A243 -M1689 A857 -M1690 A242 -M1691 A111 -M1692 A485 -M1694 A898 -M1699 A873 -M1701 A20 -M1707 A1332 -M1708 A394 -M1711 A1081 -M1713 A9 -M1714 A915 -M1715 A1294 -M1716 A377 -M1718 A1066 -M1722 A317 -M1725 A705 -M1726 A399 -M1735 A541 -M1739 A21 -M1741 A988 -M1742 A89 -M1743 A1353 -M1744 A400 -M1747 A916 -M1751 A308 -M1753 A1382 -M1754 A245 -M1755 A1042 -M1756 A826 -M1757 A357 -M1758 A620 -M1759 A760 -M1760 A1310 -M1762 A661 -M1763 A380 -M1764 A9 -M1767 A934 -M1768 A329 -M1775 A590 -M1776 A810 -M1778 A448 -M1783 A796 -M1784 A776 -M1785 A1192 -M1787 A740 -M1788 A405 -M1789 A574 -M1792 A1004 -M1796 A683 -M1798 A1303 -M1799 A497 -M1801 A641 -M1803 A523 -M1804 A1176 -M1805 A1048 -M1806 A807 -M1808 A747 -M1811 A1224 -M1812 A9 -M1813 A880 -M1814 A1156 -M1816 A1129 -M1820 A926 -M1821 A432 -M1822 A357 -M1824 A1300 -M1825 A774 -M1827 A831 -M1828 A958 -M1829 A964 -M1830 A272 -M1834 A382 -M1837 A1098 -M1838 A571 -M1839 A279 -M1840 A899 -M1841 A284 -M1846 A1154 -M1849 A147 -M1850 A1344 -M1852 A641 -M1853 A1227 -M1854 A1064 -M1856 A1053 -M1859 A79 -M1861 A1067 -M1862 A34 -M1864 A502 -M1865 A1165 -M1867 A452 -M1868 A1041 -M1870 A880 -M1872 A173 -M1873 A79 -M1874 A1299 -M1875 A851 -M1876 A1212 -M1877 A718 -M1879 A819 -M1881 A1166 -M1882 A1086 -M1885 A1010 -M1886 A564 -M1889 A934 -M1890 A1138 -M1891 A166 -M1893 A352 -M1895 A269 -M1898 A156 -M1899 A564 -M1900 A965 -M1901 A847 -M1902 A29 -M1903 A79 -M1904 A1227 -M1905 A375 -M1906 A335 -M1907 A971 -M1908 A230 -M1910 A1014 -M1914 A944 -M1915 A422 -M1918 A285 -M1920 A714 -M1924 A1128 -M1925 A49 -M1928 A1017 -M1929 A701 -M1931 A1220 -M1935 A1203 -M1937 A298 -M1938 A626 -M1939 A724 -M1941 A714 -M1945 A1141 -M1948 A37 -M1949 A1145 -M1952 A376 -M1955 A227 -M1959 A976 -M1961 A970 -M1962 A666 -M1965 A1297 -M1968 A752 -M1970 A538 -M1973 A1111 -M1974 A705 -M1975 A392 -M1976 A1289 -M1978 A965 -M1979 A419 -M1980 A960 -M1981 A349 -M1982 A588 -M1985 A1268 -M1986 A302 -M1987 A204 -M1989 A242 -M1992 A520 -M1994 A481 -M1998 A1396 -M1999 A478 -M2000 A549 -M2005 A341 -M2008 A233 -M2011 A178 -M2015 A325 -M2016 A1212 -M2017 A250 -M2018 A1244 -M2019 A915 -M2020 A1392 -M2021 A445 -M2022 A620 -M2023 A586 -M2024 A111 -M2025 A511 -M2027 A1103 -M2028 A1146 -M2031 A1148 -M2033 A944 -M2034 A740 -M2035 A571 -M2036 A335 -M2039 A344 -M2040 A785 -M2042 A506 -M2043 A579 -M2046 A777 -M2047 A747 -M2048 A1048 -M2049 A882 -M2050 A21 -M2051 A1262 -M2052 A221 -M2054 A1360 -M2055 A831 -M2056 A94 -M2057 A361 -M2062 A48 -M2065 A539 -M2070 A950 -M2071 A242 -M2074 A658 -M2079 A1134 -M2081 A807 -M2082 A724 -M2083 A1242 -M2084 A1068 -M2085 A93 -M2086 A714 -M2090 A941 -M2091 A391 -M2093 A158 -M2094 A1280 -M2095 A1300 -M2096 A674 -M2099 A11 -M2102 A247 -M2103 A1370 -M2104 A1149 -M2105 A1345 -M2107 A349 -M2108 A835 -M2109 A910 -M2110 A1248 -M2111 A884 -M2113 A1396 -M2114 A694 -M2115 A1130 -M2118 A120 -M2121 A259 -M2124 A1141 -M2125 A413 -M2126 A176 -M2127 A373 -M2128 A670 -M2129 A878 -M2131 A497 -M2133 A141 -M2134 A832 -M2136 A1063 -M2137 A577 -M2138 A880 -M2139 A391 -M2144 A87 -M2146 A1110 -M2151 A1379 -M2152 A829 -M2153 A477 -M2154 A830 -M2156 A1052 -M2158 A880 -M2160 A457 -M2161 A940 -M2163 A701 -M2164 A828 -M2165 A840 -M2166 A115 -M2167 A946 -M2168 A1046 -M2170 A234 -M2174 A193 -M2175 A587 -M2176 A1312 -M2177 A513 -M2179 A1128 -M2181 A1068 -M2184 A1111 -M2189 A1177 -M2192 A1319 -M2193 A690 -M2196 A104 -M2198 A931 -M2199 A531 -M2205 A822 -M2207 A909 -M2209 A1110 -M2210 A821 -M2212 A373 -M2214 A806 -M2217 A1251 -M2219 A701 -M2221 A1123 -M2222 A299 -M2223 A762 -M2224 A1101 -M2225 A1035 -M2227 A1346 -M2230 A311 -M2231 A1227 -M2232 A328 -M2234 A1337 -M2237 A585 -M2238 A675 -M2239 A116 -M2240 A1046 -M2243 A366 -M2244 A993 -M2245 A743 -M2246 A637 -M2249 A961 -M2250 A1129 -M2251 A946 -M2253 A1382 -M2255 A1110 -M2260 A794 -M2262 A1120 -M2263 A212 -M2265 A649 -M2267 A928 -M2268 A239 -M2269 A1309 -M2270 A1359 -M2274 A958 -M2275 A643 -M2277 A187 -M2278 A237 -M2279 A1151 -M2281 A892 -M2282 A966 -M2284 A667 -M2285 A465 -M2286 A844 -M2287 A1118 -M2289 A679 -M2290 A1199 -M2291 A50 -M2292 A832 -M2293 A772 -M2294 A674 -M2297 A907 -M2298 A13 -M2304 A1366 -M2305 A1384 -M2307 A892 -M2308 A500 -M2310 A250 -M2311 A1127 -M2312 A822 -M2315 A314 -M2316 A1124 -M2317 A873 -M2319 A389 -M2321 A261 -M2323 A445 -M2324 A139 -M2326 A621 -M2328 A1268 -M2329 A376 -M2331 A44 -M2333 A133 -M2334 A241 -M2337 A761 -M2352 A1305 -M2354 A1259 -M2355 A100 -M2357 A1371 -M2358 A542 -M2359 A724 -M2360 A1062 -M2361 A1299 -M2362 A1184 -M2363 A518 -M2364 A1359 -M2367 A1375 -M2369 A28 -M2372 A148 -M2375 A808 -M2377 A181 -M2380 A66 -M2381 A57 -M2383 A117 -M2386 A714 -M2387 A869 -M2389 A899 -M2393 A1367 -M2396 A1244 -M2397 A118 -M2398 A944 -M2399 A1365 -M2400 A554 -M2401 A386 -M2402 A239 -M2403 A63 -M2405 A247 -M2406 A739 -M2407 A335 -M2408 A592 -M2409 A423 -M2411 A651 -M2413 A889 -M2414 A1043 -M2417 A1146 -M2418 A9 -M2420 A1327 -M2422 A651 -M2425 A1098 -M2429 A1093 -M2430 A1367 -M2432 A978 -M2433 A1211 -M2434 A617 -M2435 A539 -M2437 A273 -M2439 A1089 -M2441 A88 -M2442 A1289 -M2449 A1048 -M2450 A156 -M2452 A908 -M2454 A1364 -M2456 A176 -M2457 A327 -M2463 A301 -M2465 A262 -M2470 A380 -M2474 A519 -M2475 A1175 -M2476 A285 -M2481 A279 -M2488 A414 -M2489 A442 -M2492 A1083 -M2493 A78 -M2495 A963 -M2496 A1064 -M2497 A269 -M2498 A410 -M2499 A1122 -M2501 A217 -M2502 A700 -M2508 A450 -M2509 A1224 -M2510 A1 -M2513 A701 -M2516 A906 -M2517 A546 -M2520 A643 -M2521 A941 -M2523 A794 -M2527 A914 -M2531 A1089 -M2532 A147 -M2533 A794 -M2535 A156 -M2536 A1044 -M2538 A933 -M2539 A863 -M2542 A573 -M2543 A508 -M2546 A395 -M2547 A1048 -M2548 A1355 -M2553 A1019 -M2554 A821 -M2560 A433 -M2562 A1068 -M2563 A350 -M2565 A1363 -M2568 A1365 -M2571 A1245 -M2572 A224 -M2577 A1065 -M2578 A724 -M2579 A1296 -M2582 A47 -M2584 A11 -M2589 A451 -M2590 A104 -M2592 A1154 -M2595 A798 -M2599 A845 -M2600 A1282 -M2601 A1033 -M2602 A259 -M2603 A320 -M2604 A107 -M2606 A1359 -M2607 A1376 -M2608 A1031 -M2611 A270 -M2613 A1188 -M2614 A1105 -M2615 A1315 -M2616 A1123 -M2617 A743 -M2619 A1083 -M2620 A902 -M2623 A1021 -M2624 A171 -M2625 A762 -M2626 A900 -M2628 A1004 -M2629 A714 -M2630 A762 -M2632 A1317 -M2634 A1382 -M2636 A363 -M2638 A589 -M2639 A123 -M2640 A533 -M2641 A376 -M2642 A586 -M2644 A493 -M2645 A576 -M2647 A412 -M2648 A1065 -M2650 A448 -M2651 A854 -M2652 A228 -M2653 A1315 -M2655 A779 -M2659 A963 -M2660 A181 -M2664 A1013 -M2668 A618 -M2669 A646 -M2672 A1155 -M2677 A402 -M2681 A1357 -M2682 A176 -M2689 A81 -M2691 A943 -M2692 A323 -M2695 A186 -M2698 A1027 -M2700 A506 -M2701 A380 -M2703 A340 -M2705 A1119 -M2706 A716 -M2707 A130 -M2709 A1111 -M2710 A1194 -M2714 A123 -M2716 A1327 -M2717 A971 -M2719 A183 -M2721 A558 -M2723 A326 -M2725 A1043 -M2726 A474 -M2731 A1096 -M2736 A14 -M2738 A880 -M2746 A1396 -M2755 A949 -M2757 A1317 -M2760 A9 -M2761 A1183 -M2763 A765 -M2764 A80 -M2768 A777 -M2769 A16 -M2770 A234 -M2772 A450 -M2773 A302 -M2774 A1055 -M2776 A391 -M2777 A1212 -M2780 A430 -M2781 A1213 -M2783 A927 -M2785 A1062 -M2786 A454 -M2787 A248 -M2788 A89 -M2789 A1141 -M2794 A23 -M2795 A352 -M2798 A1004 -M2800 A253 -M2802 A60 -M2803 A620 -M2805 A96 -M2806 A858 -M2809 A795 -M2813 A92 -M2816 A477 -M2818 A380 -M2819 A389 -M2820 A1029 -M2821 A136 -M2822 A660 -M2823 A976 -M2826 A570 -M2832 A1311 -M2835 A1157 -M2836 A1281 -M2837 A197 -M2838 A599 -M2840 A307 -M2841 A584 -M2844 A586 -M2845 A389 -M2848 A616 -M2850 A1285 -M2851 A368 -M2852 A1231 -M2856 A792 -M2857 A82 -M2860 A865 -M2862 A1068 -M2864 A561 -M2865 A445 -M2867 A837 -M2868 A194 -M2869 A29 -M2876 A942 -M2882 A641 -M2883 A1373 -M2886 A5 -M2887 A1379 -M2888 A549 -M2895 A1085 -M2896 A728 -M2897 A1299 -M2898 A70 -M2900 A197 -M2901 A1197 -M2902 A461 -M2905 A83 -M2907 A1396 -M2908 A1150 -M2910 A388 -M2915 A732 -M2917 A439 -M2918 A1149 -M2921 A382 -M2923 A34 -M2924 A1396 -M2926 A250 -M2928 A277 -M2929 A1199 -M2930 A737 -M2932 A766 -M2933 A921 -M2934 A1201 -M2937 A1277 -M2938 A571 -M2939 A1068 -M2942 A483 -M2944 A144 -M2945 A1305 -M2948 A968 -M2949 A382 -M2951 A1164 -M2954 A421 -M2957 A633 -M2959 A689 -M2961 A1192 -M2962 A1025 -M2963 A424 -M2965 A841 -M2966 A302 -M2967 A784 -M2968 A1200 -M2969 A51 -M2971 A603 -M2973 A682 -M2974 A640 -M2979 A523 -M2980 A1339 -M2984 A930 -M2986 A410 -M2988 A1057 -M2989 A1093 -M2994 A1032 -M2995 A78 -M2997 A237 -M2998 A767 -M3000 A167 -M3001 A52 -M3002 A1118 -M3003 A840 -M3004 A792 -M3007 A998 -M3008 A941 -M3010 A401 -M3017 A178 -M3019 A1222 -M3023 A200 -M3030 A457 -M3031 A934 -M3035 A970 -M3037 A139 -M3038 A660 -M3039 A386 -M3040 A720 -M3041 A1088 -M3045 A1181 -M3050 A920 -M3053 A218 -M3054 A1008 -M3055 A284 -M3056 A1224 -M3058 A219 -M3060 A1259 -M3061 A1119 -M3062 A643 -M3064 A1388 -M3066 A244 -M3067 A1345 -M3069 A812 -M3070 A1295 -M3071 A86 -M3076 A970 -M3078 A292 -M3080 A1255 -M3089 A351 -M3091 A720 -M3093 A1243 -M3095 A740 -M3096 A570 -M3097 A720 -M3099 A1312 -M3100 A14 -M3103 A740 -M3104 A647 -M3106 A931 -M3108 A860 -M3110 A6 -M3111 A138 -M3112 A967 -M3113 A1023 -M3114 A1303 -M3117 A178 -M3119 A1198 -M3120 A937 -M3123 A744 -M3124 A1017 -M3127 A883 -M3128 A300 -M3132 A914 -M3135 A561 -M3138 A729 -M3139 A1290 -M3140 A1004 -M3141 A137 -M3143 A282 -M3144 A146 -M3146 A1291 -M3148 A151 -M3150 A226 -M3155 A519 -M3156 A150 -M3158 A1358 -M3160 A762 -M3161 A1010 -M3163 A1165 -M3164 A170 -M3165 A741 -M3168 A913 -M3170 A133 -M3173 A1010 -M3175 A1123 -M3184 A976 -M3185 A1253 -M3193 A391 -M3198 A313 -M3200 A1006 -M3205 A243 -M3206 A910 -M3209 A717 -M3212 A677 -M3213 A790 -M3215 A543 -M3216 A142 -M3220 A360 -M3227 A702 -M3231 A625 -M3240 A1253 -M3241 A814 -M3249 A1188 -M3251 A753 -M3256 A426 -M3258 A683 -M3260 A1303 -M3267 A1088 -M3270 A705 -M3271 A1213 -M3274 A762 -M3277 A76 -M3284 A445 -M3285 A963 -M3288 A708 -M3290 A483 -M3291 A70 -M3293 A763 -M3294 A1061 -M3296 A1322 -M3297 A980 -M3300 A904 -M3304 A1189 -M3305 A1308 -M3306 A1208 -M3307 A423 -M3308 A396 -M3317 A1107 -M3331 A372 -M3332 A55 -M3337 A520 -M3338 A606 -M3343 A554 -M3344 A504 -M3345 A511 -M3353 A370 -M3355 A770 -M3366 A963 -M3368 A589 -M3370 A1327 -M3374 A1179 -M3378 A1285 -M3380 A906 -M3382 A210 -M3384 A588 -M3386 A820 -M3388 A446 -M3389 A12 -M3390 A572 -M3391 A1396 -M3392 A1369 -M3393 A313 -M3394 A1022 -M3396 A929 -M3399 A894 -M3400 A1294 -M3401 A950 -M3405 A1213 -M3414 A684 -M3417 A970 -M3424 A1122 -M3430 A413 -M3435 A1146 -M3438 A769 -M3439 A712 -M3440 A1000 -M3441 A521 -M3442 A838 -M3443 A538 -M3447 A1157 -M3448 A732 -M3450 A33 -M3452 A391 -M3453 A77 -M3457 A1185 -M3459 A574 -M3461 A910 -M3463 A645 -M3465 A668 -M3466 A119 -M3468 A1018 -M3470 A196 -M3471 A0 -M3473 A1227 -M3475 A391 -M3476 A1210 -M3477 A1108 -M3479 A1345 -M3480 A1379 -M3492 A468 -M3493 A235 -M3498 A202 -M3499 A625 -M3501 A613 -M3503 A294 -M3505 A18 -M3512 A1034 -M3514 A971 -M3515 A143 -M3516 A1096 -M3523 A128 -M3530 A863 -M3531 A486 -M3537 A689 -M3540 A511 -M3542 A593 -M3543 A1211 -M3559 A727 -M3560 A40 -M3561 A608 -M3566 A476 -M3567 A1259 -M3569 A458 -M3570 A735 -M3574 A614 -M3575 A1390 -M3578 A1385 -M3580 A1193 -M3581 A327 -M3582 A777 -M3586 A1171 -M3587 A208 -M3591 A1253 -M3592 A643 -M3594 A914 -M3597 A1339 -M3598 A1362 -M3599 A805 -M3602 A465 -M3603 A701 -M3605 A1353 -M3607 A169 -M3618 A889 -M3621 A54 -M3627 A861 -M3631 A115 -M3637 A154 -M3638 A797 -M3640 A1000 -M3641 A1226 -M3647 A1122 -M3648 A20 -M3652 A686 -M3654 A511 -M3663 A463 -M3668 A439 -M3671 A1316 -M3674 A1345 -M3675 A1213 -M3679 A222 -M3680 A1011 -M3681 A770 -M3688 A1042 -M3689 A919 -M3696 A613 -M3697 A310 -M3699 A457 -M3704 A1358 -M3709 A1128 -M3713 A52 -M3714 A645 -M3716 A730 -M3717 A1338 -M3718 A1193 -M3719 A1306 -M3722 A719 -M3726 A482 -M3727 A1263 -M3729 A1388 -M3732 A510 -M3733 A43 -M3734 A1279 -M3741 A475 -M3746 A170 -M3751 A1168 -M3753 A1303 -M3760 A763 -M3762 A1386 -M3765 A672 -M3766 A1313 -M3767 A18 -M3769 A372 -M3771 A1379 -M3773 A238 -M3775 A289 -M3778 A945 -M3779 A117 -M3780 A725 -M3781 A429 -M3782 A1283 -M3783 A1287 -M3784 A1285 -M3788 A778 -M3795 A1081 -M3811 A165 -M3814 A194 -M3817 A1163 -M3821 A183 -M3824 A291 -M3825 A341 -M3831 A795 -M3844 A1052 -M3846 A861 -M3849 A296 -M3852 A1011 -M3854 A31 -M3857 A267 -M3858 A291 -M3867 A69 -M3869 A1231 -M3873 A947 -M3879 A633 -M3880 A1211 -M3882 A472 -M3884 A942 -M3886 A869 -M3888 A1048 -M3889 A854 -M3891 A1302 -M3892 A1181 -M3894 A1041 -M3896 A1385 -M3898 A1284 -M3907 A1353 -M3908 A706 -M3910 A1303 -M3911 A1014 -M3912 A358 -M3913 A572 -M3915 A666 -M3917 A601 -M3918 A1084 -M3920 A538 -M3921 A857 -M3922 A983 -M3924 A839 -M3925 A483 -M3928 A1391 -M3929 A705 -M3936 A299 -M3938 A226 -M3940 A755 -M3942 A1008 -M3945 A1219 -M3947 A1043 -M3955 A398 -M3961 A784 -M3967 A1188 -M3969 A1084 -M3972 A615 -M3980 A552 -M3981 A90 -M3984 A753 -M3987 A920 -M3988 A522 -M3991 A897 -M3994 A344 -M3998 A629 -M3999 A1077 -M4009 A879 -M4011 A662 -M4023 A537 -M4025 A1199 -M4032 A1028 -M4035 A1221 -M4040 A667 -M4041 A1313 -M4044 A1391 -M4046 A829 -M4049 A738 -M4050 A291 -M4051 A1135 -M4053 A1383 -M4057 A922 -M4063 A14 -M4067 A1249 -M4068 A689 -M4069 A488 -M4072 A149 -M4076 A459 -M4077 A787 -M4085 A1351 -M4086 A10 -M4092 A1204 -M4097 A293 -M4098 A1310 -M4099 A471 -M4102 A1367 -M4104 A1163 -M4110 A635 -M4112 A917 -M4124 A712 -M4128 A996 -M4132 A423 -M4135 A417 -M4141 A1322 -M4158 A1181 -M4159 A869 -M4171 A763 -M4173 A242 -M4180 A1298 -M4182 A576 -M4183 A242 -M4188 A1396 -M4189 A1389 -M4198 A195 -M4202 A1010 -M4208 A560 -M4212 A692 -M4214 A1133 -M4216 A890 -M4220 A542 -M4223 A44 -M4230 A1069 -M4231 A352 -M4239 A650 -M4252 A1189 -M4254 A6 -M4256 A786 -M4257 A179 -M4260 A385 -M4265 A494 -M4274 A132 -M4277 A826 -M4278 A1037 -M4279 A852 -M4282 A1364 -M4290 A405 -M4293 A651 -M4295 A1237 -M4300 A596 -M4303 A121 -M4313 A1297 -M4315 A774 -M4330 A579 -M4331 A299 -M4336 A218 -M4344 A159 -M4346 A836 -M4350 A1310 -M4352 A724 -M4358 A1277 -M4359 A615 -M4369 A689 -M4381 A1155 -M4396 A830 -M4401 A760 -M4408 A998 -M4411 A1287 -M4412 A723 -M4413 A613 -M4423 A179 -M4437 A1255 -M4446 A935 -M4458 A448 -M4462 A930 -M4466 A1321 -M4472 A1292 -M4485 A412 -M4486 A122 -M4489 A1350 -M4491 A904 -M4493 A9 -M4494 A740 -M4496 A1345 -M4508 A676 -M4511 A849 -M4526 A1182 -M4532 A1327 -M4535 A1315 -M4536 A316 -M4541 A571 -M4543 A1066 -M4551 A306 -M4557 A645 -M4564 A314 -M4565 A753 -M4568 A805 -M4569 A966 -M4573 A1088 -M4575 A554 -M4577 A992 -M4584 A721 -M4589 A948 -M4594 A166 -M4596 A1200 -M4604 A280 -M4623 A777 -M4631 A11 -M4636 A600 -M4638 A1277 -M4645 A1342 -M4649 A1317 -M4650 A293 -M4663 A1342 -M4677 A840 -M4678 A623 -M4681 A395 -M4690 A771 -M4694 A882 -M4695 A370 -M4730 A1175 -M4741 A1071 -M4744 A492 -M4745 A589 -M4752 A401 -M4761 A1254 -M4762 A154 -M4765 A1000 -M4773 A1325 -M4778 A1157 -M4791 A324 -M4795 A1201 -M4821 A1083 -M4830 A609 -M4852 A1092 -M4853 A810 -M4860 A627 -M4863 A1356 -M4866 A618 -M4882 A1194 -M4895 A491 -M4905 A388 -M4914 A1169 -M4927 A44 -M4930 A781 -M4942 A461 -M4944 A494 -M4949 A485 -M4950 A485 -M4960 A195 -M4971 A412 -M4979 A514 -M5001 A1307 -M5012 A339 -M5014 A266 -M5021 A268 -M0 A1151 -M1 A800 -M3 A338 -M6 A762 -M8 A974 -M9 A220 -M11 A90 -M12 A1105 -M13 A800 -M14 A1111 -M15 A692 -M17 A974 -M18 A1115 -M20 A604 -M23 A604 -M24 A795 -M25 A901 -M27 A1035 -M29 A679 -M30 A1105 -M31 A762 -M32 A961 -M33 A243 -M36 A1221 -M37 A548 -M38 A910 -M39 A551 -M40 A674 -M41 A396 -M44 A1064 -M45 A1373 -M46 A211 -M47 A1054 -M50 A491 -M53 A433 -M54 A1213 -M58 A84 -M60 A891 -M61 A70 -M62 A214 -M65 A226 -M66 A9 -M69 A1393 -M70 A947 -M71 A233 -M72 A797 -M73 A1301 -M74 A590 -M75 A621 -M79 A1208 -M80 A1393 -M83 A632 -M84 A804 -M86 A783 -M87 A1273 -M92 A1324 -M93 A895 -M95 A318 -M96 A428 -M97 A338 -M99 A604 -M100 A1355 -M101 A458 -M102 A284 -M103 A490 -M105 A190 -M106 A243 -M107 A970 -M109 A321 -M111 A690 -M112 A433 -M113 A1364 -M114 A205 -M115 A220 -M116 A794 -M118 A1383 -M119 A450 -M120 A9 -M121 A1135 -M122 A208 -M127 A808 -M128 A154 -M129 A1316 -M130 A808 -M134 A962 -M135 A1295 -M136 A638 -M140 A802 -M141 A794 -M142 A387 -M143 A912 -M145 A258 -M147 A530 -M148 A1135 -M149 A275 -M150 A733 -M151 A907 -M152 A602 -M155 A427 -M158 A664 -M159 A402 -M160 A993 -M161 A762 -M162 A422 -M164 A1150 -M165 A983 -M167 A660 -M169 A352 -M171 A783 -M172 A1055 -M174 A1120 -M175 A1064 -M176 A1129 -M178 A757 -M179 A862 -M181 A1010 -M182 A503 -M183 A594 -M184 A736 -M185 A85 -M186 A843 -M187 A1120 -M188 A824 -M189 A898 -M190 A1232 -M191 A1363 -M193 A441 -M194 A1263 -M195 A220 -M197 A148 -M200 A208 -M202 A1380 -M203 A168 -M205 A800 -M207 A490 -M208 A957 -M210 A781 -M211 A36 -M213 A82 -M214 A1238 -M215 A1258 -M216 A1218 -M218 A563 -M219 A782 -M220 A1150 -M221 A276 -M222 A190 -M224 A101 -M225 A251 -M226 A652 -M227 A1295 -M228 A717 -M229 A657 -M231 A1376 -M234 A1232 -M235 A106 -M236 A617 -M237 A617 -M238 A622 -M240 A866 -M241 A903 -M243 A620 -M247 A187 -M248 A1329 -M250 A208 -M251 A716 -M252 A271 -M253 A1111 -M256 A1146 -M257 A40 -M264 A154 -M270 A859 -M271 A686 -M272 A572 -M274 A538 -M276 A1021 -M277 A1187 -M278 A913 -M280 A318 -M281 A1208 -M282 A935 -M283 A581 -M285 A2 -M286 A253 -M287 A893 -M288 A811 -M289 A1115 -M290 A1280 -M291 A1128 -M292 A575 -M293 A1185 -M295 A30 -M296 A251 -M298 A206 -M299 A245 -M303 A258 -M304 A110 -M305 A754 -M306 A1396 -M307 A1114 -M308 A1393 -M309 A930 -M310 A499 -M311 A1213 -M312 A1167 -M314 A888 -M315 A471 -M316 A532 -M318 A352 -M321 A915 -M324 A1194 -M326 A1213 -M330 A832 -M332 A70 -M334 A1246 -M336 A182 -M337 A891 -M338 A1329 -M339 A484 -M340 A859 -M341 A1000 -M344 A924 -M345 A89 -M346 A665 -M347 A917 -M348 A1232 -M351 A208 -M352 A1335 -M353 A585 -M354 A1092 -M356 A990 -M359 A540 -M360 A8 -M361 A947 -M363 A729 -M364 A1156 -M365 A357 -M368 A436 -M369 A98 -M370 A882 -M371 A647 -M372 A54 -M373 A1058 -M374 A675 -M375 A623 -M376 A540 -M378 A729 -M379 A318 -M380 A963 -M382 A684 -M385 A1371 -M386 A50 -M387 A681 -M390 A353 -M391 A784 -M392 A202 -M393 A542 -M394 A372 -M395 A1355 -M397 A288 -M399 A655 -M401 A263 -M402 A1367 -M405 A176 -M406 A1248 -M407 A1324 -M410 A405 -M411 A178 -M412 A1268 -M413 A1146 -M415 A832 -M416 A665 -M420 A381 -M423 A1029 -M426 A949 -M429 A96 -M430 A1362 -M434 A159 -M435 A807 -M436 A768 -M437 A19 -M438 A929 -M440 A994 -M442 A1339 -M443 A1372 -M444 A1340 -M445 A935 -M449 A1367 -M450 A243 -M453 A659 -M455 A1153 -M457 A281 -M458 A647 -M460 A149 -M462 A687 -M463 A70 -M465 A561 -M471 A1363 -M474 A146 -M476 A449 -M482 A112 -M483 A176 -M486 A971 -M487 A377 -M488 A862 -M491 A199 -M496 A240 -M498 A1 -M499 A522 -M508 A1324 -M510 A923 -M512 A376 -M513 A131 -M514 A180 -M516 A428 -M517 A941 -M520 A1263 -M521 A208 -M522 A31 -M524 A503 -M526 A1028 -M527 A1064 -M528 A1023 -M534 A928 -M535 A1382 -M539 A402 -M541 A133 -M542 A1187 -M544 A930 -M545 A60 -M546 A981 -M547 A1339 -M548 A290 -M550 A1339 -M552 A1220 -M556 A1234 -M557 A756 -M558 A761 -M560 A1297 -M561 A990 -M562 A928 -M564 A880 -M565 A1081 -M568 A1198 -M570 A711 -M571 A571 -M572 A164 -M576 A298 -M579 A1129 -M580 A1181 -M583 A931 -M584 A80 -M587 A252 -M588 A478 -M589 A506 -M590 A888 -M591 A1094 -M592 A1272 -M594 A621 -M595 A651 -M597 A98 -M598 A520 -M599 A94 -M601 A1221 -M602 A594 -M603 A231 -M604 A794 -M605 A651 -M606 A404 -M609 A467 -M611 A688 -M612 A225 -M614 A500 -M618 A1338 -M623 A1103 -M624 A817 -M627 A596 -M631 A589 -M632 A1368 -M633 A565 -M635 A547 -M636 A967 -M639 A930 -M640 A185 -M642 A993 -M644 A472 -M646 A298 -M648 A351 -M650 A391 -M651 A1314 -M653 A934 -M655 A750 -M656 A1238 -M657 A1242 -M658 A243 -M659 A149 -M661 A557 -M662 A595 -M663 A766 -M664 A192 -M666 A276 -M667 A122 -M668 A553 -M669 A486 -M671 A320 -M672 A980 -M673 A173 -M675 A1371 -M676 A300 -M677 A437 -M678 A887 -M679 A1153 -M684 A872 -M686 A202 -M687 A759 -M690 A567 -M691 A1125 -M692 A14 -M695 A344 -M696 A535 -M698 A5 -M699 A155 -M701 A920 -M702 A1333 -M703 A509 -M706 A106 -M707 A260 -M709 A1001 -M710 A1185 -M711 A526 -M712 A899 -M714 A1363 -M717 A221 -M718 A1102 -M721 A84 -M722 A1309 -M723 A390 -M725 A545 -M726 A52 -M728 A902 -M729 A277 -M731 A191 -M732 A1192 -M734 A1272 -M736 A930 -M737 A484 -M738 A524 -M739 A1047 -M740 A299 -M746 A292 -M747 A923 -M751 A320 -M753 A1293 -M754 A432 -M755 A155 -M761 A123 -M763 A155 -M766 A327 -M767 A1106 -M768 A1093 -M769 A550 -M771 A75 -M773 A1389 -M774 A373 -M775 A1200 -M776 A339 -M778 A378 -M781 A373 -M784 A997 -M785 A1378 -M786 A247 -M787 A242 -M788 A705 -M789 A446 -M793 A750 -M794 A974 -M795 A387 -M796 A79 -M801 A1177 -M804 A21 -M806 A222 -M807 A332 -M809 A620 -M815 A1042 -M817 A1116 -M818 A1029 -M821 A1367 -M823 A227 -M824 A869 -M827 A242 -M828 A886 -M830 A511 -M831 A775 -M834 A1108 -M838 A1185 -M840 A1197 -M841 A149 -M842 A1058 -M843 A45 -M844 A483 -M846 A590 -M847 A1098 -M850 A1180 -M853 A30 -M854 A118 -M856 A280 -M860 A5 -M862 A1311 -M863 A150 -M864 A705 -M865 A736 -M869 A33 -M871 A784 -M874 A492 -M876 A1364 -M877 A118 -M878 A433 -M879 A361 -M880 A942 -M881 A1232 -M887 A91 -M890 A668 -M891 A177 -M892 A1263 -M893 A877 -M894 A745 -M895 A1224 -M896 A1310 -M897 A350 -M900 A433 -M901 A122 -M902 A213 -M903 A1150 -M905 A482 -M906 A891 -M907 A928 -M908 A106 -M909 A1284 -M911 A645 -M913 A512 -M914 A1044 -M915 A243 -M916 A1389 -M917 A1119 -M918 A1228 -M920 A164 -M924 A909 -M925 A1078 -M926 A1120 -M929 A471 -M930 A1223 -M931 A107 -M933 A412 -M934 A590 -M935 A1359 -M937 A27 -M938 A730 -M940 A762 -M942 A1158 -M945 A589 -M946 A680 -M947 A192 -M949 A168 -M950 A1209 -M951 A588 -M953 A590 -M955 A1027 -M956 A178 -M957 A252 -M958 A193 -M959 A912 -M960 A922 -M964 A678 -M966 A888 -M969 A1159 -M970 A388 -M972 A584 -M973 A880 -M974 A1371 -M977 A18 -M978 A987 -M979 A1096 -M982 A1170 -M983 A833 -M987 A1169 -M991 A791 -M995 A437 -M996 A208 -M997 A686 -M998 A992 -M1001 A135 -M1003 A779 -M1005 A1316 -M1008 A704 -M1011 A387 -M1012 A83 -M1013 A934 -M1015 A892 -M1017 A910 -M1018 A113 -M1021 A1199 -M1022 A606 -M1024 A1392 -M1025 A1335 -M1026 A549 -M1027 A1148 -M1028 A1029 -M1029 A652 -M1031 A1208 -M1032 A659 -M1034 A352 -M1036 A184 -M1041 A449 -M1042 A975 -M1048 A400 -M1049 A670 -M1050 A1152 -M1051 A1222 -M1052 A1082 -M1053 A813 -M1057 A492 -M1058 A1314 -M1060 A362 -M1065 A623 -M1066 A1061 -M1067 A378 -M1069 A880 -M1072 A1099 -M1073 A537 -M1074 A1063 -M1075 A764 -M1078 A80 -M1079 A807 -M1080 A262 -M1081 A734 -M1083 A1015 -M1084 A966 -M1085 A777 -M1087 A503 -M1089 A1396 -M1090 A815 -M1092 A1328 -M1094 A22 -M1095 A53 -M1096 A1045 -M1098 A252 -M1100 A935 -M1102 A1142 -M1104 A1300 -M1105 A479 -M1107 A1333 -M1111 A246 -M1112 A493 -M1113 A1195 -M1119 A180 -M1124 A176 -M1125 A1153 -M1126 A479 -M1127 A1151 -M1128 A302 -M1131 A468 -M1134 A146 -M1137 A1108 -M1138 A782 -M1139 A956 -M1140 A677 -M1141 A209 -M1142 A314 -M1144 A1294 -M1145 A1322 -M1146 A102 -M1147 A369 -M1148 A1137 -M1149 A506 -M1151 A444 -M1154 A227 -M1155 A475 -M1157 A1065 -M1159 A1384 -M1162 A1028 -M1166 A244 -M1167 A561 -M1168 A548 -M1171 A345 -M1172 A1133 -M1181 A1000 -M1184 A198 -M1185 A123 -M1186 A703 -M1188 A518 -M1189 A210 -M1190 A432 -M1191 A741 -M1192 A284 -M1193 A1223 -M1196 A241 -M1199 A586 -M1200 A951 -M1201 A518 -M1203 A70 -M1204 A527 -M1205 A476 -M1206 A800 -M1207 A227 -M1209 A252 -M1210 A934 -M1212 A692 -M1214 A1129 -M1219 A246 -M1220 A766 -M1221 A730 -M1224 A823 -M1227 A788 -M1228 A316 -M1230 A471 -M1231 A1008 -M1232 A20 -M1233 A974 -M1234 A1243 -M1237 A638 -M1238 A1132 -M1239 A959 -M1240 A479 -M1243 A1064 -M1246 A561 -M1247 A484 -M1248 A550 -M1253 A526 -M1258 A750 -M1261 A932 -M1263 A417 -M1266 A595 -M1267 A547 -M1271 A675 -M1272 A1356 -M1277 A767 -M1278 A856 -M1284 A141 -M1285 A1308 -M1287 A337 -M1288 A1224 -M1289 A501 -M1290 A602 -M1291 A150 -M1295 A235 -M1296 A116 -M1299 A460 -M1303 A1396 -M1304 A304 -M1305 A102 -M1306 A871 -M1307 A1303 -M1308 A1356 -M1311 A1034 -M1312 A922 -M1313 A440 -M1319 A449 -M1325 A1057 -M1326 A360 -M1328 A184 -M1331 A912 -M1332 A1355 -M1333 A395 -M1345 A674 -M1348 A656 -M1351 A189 -M1352 A134 -M1353 A8 -M1354 A756 -M1355 A145 -M1357 A4 -M1358 A1 -M1360 A1023 -M1362 A1037 -M1366 A177 -M1368 A185 -M1370 A730 -M1371 A1058 -M1373 A100 -M1375 A164 -M1377 A1229 -M1378 A589 -M1379 A314 -M1380 A1253 -M1381 A730 -M1383 A1311 -M1385 A1061 -M1386 A1229 -M1387 A1102 -M1388 A522 -M1389 A1048 -M1390 A703 -M1391 A122 -M1392 A519 -M1396 A828 -M1397 A1303 -M1399 A344 -M1400 A1006 -M1401 A394 -M1402 A557 -M1403 A933 -M1405 A955 -M1409 A911 -M1410 A85 -M1411 A271 -M1412 A54 -M1415 A957 -M1416 A437 -M1417 A879 -M1418 A883 -M1421 A116 -M1423 A371 -M1424 A690 -M1426 A108 -M1428 A551 -M1431 A512 -M1433 A1269 -M1434 A180 -M1436 A314 -M1437 A272 -M1438 A703 -M1439 A1010 -M1441 A411 -M1445 A1001 -M1449 A1045 -M1451 A323 -M1454 A530 -M1455 A6 -M1458 A1026 -M1460 A931 -M1463 A1063 -M1465 A437 -M1474 A1132 -M1475 A802 -M1478 A1217 -M1479 A1079 -M1483 A359 -M1488 A882 -M1490 A205 -M1495 A518 -M1498 A868 -M1500 A1081 -M1501 A155 -M1502 A458 -M1508 A804 -M1510 A1123 -M1513 A557 -M1514 A296 -M1519 A740 -M1521 A1310 -M1523 A704 -M1524 A164 -M1525 A934 -M1530 A508 -M1533 A49 -M1534 A105 -M1535 A381 -M1539 A1175 -M1540 A29 -M1542 A704 -M1544 A374 -M1546 A2 -M1548 A313 -M1549 A1068 -M1551 A343 -M1554 A462 -M1555 A497 -M1556 A1093 -M1558 A1129 -M1561 A1288 -M1564 A362 -M1565 A1261 -M1567 A1327 -M1568 A376 -M1569 A975 -M1571 A935 -M1576 A1270 -M1577 A668 -M1578 A335 -M1579 A237 -M1581 A620 -M1582 A733 -M1584 A813 -M1586 A397 -M1587 A987 -M1589 A572 -M1591 A1254 -M1592 A1092 -M1593 A932 -M1594 A929 -M1595 A752 -M1597 A1293 -M1598 A1071 -M1599 A1114 -M1600 A1144 -M1601 A333 -M1604 A600 -M1605 A563 -M1606 A607 -M1608 A597 -M1611 A458 -M1616 A315 -M1617 A959 -M1621 A1176 -M1624 A1076 -M1637 A704 -M1638 A810 -M1641 A734 -M1646 A1276 -M1647 A44 -M1648 A1012 -M1655 A150 -M1657 A544 -M1661 A583 -M1662 A343 -M1665 A433 -M1666 A759 -M1673 A455 -M1674 A912 -M1675 A799 -M1676 A315 -M1677 A1392 -M1680 A112 -M1681 A1014 -M1683 A347 -M1685 A999 -M1688 A1310 -M1689 A656 -M1690 A1155 -M1691 A654 -M1694 A965 -M1699 A1151 -M1701 A437 -M1708 A1380 -M1711 A388 -M1712 A330 -M1713 A1131 -M1714 A1093 -M1716 A22 -M1717 A221 -M1718 A456 -M1722 A176 -M1725 A1097 -M1739 A284 -M1741 A1174 -M1742 A446 -M1743 A860 -M1744 A31 -M1751 A412 -M1755 A532 -M1759 A1146 -M1760 A1130 -M1762 A492 -M1763 A1027 -M1764 A382 -M1765 A1055 -M1768 A29 -M1771 A651 -M1772 A575 -M1773 A1309 -M1775 A645 -M1777 A704 -M1778 A770 -M1783 A18 -M1784 A806 -M1786 A889 -M1787 A654 -M1788 A193 -M1789 A726 -M1794 A1280 -M1798 A1135 -M1799 A638 -M1801 A714 -M1803 A1244 -M1805 A1208 -M1806 A309 -M1812 A216 -M1813 A176 -M1814 A757 -M1815 A215 -M1816 A6 -M1820 A183 -M1824 A955 -M1825 A780 -M1827 A780 -M1829 A885 -M1833 A1116 -M1835 A74 -M1838 A57 -M1840 A627 -M1841 A237 -M1846 A122 -M1847 A177 -M1848 A575 -M1849 A546 -M1852 A748 -M1853 A1383 -M1856 A1353 -M1857 A1215 -M1859 A497 -M1861 A680 -M1862 A1123 -M1864 A843 -M1868 A55 -M1870 A934 -M1871 A75 -M1875 A1066 -M1877 A1154 -M1879 A707 -M1881 A1261 -M1885 A1091 -M1886 A1292 -M1890 A912 -M1891 A1269 -M1892 A218 -M1894 A125 -M1895 A1061 -M1898 A375 -M1900 A1347 -M1901 A105 -M1902 A590 -M1903 A1014 -M1905 A894 -M1906 A404 -M1908 A688 -M1909 A862 -M1910 A18 -M1914 A538 -M1915 A1337 -M1917 A1123 -M1920 A329 -M1921 A772 -M1925 A942 -M1926 A322 -M1929 A191 -M1937 A276 -M1938 A896 -M1939 A758 -M1941 A246 -M1944 A1323 -M1945 A861 -M1948 A592 -M1949 A653 -M1955 A551 -M1959 A660 -M1961 A59 -M1965 A511 -M1973 A1010 -M1974 A380 -M1975 A849 -M1978 A433 -M1979 A246 -M1981 A1281 -M1982 A807 -M1989 A935 -M1994 A508 -M1995 A1161 -M1998 A1250 -M2000 A508 -M2005 A673 -M2011 A567 -M2015 A849 -M2016 A393 -M2017 A762 -M2018 A911 -M2019 A994 -M2020 A352 -M2022 A175 -M2024 A654 -M2025 A487 -M2026 A1133 -M2028 A14 -M2034 A929 -M2035 A1234 -M2036 A35 -M2038 A968 -M2040 A516 -M2041 A516 -M2042 A810 -M2046 A1303 -M2047 A459 -M2049 A901 -M2055 A1376 -M2056 A981 -M2059 A1323 -M2062 A673 -M2065 A705 -M2070 A223 -M2071 A1091 -M2076 A1320 -M2079 A669 -M2082 A758 -M2083 A1181 -M2084 A1019 -M2085 A877 -M2088 A1220 -M2091 A759 -M2095 A518 -M2099 A102 -M2103 A79 -M2104 A1193 -M2105 A318 -M2107 A1032 -M2109 A965 -M2110 A406 -M2111 A1294 -M2113 A1094 -M2115 A141 -M2118 A290 -M2122 A163 -M2124 A40 -M2127 A320 -M2128 A782 -M2129 A237 -M2133 A746 -M2134 A22 -M2137 A123 -M2138 A894 -M2139 A1351 -M2151 A432 -M2152 A1006 -M2153 A1033 -M2156 A1282 -M2160 A128 -M2164 A608 -M2165 A446 -M2166 A449 -M2168 A521 -M2170 A415 -M2171 A838 -M2174 A366 -M2176 A171 -M2177 A27 -M2181 A445 -M2184 A1340 -M2192 A483 -M2193 A353 -M2195 A72 -M2199 A423 -M2205 A1226 -M2207 A746 -M2209 A1229 -M2210 A563 -M2212 A334 -M2221 A150 -M2222 A102 -M2223 A1111 -M2225 A342 -M2227 A1108 -M2230 A616 -M2231 A1051 -M2232 A402 -M2237 A45 -M2238 A666 -M2240 A261 -M2244 A356 -M2245 A1226 -M2248 A545 -M2249 A864 -M2250 A1327 -M2251 A524 -M2253 A732 -M2255 A319 -M2260 A1165 -M2262 A589 -M2263 A392 -M2268 A1301 -M2270 A283 -M2274 A151 -M2275 A513 -M2276 A7 -M2278 A575 -M2279 A745 -M2282 A632 -M2284 A1342 -M2286 A958 -M2287 A497 -M2289 A1140 -M2292 A22 -M2293 A424 -M2294 A179 -M2297 A1135 -M2298 A1119 -M2307 A84 -M2308 A1202 -M2310 A113 -M2311 A1338 -M2312 A232 -M2314 A297 -M2315 A1165 -M2316 A1315 -M2317 A827 -M2321 A989 -M2323 A191 -M2326 A1165 -M2328 A1344 -M2329 A582 -M2331 A1084 -M2337 A1394 -M2344 A627 -M2352 A326 -M2356 A472 -M2358 A361 -M2361 A335 -M2364 A521 -M2369 A413 -M2372 A440 -M2375 A1139 -M2377 A1142 -M2380 A736 -M2383 A942 -M2389 A361 -M2391 A1301 -M2392 A1144 -M2393 A1081 -M2395 A1298 -M2396 A911 -M2399 A129 -M2401 A481 -M2402 A978 -M2403 A344 -M2406 A1386 -M2409 A126 -M2411 A682 -M2413 A1153 -M2414 A1002 -M2418 A1131 -M2420 A1336 -M2421 A703 -M2425 A629 -M2428 A1297 -M2429 A1289 -M2430 A313 -M2434 A795 -M2435 A1036 -M2436 A869 -M2437 A483 -M2439 A296 -M2442 A1349 -M2448 A163 -M2449 A968 -M2450 A606 -M2451 A515 -M2452 A1111 -M2454 A416 -M2457 A948 -M2463 A1167 -M2465 A1391 -M2470 A295 -M2473 A353 -M2474 A529 -M2475 A672 -M2476 A502 -M2481 A332 -M2486 A568 -M2488 A314 -M2489 A248 -M2490 A579 -M2491 A1030 -M2492 A1020 -M2493 A345 -M2495 A841 -M2496 A1130 -M2498 A835 -M2499 A674 -M2502 A410 -M2503 A776 -M2508 A1028 -M2509 A225 -M2510 A603 -M2513 A553 -M2517 A520 -M2520 A253 -M2521 A88 -M2535 A1111 -M2538 A806 -M2539 A523 -M2542 A837 -M2543 A835 -M2547 A651 -M2548 A926 -M2553 A1014 -M2556 A1309 -M2558 A125 -M2560 A204 -M2562 A445 -M2567 A96 -M2568 A129 -M2571 A1031 -M2572 A897 -M2577 A1093 -M2579 A137 -M2583 A1077 -M2584 A534 -M2590 A1153 -M2592 A990 -M2601 A1339 -M2602 A319 -M2603 A830 -M2607 A1322 -M2611 A545 -M2613 A597 -M2615 A215 -M2616 A1307 -M2617 A247 -M2619 A1020 -M2620 A1268 -M2624 A435 -M2625 A770 -M2627 A872 -M2628 A790 -M2629 A1011 -M2630 A1371 -M2632 A1270 -M2634 A740 -M2636 A937 -M2638 A422 -M2639 A1048 -M2641 A169 -M2642 A312 -M2644 A25 -M2645 A1395 -M2646 A50 -M2648 A45 -M2650 A82 -M2652 A1081 -M2659 A468 -M2663 A693 -M2664 A860 -M2666 A696 -M2669 A711 -M2675 A711 -M2678 A907 -M2680 A872 -M2681 A1333 -M2682 A402 -M2689 A757 -M2691 A635 -M2692 A975 -M2695 A667 -M2698 A1184 -M2700 A1213 -M2701 A819 -M2703 A1345 -M2704 A811 -M2706 A1074 -M2709 A970 -M2714 A54 -M2716 A599 -M2718 A1136 -M2721 A32 -M2723 A1346 -M2725 A832 -M2726 A1352 -M2731 A91 -M2736 A1093 -M2738 A16 -M2741 A1053 -M2755 A1116 -M2757 A450 -M2760 A1008 -M2763 A1356 -M2764 A1097 -M2770 A424 -M2772 A362 -M2773 A692 -M2776 A627 -M2777 A393 -M2778 A280 -M2780 A563 -M2786 A1197 -M2787 A694 -M2788 A563 -M2789 A1056 -M2790 A10 -M2793 A1328 -M2794 A1273 -M2795 A167 -M2796 A1217 -M2798 A790 -M2803 A725 -M2809 A22 -M2818 A20 -M2819 A243 -M2823 A1267 -M2826 A1036 -M2827 A455 -M2829 A100 -M2833 A575 -M2835 A296 -M2836 A1376 -M2837 A935 -M2840 A294 -M2844 A1292 -M2845 A1388 -M2851 A391 -M2852 A461 -M2857 A298 -M2859 A1273 -M2860 A1253 -M2864 A689 -M2865 A149 -M2868 A799 -M2869 A762 -M2876 A1240 -M2877 A139 -M2878 A204 -M2882 A1092 -M2883 A1130 -M2886 A237 -M2887 A291 -M2888 A279 -M2891 A30 -M2896 A502 -M2898 A313 -M2902 A1081 -M2905 A554 -M2908 A1258 -M2910 A759 -M2915 A934 -M2917 A940 -M2918 A987 -M2921 A586 -M2922 A1135 -M2923 A1244 -M2924 A727 -M2926 A862 -M2929 A1308 -M2930 A326 -M2931 A1123 -M2934 A1262 -M2938 A1290 -M2939 A236 -M2942 A1173 -M2944 A253 -M2945 A1041 -M2948 A1082 -M2949 A1203 -M2954 A1153 -M2955 A319 -M2959 A886 -M2961 A32 -M2962 A1267 -M2963 A449 -M2965 A568 -M2966 A114 -M2967 A160 -M2969 A1111 -M2971 A1232 -M2979 A958 -M2980 A1381 -M2982 A47 -M2984 A1082 -M2995 A345 -M2997 A1194 -M2998 A972 -M3001 A1315 -M3002 A616 -M3003 A176 -M3004 A972 -M3008 A134 -M3010 A824 -M3017 A448 -M3024 A1262 -M3026 A611 -M3028 A1211 -M3030 A128 -M3031 A755 -M3035 A1341 -M3036 A41 -M3039 A67 -M3041 A1231 -M3042 A624 -M3044 A845 -M3045 A174 -M3046 A198 -M3050 A180 -M3054 A1171 -M3055 A847 -M3056 A1299 -M3058 A744 -M3060 A894 -M3061 A1260 -M3062 A723 -M3064 A1081 -M3067 A396 -M3069 A703 -M3070 A407 -M3076 A941 -M3080 A139 -M3089 A677 -M3091 A71 -M3092 A1052 -M3095 A477 -M3096 A4 -M3098 A1016 -M3099 A312 -M3100 A404 -M3102 A195 -M3103 A365 -M3108 A137 -M3111 A270 -M3113 A1366 -M3116 A285 -M3117 A448 -M3118 A110 -M3119 A115 -M3120 A931 -M3123 A8 -M3124 A177 -M3125 A819 -M3130 A244 -M3132 A1303 -M3135 A884 -M3138 A1387 -M3139 A1000 -M3140 A415 -M3143 A1271 -M3148 A902 -M3150 A176 -M3155 A458 -M3156 A237 -M3158 A1217 -M3160 A1319 -M3161 A324 -M3163 A1296 -M3164 A142 -M3165 A43 -M3166 A845 -M3170 A754 -M3173 A1078 -M3175 A1218 -M3179 A1085 -M3188 A270 -M3193 A1370 -M3196 A992 -M3198 A445 -M3200 A1220 -M3203 A1077 -M3205 A1213 -M3206 A501 -M3209 A647 -M3212 A472 -M3213 A886 -M3228 A153 -M3233 A392 -M3241 A32 -M3249 A1322 -M3256 A889 -M3258 A509 -M3262 A1055 -M3267 A24 -M3270 A374 -M3271 A795 -M3274 A1352 -M3281 A668 -M3284 A312 -M3287 A152 -M3290 A1344 -M3294 A1261 -M3300 A160 -M3302 A1228 -M3306 A47 -M3307 A35 -M3317 A1063 -M3331 A1145 -M3345 A487 -M3351 A198 -M3353 A1014 -M3355 A447 -M3358 A1030 -M3366 A1217 -M3368 A851 -M3370 A1362 -M3374 A1364 -M3380 A1102 -M3382 A1159 -M3384 A1154 -M3386 A958 -M3390 A522 -M3391 A684 -M3392 A354 -M3393 A854 -M3394 A1027 -M3404 A1259 -M3414 A938 -M3417 A407 -M3421 A1006 -M3424 A448 -M3435 A865 -M3444 A134 -M3447 A958 -M3448 A689 -M3452 A1370 -M3457 A526 -M3461 A762 -M3463 A560 -M3466 A935 -M3468 A588 -M3470 A550 -M3475 A302 -M3476 A491 -M3477 A978 -M3479 A1382 -M3480 A291 -M3483 A1055 -M3484 A1386 -M3488 A184 -M3489 A926 -M3492 A1022 -M3493 A1105 -M3498 A487 -M3502 A673 -M3503 A496 -M3510 A496 -M3511 A449 -M3512 A268 -M3514 A249 -M3515 A55 -M3530 A731 -M3531 A136 -M3537 A283 -M3542 A981 -M3560 A314 -M3566 A1347 -M3569 A819 -M3570 A1155 -M3574 A100 -M3580 A397 -M3581 A1088 -M3582 A480 -M3586 A1324 -M3587 A686 -M3589 A1152 -M3591 A41 -M3592 A164 -M3597 A971 -M3599 A145 -M3603 A27 -M3618 A880 -M3619 A810 -M3621 A1389 -M3624 A1261 -M3627 A1100 -M3641 A929 -M3647 A1155 -M3649 A981 -M3654 A992 -M3662 A496 -M3663 A479 -M3668 A488 -M3669 A1220 -M3674 A1173 -M3675 A22 -M3680 A969 -M3681 A397 -M3696 A71 -M3697 A720 -M3699 A128 -M3704 A1217 -M3709 A76 -M3713 A500 -M3714 A373 -M3726 A208 -M3729 A1081 -M3732 A26 -M3733 A499 -M3734 A459 -M3741 A757 -M3746 A361 -M3751 A602 -M3762 A1094 -M3768 A913 -M3779 A1144 -M3788 A1084 -M3805 A817 -M3811 A267 -M3814 A1327 -M3817 A987 -M3821 A1311 -M3824 A475 -M3830 A897 -M3841 A669 -M3843 A74 -M3844 A984 -M3846 A781 -M3858 A1352 -M3867 A1069 -M3869 A213 -M3879 A258 -M3884 A767 -M3889 A1184 -M3891 A402 -M3894 A64 -M3907 A407 -M3908 A893 -M3910 A18 -M3911 A673 -M3913 A904 -M3918 A958 -M3921 A701 -M3925 A32 -M3928 A951 -M3929 A1010 -M3936 A64 -M3942 A776 -M3947 A402 -M3952 A1082 -M3955 A1295 -M3956 A798 -M3967 A597 -M3969 A952 -M3970 A1005 -M3980 A555 -M3981 A20 -M3987 A239 -M3988 A927 -M3994 A786 -M4009 A784 -M4011 A193 -M4023 A1134 -M4025 A1124 -M4035 A189 -M4046 A1070 -M4047 A668 -M4049 A1005 -M4050 A832 -M4053 A1176 -M4054 A152 -M4055 A998 -M4057 A763 -M4058 A362 -M4059 A1343 -M4063 A899 -M4066 A25 -M4068 A192 -M4077 A24 -M4085 A157 -M4097 A921 -M4102 A847 -M4112 A733 -M4124 A618 -M4128 A243 -M4132 A565 -M4137 A254 -M4141 A182 -M4145 A1005 -M4150 A125 -M4158 A830 -M4165 A837 -M4168 A537 -M4171 A74 -M4173 A740 -M4180 A1203 -M4182 A1395 -M4183 A1 -M4202 A752 -M4212 A190 -M4216 A774 -M4222 A905 -M4223 A161 -M4230 A1136 -M4231 A877 -M4239 A262 -M4247 A668 -M4252 A1077 -M4256 A668 -M4268 A536 -M4277 A342 -M4279 A312 -M4282 A416 -M4290 A291 -M4293 A280 -M4303 A387 -M4313 A511 -M4331 A995 -M4344 A813 -M4350 A343 -M4357 A163 -M4379 A792 -M4381 A829 -M4387 A738 -M4401 A1146 -M4404 A1005 -M4411 A1379 -M4421 A943 -M4437 A69 -M4446 A1047 -M4458 A500 -M4462 A854 -M4466 A1378 -M4485 A720 -M4486 A1030 -M4490 A1320 -M4491 A50 -M4492 A1249 -M4493 A216 -M4494 A841 -M4496 A511 -M4530 A1386 -M4532 A1336 -M4535 A1181 -M4536 A1255 -M4537 A668 -M4543 A1308 -M4556 A45 -M4557 A560 -M4564 A1174 -M4569 A1042 -M4573 A1231 -M4575 A341 -M4577 A1136 -M4584 A891 -M4594 A1255 -M4599 A280 -M4604 A825 -M4631 A534 -M4636 A507 -M4638 A174 -M4643 A463 -M4649 A1270 -M4650 A1099 -M4667 A479 -M4677 A84 -M4679 A596 -M4690 A893 -M4694 A901 -M4695 A323 -M4730 A1344 -M4739 A813 -M4741 A1118 -M4744 A1273 -M4752 A824 -M4761 A1297 -M4765 A919 -M4778 A910 -M4791 A813 -M4821 A1020 -M4822 A206 -M4827 A765 -M4830 A502 -M4842 A1195 -M4852 A397 -M4863 A1288 -M4927 A161 -M4930 A231 -M4942 A1081 -M4949 A801 -M4950 A801 -M4960 A607 -M4979 A1285 -M5014 A1250 diff --git a/gammagl/datasets/acm4dhn.py b/gammagl/datasets/acm4dhn.py new file mode 100644 index 00000000..e69de29b diff --git a/gammagl/models/dhn.py b/gammagl/models/dhn.py new file mode 100644 index 00000000..e69de29b diff --git a/gammagl/utils/simple_path.py b/gammagl/utils/simple_path.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/utils/test_find_all_simple_paths.py b/tests/utils/test_find_all_simple_paths.py new file mode 100644 index 00000000..e69de29b From ec1e5f1771df92d366745827ea2bdc0cbaf6f00b Mon Sep 17 00:00:00 2001 From: liberty <2700472871@qq.com> Date: Mon, 1 Jul 2024 21:11:10 +0800 Subject: [PATCH 4/8] Add dataset and test code --- docs/source/api/gammagl.utils.rst | 3 +- examples/dhn/dhn_trainer.py | 119 +++++----------------- gammagl/datasets/__init__.py | 4 +- gammagl/datasets/acm4dhn.py | 83 +++++++++++++++ gammagl/layers/conv/__init__.py | 5 +- gammagl/layers/conv/dhn_conv.py | 69 +++++-------- gammagl/models/__init__.py | 8 +- gammagl/models/dhn.py | 27 +++++ gammagl/utils/__init__.py | 5 +- gammagl/utils/simple_path.py | 50 +++++++++ tests/utils/test_find_all_simple_paths.py | 23 +++++ 11 files changed, 251 insertions(+), 145 deletions(-) diff --git a/docs/source/api/gammagl.utils.rst b/docs/source/api/gammagl.utils.rst index 9f988f14..185e93d7 100644 --- a/docs/source/api/gammagl.utils.rst +++ b/docs/source/api/gammagl.utils.rst @@ -27,4 +27,5 @@ gammagl.utils gammagl.utils.to_scipy_sparse_matrix gammagl.utils.read_embeddings gammagl.utils.homophily - gammagl.utils.get_train_val_test_split \ No newline at end of file + gammagl.utils.get_train_val_test_split + gammagl.utils.find_all_simple_paths \ No newline at end of file diff --git a/examples/dhn/dhn_trainer.py b/examples/dhn/dhn_trainer.py index d0cb1ee2..c62417b1 100644 --- a/examples/dhn/dhn_trainer.py +++ b/examples/dhn/dhn_trainer.py @@ -5,98 +5,30 @@ from tensorlayerx.model import TrainOneStep from sklearn.metrics import roc_auc_score -from gammagl.data import HeteroGraph -from gammagl.layers.conv.dhn_conv import DHNModel, NODE_TYPE, K_HOP, NUM_FEA, NUM_NEIGHBOR, BATCH_SIZE, type2idx -from gammagl.utils import k_hop_subgraph +from gammagl.models import DHNModel +from gammagl.datasets import ACM4DHN +from gammagl.utils import k_hop_subgraph,find_all_simple_paths # The UserWarning is ignored globally import warnings -warnings.filterwarnings("ignore", category=UserWarning) - -random.seed(0) - -G = HeteroGraph() - - -def load_ACM(test_ratio=0.2): - edge_index_M = [] - edge_index_A = [] - - with open(args.dataset_path, 'r') as f: - for line in f.readlines(): - src, dst = line.strip().split() - src_type, src_id = src[0], src[1:] # Resolves the source node type and ID - dst_type, dst_id = dst[0], dst[1:] # Resolve the target node type and ID - - # Convert the node ID to an integer index and place it in a list - if src[0] == 'M': - edge_index_M.append(int(src_id)) - elif src[0] == 'A': - edge_index_A.append(-int(src_id) - 1) - - if dst[0] == 'M': - edge_index_M.append(int(dst_id)) - elif dst[0] == 'A': - edge_index_A.append(-int(dst_id) - 1) - - edge_index = tlx.convert_to_tensor([edge_index_M, edge_index_A]) - G['M', 'MA', 'A'].edge_index = edge_index - - # Computed split point - sp = 1 - test_ratio * 2 - num_edge = len(edge_index_M) - sp1 = int(num_edge * sp) - sp2 = int(num_edge * test_ratio) - - G_train = HeteroGraph() - G_val = HeteroGraph() - G_test = HeteroGraph() +type2idx = { + 'M': 0, + 'A': 1, + # 'C': 2, + # 'T': 3 +} - # Divide the training set, the verification set, and the test set - G_train['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[:sp1], edge_index_A[:sp1]]) - G_val['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1:sp1 + sp2], edge_index_A[sp1:sp1 + sp2]]) - G_test['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1 + sp2:], edge_index_A[sp1 + sp2:]]) +NODE_TYPE = len(type2idx) +K_HOP = 2 - print( - f"all edge: {len(G['M', 'MA', 'A'].edge_index[0])}, train edge: {len(G_train['M', 'MA', 'A'].edge_index[0])}, val edge: {len(G_val['M', 'MA', 'A'].edge_index[0])}, test edge: {len(G_test['M', 'MA', 'A'].edge_index[0])}") +NUM_FEA = (K_HOP + 2) * 4 + NODE_TYPE +NUM_NEIGHBOR = 5 +BATCH_SIZE=32 - return G_train, G_val, G_test - - -def find_all_simple_paths(edge_index, src, dest, max_length): - # Converts edge_index to an adjacency list representation - num_nodes = max(edge_index[0].max().item(), - edge_index[1].max().item(), - -edge_index[0].min().item(), - -edge_index[1].min().item(), - abs(src.item())) + 1 - adj_list = [[] for _ in range(num_nodes)] - for u, v in zip(edge_index[0].tolist(), edge_index[1].tolist()): - adj_list[u].append(v) - - src = src.item() - - paths = [] - visited = set() - stack = [(src, [src])] - - while stack: - (node, path) = stack.pop() - - if node == dest: - paths.append(path) - elif len(path) < max_length: - for neighbor in adj_list[node]: - if neighbor not in path: - visited.add((node, neighbor)) - stack.append((neighbor, path + [neighbor])) - for neighbor in adj_list[node]: - if (node, neighbor) in visited: - visited.remove((node, neighbor)) - - return paths +warnings.filterwarnings("ignore", category=UserWarning) +tlx.set_seed(10) def dist_encoder(src, dest, G, K_HOP): if (G.size(1) == 0): @@ -318,10 +250,16 @@ def result(self): def main(args): if str.lower(args.dataset) not in ['acm']: raise ValueError('Unknown dataset: {}'.format(args.dataset)) - if str.lower(args.dataset) == 'acm': - G_train, G_val, G_test = load_ACM(test_ratio=args.test_ratio) + if str.lower(args.dataset)=='acm': + data = ACM4DHN(args.dataset_path) + + graph=data[0] + + G_train=graph['train'] + G_val=graph['val'] + G_test=graph['test'] - m = DHNModel() + m = DHNModel(NUM_FEA,BATCH_SIZE,NUM_NEIGHBOR) optim = tlx.optimizers.Adam(lr=args.lr, weight_decay=args.drop_rate) train_weights = m.trainable_weights @@ -375,13 +313,12 @@ def main(args): if __name__ == '__main__': # parameters setting parser = argparse.ArgumentParser() - parser.add_argument("--test_ratio", type=float, default=0.3, help="ratio of dividing the data set") - parser.add_argument("--one_hot", type=bool, default=True, help="use one-hot encoding") + parser.add_argument("--one_hot",type=bool,default=True,help="use one-hot encoding") parser.add_argument("--lr", type=float, default=0.001, help="learnin rate") parser.add_argument("--n_epoch", type=int, default=100, help="number of epoch") parser.add_argument("--drop_rate", type=float, default=0.01, help="drop_rate") parser.add_argument('--dataset', type=str, default='acm', help='dataset') - parser.add_argument("--dataset_path", type=str, default=r"MA.txt") + parser.add_argument("--dataset_path", type = str, default = r"",help='dataset_path') args = parser.parse_args() - main(args) + main(args) \ No newline at end of file diff --git a/gammagl/datasets/__init__.py b/gammagl/datasets/__init__.py index 2dc598bb..4b0744b3 100644 --- a/gammagl/datasets/__init__.py +++ b/gammagl/datasets/__init__.py @@ -22,6 +22,7 @@ from .molecule_net import MoleculeNet from .acm4heco import ACM4HeCo from .yelp import Yelp +from .acm4dhn import ACM4DHN __all__ = [ 'ACM4HeCo', @@ -46,7 +47,8 @@ 'WikiCS', 'MoleculeNet', 'NGSIM_US_101', - 'Yelp' + 'Yelp', + 'ACM4DHN' ] classes = __all__ diff --git a/gammagl/datasets/acm4dhn.py b/gammagl/datasets/acm4dhn.py index e69de29b..b65d2010 100644 --- a/gammagl/datasets/acm4dhn.py +++ b/gammagl/datasets/acm4dhn.py @@ -0,0 +1,83 @@ +import os.path as osp +import tensorlayerx as tlx +from gammagl.data import download_url, InMemoryDataset, HeteroGraph +from typing import Callable, List, Optional + + +class ACM4DHN(InMemoryDataset): + url = 'https://raw.githubusercontent.com/BUPT-GAMMA/HDE/main/ds/imdb' + test_ratio = 0.3 + + def __init__(self, root: Optional[str] = None, transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, pre_filter: Optional[Callable] = None, + force_reload: bool = False): + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.data, self.slices = self.load_data(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'MA.txt' + ] + + @property + def processed_file_names(self) -> str: + return tlx.BACKEND + '_data.pt' + + def download(self): + for i in range(0, len(self.raw_file_names)): + download_url(f'{self.url}/{self.raw_file_names[i]}', self.raw_dir) + + def process(self): + G = HeteroGraph() + edge_index_M = [] + edge_index_A = [] + + path = osp.join(self.raw_dir, 'MA.txt') + + with open(path, 'r') as f: + for line in f.readlines(): + src, dst = line.strip().split() + src_type, src_id = src[0], src[1:] # Resolves the source node type and ID + dst_type, dst_id = dst[0], dst[1:] # Resolve the target node type and ID + + # Convert the node ID to an integer index and place it in a list + if src[0] == 'M': + edge_index_M.append(int(src_id)) + elif src[0] == 'A': + edge_index_A.append(-int(src_id) - 1) + + if dst[0] == 'M': + edge_index_M.append(int(dst_id)) + elif dst[0] == 'A': + edge_index_A.append(-int(dst_id) - 1) + + edge_index = tlx.convert_to_tensor([edge_index_M, edge_index_A]) + G['M', 'MA', 'A'].edge_index = edge_index + + # Computed split point + sp = 1 - self.test_ratio * 2 + num_edge = len(edge_index_M) + sp1 = int(num_edge * sp) + sp2 = int(num_edge * self.test_ratio) + + G_train = HeteroGraph() + G_val = HeteroGraph() + G_test = HeteroGraph() + + # Divide the training set, the verification set, and the test set + G_train['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[:sp1], edge_index_A[:sp1]]) + G_val['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor( + [edge_index_M[sp1:sp1 + sp2], edge_index_A[sp1:sp1 + sp2]]) + G_test['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1 + sp2:], edge_index_A[sp1 + sp2:]]) + + print( + f"all edge: {len(G['M', 'MA', 'A'].edge_index[0])}, train edge: {len(G_train['M', 'MA', 'A'].edge_index[0])}, val edge: {len(G_val['M', 'MA', 'A'].edge_index[0])}, test edge: {len(G_test['M', 'MA', 'A'].edge_index[0])}") + + G['train'] = G_train # training set + G['val'] = G_val # valuation set + G['test'] = G_test # testing set + + if self.pre_transform is not None: + G = self.pre_transform(G) + self.save_data(self.collate([G]), self.processed_paths[0]) diff --git a/gammagl/layers/conv/__init__.py b/gammagl/layers/conv/__init__.py index 0162a6cb..3ba78108 100644 --- a/gammagl/layers/conv/__init__.py +++ b/gammagl/layers/conv/__init__.py @@ -33,6 +33,8 @@ from .magcl_conv import MAGCLConv from .fusedgat_conv import FusedGATConv from .hid_conv import Hid_conv +from .dhn_conv import DHNConv + __all__ = [ 'MessagePassing', 'GCNConv', @@ -68,7 +70,8 @@ 'MAGCLConv', 'FusedGATConv', 'Hid_conv', - 'HEATlayer' + 'HEATlayer', + 'DHNConv' ] classes = __all__ diff --git a/gammagl/layers/conv/dhn_conv.py b/gammagl/layers/conv/dhn_conv.py index dc651a6a..be994c0c 100644 --- a/gammagl/layers/conv/dhn_conv.py +++ b/gammagl/layers/conv/dhn_conv.py @@ -1,43 +1,38 @@ import tensorlayerx as tlx from gammagl.layers.conv import MessagePassing -type2idx = { - 'M': 0, - 'A': 1, - # 'C': 2, - # 'T': 3 -} - -NODE_TYPE = len(type2idx) -K_HOP = 2 - -NUM_FEA = (K_HOP + 2) * 4 + NODE_TYPE -NUM_NEIGHBOR = 5 -BATCH_SIZE=32 - class DHNConv(MessagePassing): - def __init__(self): + def __init__(self, + num_fea, + batch_size, + num_neighbor): super().__init__() - self.lin1 = tlx.nn.Linear(in_features=2*NUM_FEA, out_features=2*BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") - self.lin2 = tlx.nn.Linear(in_features=2*BATCH_SIZE+NUM_FEA, out_features=2*BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") - self.lin3 = tlx.nn.Linear(in_features=2*BATCH_SIZE, out_features=2*BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") + self.num_fea = num_fea + self.batch_size = batch_size + self.num_neighbor = num_neighbor + self.lin1 = tlx.nn.Linear(in_features=2 * num_fea, out_features=2 * batch_size, act=tlx.nn.ELU(), + W_init="xavier_uniform") + self.lin2 = tlx.nn.Linear(in_features=2 * batch_size + num_fea, out_features=2 * batch_size, act=tlx.nn.ELU(), + W_init="xavier_uniform") + self.lin3 = tlx.nn.Linear(in_features=2 * batch_size, out_features=2 * batch_size, act=tlx.nn.ELU(), + W_init="xavier_uniform") def aggregate(self, msg, edge_index, num_nodes=None, aggr=None): - if len(msg.shape)==4: + if len(msg.shape) == 4: return tlx.reduce_mean(msg, axis=2) - elif len(msg.shape)==3: + elif len(msg.shape) == 3: return tlx.reduce_mean(msg, axis=1) def forward(self, fea): - node = tlx.convert_to_tensor(fea[:, :NUM_FEA]) + node = tlx.convert_to_tensor(fea[:, :self.num_fea]) # Extract neigh1 and neigh2 - neigh1 = tlx.convert_to_tensor(fea[:, NUM_FEA:NUM_FEA * (NUM_NEIGHBOR + 1)]) - neigh1 = tlx.reshape(neigh1, [-1, NUM_NEIGHBOR, NUM_FEA]) + neigh1 = tlx.convert_to_tensor(fea[:, self.num_fea:self.num_fea * (self.num_neighbor + 1)]) + neigh1 = tlx.reshape(neigh1, [-1, self.num_neighbor, self.num_fea]) - neigh2 = tlx.convert_to_tensor(fea[:, NUM_FEA * (NUM_NEIGHBOR + 1):]) - neigh2 = tlx.reshape(neigh2, [-1, NUM_NEIGHBOR, NUM_NEIGHBOR, NUM_FEA]) + neigh2 = tlx.convert_to_tensor(fea[:, self.num_fea * (self.num_neighbor + 1):]) + neigh2 = tlx.reshape(neigh2, [-1, self.num_neighbor, self.num_neighbor, self.num_fea]) # aggregate on neigh2 neigh2_agg = self.propagate(edge_index=None, x=neigh2) @@ -49,15 +44,15 @@ def forward(self, fea): ) # transform into a two-dimensional tensor - flattened_tmp = tmp.view(2*BATCH_SIZE * NUM_NEIGHBOR, 2*NUM_FEA) + flattened_tmp = tmp.view(2 * self.batch_size * self.num_neighbor, 2 * self.num_fea) flattened_output = self.lin1(flattened_tmp) # Reshape the output tensor to a three-dimensional shape - tmp = flattened_output.view(2*BATCH_SIZE, NUM_NEIGHBOR, 2*BATCH_SIZE) + tmp = flattened_output.view(2 * self.batch_size, self.num_neighbor, 2 * self.batch_size) # Aggregate node and tmp emb = tlx.concat( [ - node, self.propagate(edge_index=None,x=tmp) + node, self.propagate(edge_index=None, x=tmp) ], axis=1 ) @@ -70,21 +65,3 @@ def forward(self, fea): def message(self, x, edge_index, edge_weight=None): return x - - -class DHNModel(tlx.nn.Module): - def __init__(self): - super().__init__() - self.dhn1 = DHNConv() - self.dhn2 = DHNConv() - self.lin1 = tlx.nn.Linear(in_features=4*BATCH_SIZE, out_features=BATCH_SIZE, act=tlx.nn.ELU(), W_init="xavier_uniform") - self.lin2 = tlx.nn.Linear(in_features=BATCH_SIZE, out_features=1, act=tlx.nn.ELU(), W_init="xavier_uniform") - - def forward(self, n1, n2, label): - n1_emb = self.dhn1(n1) - n2_emb = self.dhn2(n2) - - pred = self.lin1(tlx.concat([n1_emb, n2_emb], axis=1)) - pred = self.lin2(pred) - - return pred diff --git a/gammagl/models/__init__.py b/gammagl/models/__init__.py index c08b85c0..e6c925be 100644 --- a/gammagl/models/__init__.py +++ b/gammagl/models/__init__.py @@ -57,6 +57,7 @@ from .fusedgat import FusedGATModel from .hid_net import Hid_net from .gnnlfhf import GNNLFHFModel +from .dhn import DHNModel __all__ = [ 'HeCo', @@ -105,8 +106,8 @@ 'MetaPath2Vec' 'ieHGCNModel', 'TADWModel', - 'MGNNI_m_MLP', - 'MGNNI_m_att', + 'MGNNI_m_MLP', + 'MGNNI_m_att', 'NewGrace', 'CAGCNModel', 'CoGSLModel', @@ -117,7 +118,8 @@ 'FusedGATModel', 'hid_net', 'HEAT', - 'GNNLFHFModel' + 'GNNLFHFModel', + 'DHNModel' ] classes = __all__ diff --git a/gammagl/models/dhn.py b/gammagl/models/dhn.py index e69de29b..2b717a17 100644 --- a/gammagl/models/dhn.py +++ b/gammagl/models/dhn.py @@ -0,0 +1,27 @@ +import tensorlayerx as tlx +from gammagl.layers.conv import DHNConv + + +class DHNModel(tlx.nn.Module): + def __init__(self, + num_fea, + batch_size, + num_neighbor): + super().__init__() + self.num_fea = num_fea + self.batch_size = batch_size + self.num_neighbor = num_neighbor + self.dhn1 = DHNConv(num_fea, batch_size, num_neighbor) + self.dhn2 = DHNConv(num_fea, batch_size, num_neighbor) + self.lin1 = tlx.nn.Linear(in_features=4 * batch_size, out_features=batch_size, act=tlx.nn.ELU(), + W_init="xavier_uniform") + self.lin2 = tlx.nn.Linear(in_features=batch_size, out_features=1, act=tlx.nn.ELU(), W_init="xavier_uniform") + + def forward(self, n1, n2, label): + n1_emb = self.dhn1(n1) + n2_emb = self.dhn2(n2) + + pred = self.lin1(tlx.concat([n1_emb, n2_emb], axis=1)) + pred = self.lin2(pred) + + return pred diff --git a/gammagl/utils/__init__.py b/gammagl/utils/__init__.py index f57d8d09..ea3f5571 100644 --- a/gammagl/utils/__init__.py +++ b/gammagl/utils/__init__.py @@ -20,6 +20,7 @@ from .shortest_path import shortest_path_distance, batched_shortest_path_distance from .get_split import get_train_val_test_split from .get_laplacian import get_laplacian +from .simple_path import find_all_simple_paths __all__ = [ 'calc_A_norm_hat', @@ -46,8 +47,8 @@ 'shortest_path_distance', 'batched_shortest_path_distance', 'get_train_val_test_split', - 'get_laplacian' - + 'get_laplacian', + 'find_all_simple_paths' ] classes = __all__ diff --git a/gammagl/utils/simple_path.py b/gammagl/utils/simple_path.py index e69de29b..ee78af47 100644 --- a/gammagl/utils/simple_path.py +++ b/gammagl/utils/simple_path.py @@ -0,0 +1,50 @@ +def find_all_simple_paths(edge_index, src, dest, max_length): + r""" + The :obj:`find_all_simple_paths` function is used to find all simple paths (that is, paths that do not duplicate nodes) from the source node to the destination node in a given graph. The function accepts as parameters the edge index of the graph, the maximum length of the source node, the target node, and the path, and returns a list of all simple paths from the source node to the target node that do not exceed the maximum length. + + Parameters + ---------- + edge_index: tensor + A 2-D Tensor of the edge index of a graph with the shape [2, num_edges]. Each column contains two end-point indexes for one side. + src: tensor + The index of the source node. + dest: tensor + The index of the target node. + max_length: int + The maximum length of a path. + + Return + ------- + list[list[int]] + A list of all the simple paths from the source node to the destination node. + """ + num_nodes = max(edge_index[0].max().item(), + edge_index[1].max().item(), + -edge_index[0].min().item(), + -edge_index[1].min().item(), + abs(src.item())) + 1 + adj_list = [[] for _ in range(num_nodes)] + for u, v in zip(edge_index[0].tolist(), edge_index[1].tolist()): + adj_list[u].append(v) + + src = src.item() + + paths = [] + visited = set() + stack = [(src, [src])] + + while stack: + (node, path) = stack.pop() + + if node == dest: + paths.append(path) + elif len(path) < max_length: + for neighbor in adj_list[node]: + if neighbor not in path: + visited.add((node, neighbor)) + stack.append((neighbor, path + [neighbor])) + for neighbor in adj_list[node]: + if (node, neighbor) in visited: + visited.remove((node, neighbor)) + + return paths diff --git a/tests/utils/test_find_all_simple_paths.py b/tests/utils/test_find_all_simple_paths.py index e69de29b..d39b872a 100644 --- a/tests/utils/test_find_all_simple_paths.py +++ b/tests/utils/test_find_all_simple_paths.py @@ -0,0 +1,23 @@ +import tensorlayerx as tlx +from gammagl.utils.simple_path import find_all_simple_paths + +def test_find_all_simple_paths(): + edge_index = tlx.convert_to_tensor([[0, 0, 1, 1, 2], [1, 2, 0, 3, 1]], dtype=tlx.int64) + src = tlx.convert_to_tensor([0], dtype=tlx.int64) + dest = tlx.convert_to_tensor([3], dtype=tlx.int64) + expected_paths = [[0, 1, 3], [0, 2, 1, 3]] + paths = find_all_simple_paths(edge_index, src, dest, max_length=4) + assert sorted(map(tuple, paths))==sorted(map(tuple, expected_paths)) + + # no path + src = tlx.convert_to_tensor([0], dtype=tlx.int64) + dest = tlx.convert_to_tensor([4], dtype=tlx.int64) + expected_paths = [] + paths = find_all_simple_paths(edge_index, src, dest, max_length=4) + assert sorted(map(tuple, paths)) == sorted(map(tuple, expected_paths)) + + # same start and end point + dest = tlx.convert_to_tensor([0], dtype=tlx.int64) + expected_paths = [[0]] + paths = find_all_simple_paths(edge_index, src, dest, max_length=1) + assert sorted(map(tuple, paths))==sorted(map(tuple, expected_paths)) \ No newline at end of file From 15e426534a951b5185a7b52a2f0ff34a6cc73360 Mon Sep 17 00:00:00 2001 From: liberty <2700472871@qq.com> Date: Tue, 2 Jul 2024 15:50:14 +0800 Subject: [PATCH 5/8] modify the code and add test code --- examples/dhn/README.md | 17 +++++++ examples/dhn/dhn_trainer.py | 92 ++++++++++++++++++---------------- gammagl/datasets/acm4dhn.py | 4 +- tests/datasets/test_acm4dhn.py | 15 ++++++ 4 files changed, 82 insertions(+), 46 deletions(-) create mode 100644 examples/dhn/README.md create mode 100644 tests/datasets/test_acm4dhn.py diff --git a/examples/dhn/README.md b/examples/dhn/README.md new file mode 100644 index 00000000..a365ebeb --- /dev/null +++ b/examples/dhn/README.md @@ -0,0 +1,17 @@ +# Distance encoding based Heterogeneous graph neural Network (DHN) +- Paper link: [https://ieeexplore.ieee.org/document/10209229](https://ieeexplore.ieee.org/document/10209229) +- Author's code repo: [https://github.com/BUPT-GAMMA/HDE](https://github.com/BUPT-GAMMA/HDE) + +## Dataset Statics +| Dataset | # Nodes | # Edges | # Classes | +|----------|---------|---------|-----------| +| Cora | 4435 | 7071 | 2 | + +## Results +```bash +TL_BACKEND="torch" python dhn_trainer.py --test_ratio 0.3 --one_hot True --k_hop 2 --num_neighbor 5 --batch_size 32 --lr 0.001 --n_epoch 100 --drop_rate 0.01 --dataset 'acm' +``` + +| Dataset | Paper(AUC) | Our(th)(AUC) | +| -------- | ----- | ----------- | +| acm | 95.07 | 95.54±0.18 | \ No newline at end of file diff --git a/examples/dhn/dhn_trainer.py b/examples/dhn/dhn_trainer.py index c62417b1..13b39689 100644 --- a/examples/dhn/dhn_trainer.py +++ b/examples/dhn/dhn_trainer.py @@ -7,7 +7,7 @@ from gammagl.models import DHNModel from gammagl.datasets import ACM4DHN -from gammagl.utils import k_hop_subgraph,find_all_simple_paths +from gammagl.utils import k_hop_subgraph, find_all_simple_paths # The UserWarning is ignored globally import warnings @@ -19,45 +19,41 @@ # 'T': 3 } -NODE_TYPE = len(type2idx) -K_HOP = 2 - -NUM_FEA = (K_HOP + 2) * 4 + NODE_TYPE -NUM_NEIGHBOR = 5 -BATCH_SIZE=32 - warnings.filterwarnings("ignore", category=UserWarning) tlx.set_seed(10) -def dist_encoder(src, dest, G, K_HOP): + +def dist_encoder(src, dest, G, k_hop): if (G.size(1) == 0): paths = [] else: - paths = find_all_simple_paths(G, src, dest, K_HOP + 2) + paths = find_all_simple_paths(G, src, dest, k_hop + 2) - cnt = [K_HOP + 1] * NODE_TYPE # Default truncation for max_spd exceeded + node_type = len(type2idx) + cnt = [k_hop + 1] * node_type # Default truncation for max_spd exceeded for path in paths: - res = [0] * NODE_TYPE + res = [0] * node_type for i in path: if i >= 0: res[type2idx['M']] += 1 else: res[type2idx['A']] += 1 - for k in range(NODE_TYPE): + for k in range(node_type): cnt[k] = min(cnt[k], res[k]) # Generate one-hot encoding if args.one_hot: - one_hot_list = [np.eye(K_HOP + 2, dtype=np.float64)[cnt[i]] - for i in range(NODE_TYPE)] + one_hot_list = [np.eye(k_hop + 2, dtype=np.float64)[cnt[i]] + for i in range(node_type)] return np.concatenate(one_hot_list) return cnt def type_encoder(node): - res = [0] * NODE_TYPE + node_type = len(type2idx) + res = [0] * node_type if node.item() >= 0: res[type2idx['M']] = 1.0 else: @@ -69,15 +65,17 @@ def type_encoder(node): fea_batch = [] -def gen_fea_batch(G, root, fea_dict, hop): +def gen_fea_batch(G, root, fea_dict, k_hop): fea_batch = [] mini_batch.append(root) - a = [0] * (K_HOP + 2) * 4 + type_encoder(root) + a = [0] * (k_hop + 2) * 4 + type_encoder(root) + node_type = len(type2idx) + num_fea = (k_hop + 2) * 4 + node_type fea_batch.append(np.asarray(a, dtype=np.float32 - ).reshape(-1, NUM_FEA) + ).reshape(-1, num_fea) ) # 1-order neighbor sampling @@ -90,7 +88,7 @@ def gen_fea_batch(G, root, fea_dict, hop): neighbors_mask = dst == node neighbors = list(dst[neighbors_mask].numpy()) neighbors.append(node.item()) - random_choice_list = np.random.choice(neighbors, NUM_NEIGHBOR, replace=True) + random_choice_list = np.random.choice(neighbors, args.num_neighbor, replace=True) ns_1.append(random_choice_list.tolist()) ns_1 = tlx.convert_to_tensor(ns_1) mini_batch.append(ns_1[0]) @@ -113,7 +111,7 @@ def gen_fea_batch(G, root, fea_dict, hop): neighbors_mask = dst == node neighbors = list(dst[neighbors_mask].numpy()) neighbors.append(node.item()) - random_choice_list = np.random.choice(neighbors, NUM_NEIGHBOR, replace=True) + random_choice_list = np.random.choice(neighbors, args.num_neighbor, replace=True) ns_2.append(random_choice_list.tolist()) ns_2 = tlx.convert_to_tensor(ns_2) @@ -133,13 +131,13 @@ def gen_fea_batch(G, root, fea_dict, hop): return np.concatenate(fea_batch, axis=1) -def subgraph_sampling_with_DE_node_pair(G, node_pair, K_HOP=2): +def subgraph_sampling_with_DE_node_pair(G, node_pair, k_hop=2): [A, B] = node_pair edge_index = tlx.concat([G['M', 'MA', 'A'].edge_index, reversed(G['M', 'MA', 'A'].edge_index)], axis=1) # Find k-hop subgraphs of A and B - sub_G_for_AB = k_hop_subgraph([A, B], K_HOP, edge_index) + sub_G_for_AB = k_hop_subgraph([A, B], k_hop, edge_index) # Remove edges using Boolean indexes # Note: Just remove the edges, the points remain @@ -159,21 +157,20 @@ def subgraph_sampling_with_DE_node_pair(G, node_pair, K_HOP=2): # Distance from all points in the subgraph to the node pair SPD_based_on_node_pair = {} for node in sub_G_nodes: - tmpA = dist_encoder(A, node, sub_G_index, K_HOP) - tmpB = dist_encoder(B, node, sub_G_index, K_HOP) + tmpA = dist_encoder(A, node, sub_G_index, k_hop) + tmpB = dist_encoder(B, node, sub_G_index, k_hop) SPD_based_on_node_pair[node.item()] = np.concatenate([tmpA, tmpB], axis=0) A_fea_batch = gen_fea_batch(sub_G_index, A, - SPD_based_on_node_pair, K_HOP) + SPD_based_on_node_pair, k_hop) B_fea_batch = gen_fea_batch(sub_G_index, B, - SPD_based_on_node_pair, K_HOP) + SPD_based_on_node_pair, k_hop) return A_fea_batch, B_fea_batch -def batch_data(G, - batch_size=3): +def batch_data(G, batch_size): edge_index = G['M', 'MA', 'A'].edge_index nodes = set(tlx.convert_to_tensor(np.unique(edge_index[0].numpy()))) | set( tlx.convert_to_tensor(np.unique(edge_index[1].numpy()))) @@ -204,7 +201,7 @@ def batch_data(G, bx = batch_edge[:, i:i + 1] # Positive sample - posA, posB = subgraph_sampling_with_DE_node_pair(G, bx, K_HOP=K_HOP) + posA, posB = subgraph_sampling_with_DE_node_pair(G, bx, k_hop=args.k_hop) batch_A_fea.append(posA) batch_B_fea.append(posB) batch_y.append(np.asarray(by, dtype=np.float32)) @@ -213,7 +210,7 @@ def batch_data(G, neg_tmpB_id = random.choice(nodes_list) node_pair = tlx.convert_to_tensor([[bx[0].item()], [neg_tmpB_id]]) - negA, negB = subgraph_sampling_with_DE_node_pair(G, node_pair, K_HOP=K_HOP) + negA, negB = subgraph_sampling_with_DE_node_pair(G, node_pair, k_hop=args.k_hop) batch_A_fea.append(negA) batch_B_fea.append(negB) batch_y.append(np.asarray(0.0, dtype=np.float32)) @@ -250,16 +247,19 @@ def result(self): def main(args): if str.lower(args.dataset) not in ['acm']: raise ValueError('Unknown dataset: {}'.format(args.dataset)) - if str.lower(args.dataset)=='acm': - data = ACM4DHN(args.dataset_path) + if str.lower(args.dataset) == 'acm': + data = ACM4DHN(root=args.dataset_path, test_ratio=args.test_ratio) + + graph = data[0] - graph=data[0] + G_train = graph['train'] + G_val = graph['val'] + G_test = graph['test'] - G_train=graph['train'] - G_val=graph['val'] - G_test=graph['test'] + node_type = len(type2idx) + num_fea = (args.k_hop + 2) * 4 + node_type - m = DHNModel(NUM_FEA,BATCH_SIZE,NUM_NEIGHBOR) + m = DHNModel(num_fea, args.batch_size, args.num_neighbor) optim = tlx.optimizers.Adam(lr=args.lr, weight_decay=args.drop_rate) train_weights = m.trainable_weights @@ -276,7 +276,7 @@ def main(args): # train m.set_train() - tra_batch_A_fea, tra_batch_B_fea, tra_batch_y = batch_data(G_train, BATCH_SIZE).__next__() + tra_batch_A_fea, tra_batch_B_fea, tra_batch_y = batch_data(G_train, args.batch_size).__next__() tra_out = m(tra_batch_A_fea, tra_batch_B_fea, tra_batch_y) data = { @@ -292,7 +292,7 @@ def main(args): # val m.set_eval() - val_batch_A_fea, val_batch_B_fea, val_batch_y = batch_data(G_val, BATCH_SIZE).__next__() + val_batch_A_fea, val_batch_B_fea, val_batch_y = batch_data(G_val, args.batch_size).__next__() val_out = m(val_batch_A_fea, val_batch_B_fea, val_batch_y) val_loss = tlx.losses.sigmoid_cross_entropy(output=val_out, target=tlx.convert_to_tensor(val_batch_y)) @@ -301,7 +301,7 @@ def main(args): print("val: ", val_loss.item(), val_auc) # test - test_batch_A_fea, test_batch_B_fea, test_batch_y = batch_data(G_test, BATCH_SIZE).__next__() + test_batch_A_fea, test_batch_B_fea, test_batch_y = batch_data(G_test, args.batch_size).__next__() test_out = m(test_batch_A_fea, test_batch_B_fea, test_batch_y) test_loss = tlx.losses.sigmoid_cross_entropy(output=test_out, target=tlx.convert_to_tensor(test_batch_y)) @@ -313,12 +313,16 @@ def main(args): if __name__ == '__main__': # parameters setting parser = argparse.ArgumentParser() - parser.add_argument("--one_hot",type=bool,default=True,help="use one-hot encoding") - parser.add_argument("--lr", type=float, default=0.001, help="learnin rate") + parser.add_argument("--test_ratio", type=float, default=0.3, help="ratio of dividing the data set") + parser.add_argument("--one_hot", type=bool, default=True, help="use one-hot encoding") + parser.add_argument("--k_hop", type=int, default=2, help="hops of the generated subgraph") + parser.add_argument("--num_neighbor", type=int, default=5, help="neighbor sample number") + parser.add_argument("--batch_size", type=int, default=32, help="batch size") + parser.add_argument("--lr", type=float, default=0.001, help="learning rate") parser.add_argument("--n_epoch", type=int, default=100, help="number of epoch") parser.add_argument("--drop_rate", type=float, default=0.01, help="drop_rate") parser.add_argument('--dataset', type=str, default='acm', help='dataset') - parser.add_argument("--dataset_path", type = str, default = r"",help='dataset_path') + parser.add_argument("--dataset_path", type=str, default=r"", help='dataset_path') args = parser.parse_args() main(args) \ No newline at end of file diff --git a/gammagl/datasets/acm4dhn.py b/gammagl/datasets/acm4dhn.py index b65d2010..fbfb849e 100644 --- a/gammagl/datasets/acm4dhn.py +++ b/gammagl/datasets/acm4dhn.py @@ -6,13 +6,13 @@ class ACM4DHN(InMemoryDataset): url = 'https://raw.githubusercontent.com/BUPT-GAMMA/HDE/main/ds/imdb' - test_ratio = 0.3 def __init__(self, root: Optional[str] = None, transform: Optional[Callable] = None, pre_transform: Optional[Callable] = None, pre_filter: Optional[Callable] = None, - force_reload: bool = False): + force_reload: bool = False, test_ratio: float = 0.3): super().__init__(root, transform, pre_transform, force_reload=force_reload) self.data, self.slices = self.load_data(self.processed_paths[0]) + self.test_ratio = test_ratio @property def raw_file_names(self) -> List[str]: diff --git a/tests/datasets/test_acm4dhn.py b/tests/datasets/test_acm4dhn.py new file mode 100644 index 00000000..13102d3f --- /dev/null +++ b/tests/datasets/test_acm4dhn.py @@ -0,0 +1,15 @@ +import tensorlayerx as tlx +from gammagl.datasets import ACM4DHN + +root = "./data" + + +def test_acm4dhn(): + test_ratio = 0.3 + dataset = ACM4DHN(root=root, test_ratio=test_ratio) + graph = dataset[0] + assert len(dataset) == 1 + assert tlx.get_tensor_shape(graph['M', 'MA', 'A'].edge_index) == [2, 7071] + assert tlx.get_tensor_shape(graph['train']['M', 'MA', 'A'].edge_index) == [2, 2828] + assert tlx.get_tensor_shape(graph['val']['M', 'MA', 'A'].edge_index) == [2, 2121] + assert tlx.get_tensor_shape(graph['test']['M', 'MA', 'A'].edge_index) == [2, 2122] From 986f94562e125cce9a06c61465caf66661113ef5 Mon Sep 17 00:00:00 2001 From: gyzhou2000 Date: Tue, 9 Jul 2024 22:15:37 +0800 Subject: [PATCH 6/8] update --- examples/dhn/README.md | 6 +-- examples/dhn/dhn_trainer.py | 85 +++++++++++++++++++++---------------- gammagl/datasets/acm4dhn.py | 6 +-- gammagl/models/dhn.py | 5 ++- gammagl/utils/subgraph.py | 4 +- 5 files changed, 60 insertions(+), 46 deletions(-) diff --git a/examples/dhn/README.md b/examples/dhn/README.md index a365ebeb..a10d95ba 100644 --- a/examples/dhn/README.md +++ b/examples/dhn/README.md @@ -3,9 +3,9 @@ - Author's code repo: [https://github.com/BUPT-GAMMA/HDE](https://github.com/BUPT-GAMMA/HDE) ## Dataset Statics -| Dataset | # Nodes | # Edges | # Classes | -|----------|---------|---------|-----------| -| Cora | 4435 | 7071 | 2 | +| Dataset | # Nodes | # Edges | +|----------|---------|---------| +| acm | 3908 | 4500 | ## Results ```bash diff --git a/examples/dhn/dhn_trainer.py b/examples/dhn/dhn_trainer.py index 13b39689..2c529143 100644 --- a/examples/dhn/dhn_trainer.py +++ b/examples/dhn/dhn_trainer.py @@ -1,16 +1,19 @@ +import os +# os.environ['CUDA_VISIBLE_DEVICES'] = '0' +# os.environ['TL_BACKEND'] = 'torch' +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' +# 0:Output all; 1:Filter out INFO; 2:Filter out INFO and WARNING; 3:Filter out INFO, WARNING, and ERROR + import argparse import random import numpy as np import tensorlayerx as tlx from tensorlayerx.model import TrainOneStep from sklearn.metrics import roc_auc_score - from gammagl.models import DHNModel from gammagl.datasets import ACM4DHN from gammagl.utils import k_hop_subgraph, find_all_simple_paths -# The UserWarning is ignored globally -import warnings type2idx = { 'M': 0, @@ -19,10 +22,6 @@ # 'T': 3 } -warnings.filterwarnings("ignore", category=UserWarning) - -tlx.set_seed(10) - def dist_encoder(src, dest, G, k_hop): if (G.size(1) == 0): @@ -86,7 +85,7 @@ def gen_fea_batch(G, root, fea_dict, k_hop): neighbors_mask = src == node else: neighbors_mask = dst == node - neighbors = list(dst[neighbors_mask].numpy()) + neighbors = list(tlx.convert_to_numpy(dst[neighbors_mask])) neighbors.append(node.item()) random_choice_list = np.random.choice(neighbors, args.num_neighbor, replace=True) ns_1.append(random_choice_list.tolist()) @@ -109,7 +108,7 @@ def gen_fea_batch(G, root, fea_dict, k_hop): neighbors_mask = src == node else: neighbors_mask = dst == node - neighbors = list(dst[neighbors_mask].numpy()) + neighbors = list(tlx.convert_to_numpy(dst[neighbors_mask])) neighbors.append(node.item()) random_choice_list = np.random.choice(neighbors, args.num_neighbor, replace=True) ns_2.append(random_choice_list.tolist()) @@ -141,17 +140,17 @@ def subgraph_sampling_with_DE_node_pair(G, node_pair, k_hop=2): # Remove edges using Boolean indexes # Note: Just remove the edges, the points remain - edge_index_np = sub_G_for_AB[1].numpy() + edge_index_np = tlx.convert_to_numpy(sub_G_for_AB[1]) remove_indices = tlx.convert_to_tensor([ ((edge_index_np[0, i] == A) & (edge_index_np[1, i] == B)) | ( (edge_index_np[0, i] == B) & (edge_index_np[1, i] == A)) for i in range(sub_G_for_AB[1].shape[1]) ]) - remove_indices = remove_indices.numpy() + remove_indices = tlx.convert_to_numpy(remove_indices) sub_G_index = sub_G_for_AB[1][:, ~remove_indices] - sub_G_nodes = set(np.unique(sub_G_for_AB[0].numpy())) | set( - np.unique(sub_G_for_AB[1].numpy())) # Gets the points in the graph + sub_G_nodes = set(np.unique(tlx.convert_to_numpy(sub_G_for_AB[0]))) | set( + np.unique(tlx.convert_to_numpy(sub_G_for_AB[1]))) # Gets the points in the graph sub_G_nodes = tlx.convert_to_tensor(list(sub_G_nodes)) # Distance from all points in the subgraph to the node pair @@ -172,8 +171,8 @@ def subgraph_sampling_with_DE_node_pair(G, node_pair, k_hop=2): def batch_data(G, batch_size): edge_index = G['M', 'MA', 'A'].edge_index - nodes = set(tlx.convert_to_tensor(np.unique(edge_index[0].numpy()))) | set( - tlx.convert_to_tensor(np.unique(edge_index[1].numpy()))) + nodes = set(tlx.convert_to_tensor(np.unique(tlx.convert_to_numpy(edge_index[0])))) | set( + tlx.convert_to_tensor(np.unique(tlx.convert_to_numpy(edge_index[1])))) nodes_list = [] for node in nodes: @@ -182,7 +181,7 @@ def batch_data(G, batch_size): num_batch = int(len(edge_index[0]) / batch_size) # Shuffle the order of the edges - edge_index_np = np.array(edge_index) + edge_index_np = tlx.convert_to_numpy(edge_index) permutation = np.random.permutation(edge_index_np.shape[1]) # Generate a randomly arranged index edge_index_np = edge_index_np[:, permutation] # Use this permutation index to scramble edge_index edge_index = tlx.convert_to_tensor(edge_index_np) @@ -259,25 +258,25 @@ def main(args): node_type = len(type2idx) num_fea = (args.k_hop + 2) * 4 + node_type - m = DHNModel(num_fea, args.batch_size, args.num_neighbor) + model = DHNModel(num_fea, args.batch_size, args.num_neighbor, name="DHN") optim = tlx.optimizers.Adam(lr=args.lr, weight_decay=args.drop_rate) - train_weights = m.trainable_weights + train_weights = model.trainable_weights - net_with_loss = Loss(m, loss_fn=tlx.losses.sigmoid_cross_entropy) + net_with_loss = Loss(model, loss_fn=tlx.losses.sigmoid_cross_entropy) net_with_train = TrainOneStep(net_with_loss, optim, train_weights) tra_auc_metric = AUCMetric() val_auc_metric = AUCMetric() test_auc_metric = AUCMetric() + best_val_auc = 0 for epoch in range(args.n_epoch): - print("-----Epoch {}/{}-----".format(epoch + 1, args.n_epoch)) # train - m.set_train() + model.set_train() tra_batch_A_fea, tra_batch_B_fea, tra_batch_y = batch_data(G_train, args.batch_size).__next__() - tra_out = m(tra_batch_A_fea, tra_batch_B_fea, tra_batch_y) + tra_out = model(tra_batch_A_fea, tra_batch_B_fea, tra_batch_y) data = { "n1": tra_batch_A_fea, @@ -286,28 +285,33 @@ def main(args): } tra_loss = net_with_train(data, tra_batch_y) - tra_auc_metric.update_state(y_true=tra_batch_y, y_pred=tlx.sigmoid(tra_out).detach().numpy()) + tra_auc_metric.update_state(y_true=tra_batch_y, y_pred=tlx.convert_to_numpy(tlx.sigmoid(tra_out))) tra_auc = tra_auc_metric.result() - print('train: ', tra_loss, tra_auc) # val - m.set_eval() + model.set_eval() val_batch_A_fea, val_batch_B_fea, val_batch_y = batch_data(G_val, args.batch_size).__next__() - val_out = m(val_batch_A_fea, val_batch_B_fea, val_batch_y) + val_out = model(val_batch_A_fea, val_batch_B_fea, val_batch_y) - val_loss = tlx.losses.sigmoid_cross_entropy(output=val_out, target=tlx.convert_to_tensor(val_batch_y)) - val_auc_metric.update_state(y_true=val_batch_y, y_pred=tlx.sigmoid(val_out).detach().numpy()) + val_auc_metric.update_state(y_true=val_batch_y, y_pred=tlx.convert_to_numpy(tlx.sigmoid(val_out))) val_auc = val_auc_metric.result() - print("val: ", val_loss.item(), val_auc) - # test - test_batch_A_fea, test_batch_B_fea, test_batch_y = batch_data(G_test, args.batch_size).__next__() - test_out = m(test_batch_A_fea, test_batch_B_fea, test_batch_y) + print("Epoch [{:0>3d}] ".format(epoch+1)\ + + " train loss: {:.4f}".format(tra_loss.item())\ + + " val auc: {:.4f}".format(val_auc)) - test_loss = tlx.losses.sigmoid_cross_entropy(output=test_out, target=tlx.convert_to_tensor(test_batch_y)) - test_auc_metric.update_state(y_true=test_batch_y, y_pred=tlx.sigmoid(test_out).detach().numpy()) - test_auc = test_auc_metric.result() - print("test: ", test_loss.item(), test_auc) + if val_auc > best_val_auc: + best_val_auc = val_auc + model.save_weights(args.best_model_path+model.name+".npz", format='npz_dict') + + model.load_weights(args.best_model_path+model.name+".npz", format='npz_dict') + # test + test_batch_A_fea, test_batch_B_fea, test_batch_y = batch_data(G_test, args.batch_size).__next__() + test_out = model(test_batch_A_fea, test_batch_B_fea, test_batch_y) + + test_auc_metric.update_state(y_true=test_batch_y, y_pred=tlx.convert_to_numpy(tlx.sigmoid(test_out))) + test_auc = test_auc_metric.result() + print("Test auc: {:.4f}".format(test_auc)) if __name__ == '__main__': @@ -323,6 +327,13 @@ def main(args): parser.add_argument("--drop_rate", type=float, default=0.01, help="drop_rate") parser.add_argument('--dataset', type=str, default='acm', help='dataset') parser.add_argument("--dataset_path", type=str, default=r"", help='dataset_path') + parser.add_argument("--best_model_path", type=str, default=r'./', help="path to save best model") + parser.add_argument("--gpu", type=int, default=-1) args = parser.parse_args() - main(args) \ No newline at end of file + if args.gpu >= 0: + tlx.set_device("GPU", args.gpu) + else: + tlx.set_device("CPU") + + main(args) diff --git a/gammagl/datasets/acm4dhn.py b/gammagl/datasets/acm4dhn.py index fbfb849e..2305e798 100644 --- a/gammagl/datasets/acm4dhn.py +++ b/gammagl/datasets/acm4dhn.py @@ -10,9 +10,9 @@ class ACM4DHN(InMemoryDataset): def __init__(self, root: Optional[str] = None, transform: Optional[Callable] = None, pre_transform: Optional[Callable] = None, pre_filter: Optional[Callable] = None, force_reload: bool = False, test_ratio: float = 0.3): + self.test_ratio = test_ratio super().__init__(root, transform, pre_transform, force_reload=force_reload) self.data, self.slices = self.load_data(self.processed_paths[0]) - self.test_ratio = test_ratio @property def raw_file_names(self) -> List[str]: @@ -71,8 +71,8 @@ def process(self): [edge_index_M[sp1:sp1 + sp2], edge_index_A[sp1:sp1 + sp2]]) G_test['M', 'MA', 'A'].edge_index = tlx.convert_to_tensor([edge_index_M[sp1 + sp2:], edge_index_A[sp1 + sp2:]]) - print( - f"all edge: {len(G['M', 'MA', 'A'].edge_index[0])}, train edge: {len(G_train['M', 'MA', 'A'].edge_index[0])}, val edge: {len(G_val['M', 'MA', 'A'].edge_index[0])}, test edge: {len(G_test['M', 'MA', 'A'].edge_index[0])}") + # print( + # f"all edge: {len(G['M', 'MA', 'A'].edge_index[0])}, train edge: {len(G_train['M', 'MA', 'A'].edge_index[0])}, val edge: {len(G_val['M', 'MA', 'A'].edge_index[0])}, test edge: {len(G_test['M', 'MA', 'A'].edge_index[0])}") G['train'] = G_train # training set G['val'] = G_val # valuation set diff --git a/gammagl/models/dhn.py b/gammagl/models/dhn.py index 2b717a17..615960b3 100644 --- a/gammagl/models/dhn.py +++ b/gammagl/models/dhn.py @@ -6,8 +6,9 @@ class DHNModel(tlx.nn.Module): def __init__(self, num_fea, batch_size, - num_neighbor): - super().__init__() + num_neighbor, + name=None): + super().__init__(name=name) self.num_fea = num_fea self.batch_size = batch_size self.num_neighbor = num_neighbor diff --git a/gammagl/utils/subgraph.py b/gammagl/utils/subgraph.py index d2217ea7..1f9f3a40 100644 --- a/gammagl/utils/subgraph.py +++ b/gammagl/utils/subgraph.py @@ -42,7 +42,9 @@ def k_hop_subgraph(node_idx, num_hops, edge_index, relabel_nodes=False, num_node col, row = edge_index if isinstance(node_idx, (int, list, tuple)): - node_idx = tlx.convert_to_tensor(np.array([node_idx]).flatten(), dtype=edge_index.dtype) + # node_idx = tlx.convert_to_tensor(np.array([node_idx]).flatten(), dtype=edge_index.dtype) + node_idx = np.array([i.item() for i in node_idx]).flatten() + node_idx = tlx.convert_to_tensor(node_idx, dtype=tlx.int64) subsets = [node_idx] node_mask = tlx.zeros((num_nodes,), dtype=tlx.bool) From 75194150426aa4ba9cced0f38c7b3dfa01c11384 Mon Sep 17 00:00:00 2001 From: gyzhou2000 Date: Sun, 14 Jul 2024 22:16:34 +0800 Subject: [PATCH 7/8] update --- tests/utils/test_find_all_simple_paths.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/utils/test_find_all_simple_paths.py b/tests/utils/test_find_all_simple_paths.py index d39b872a..7d2fff71 100644 --- a/tests/utils/test_find_all_simple_paths.py +++ b/tests/utils/test_find_all_simple_paths.py @@ -1,7 +1,10 @@ import tensorlayerx as tlx from gammagl.utils.simple_path import find_all_simple_paths + def test_find_all_simple_paths(): + if tlx.BACKEND == 'tensorflow': + return edge_index = tlx.convert_to_tensor([[0, 0, 1, 1, 2], [1, 2, 0, 3, 1]], dtype=tlx.int64) src = tlx.convert_to_tensor([0], dtype=tlx.int64) dest = tlx.convert_to_tensor([3], dtype=tlx.int64) @@ -20,4 +23,4 @@ def test_find_all_simple_paths(): dest = tlx.convert_to_tensor([0], dtype=tlx.int64) expected_paths = [[0]] paths = find_all_simple_paths(edge_index, src, dest, max_length=1) - assert sorted(map(tuple, paths))==sorted(map(tuple, expected_paths)) \ No newline at end of file + assert sorted(map(tuple, paths))==sorted(map(tuple, expected_paths)) From 4dbba4960de0be86b967b6f1c06340bfcef5b14f Mon Sep 17 00:00:00 2001 From: gyzhou2000 Date: Sun, 14 Jul 2024 15:07:20 +0000 Subject: [PATCH 8/8] update --- gammagl/utils/subgraph.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gammagl/utils/subgraph.py b/gammagl/utils/subgraph.py index 1f9f3a40..29f10532 100644 --- a/gammagl/utils/subgraph.py +++ b/gammagl/utils/subgraph.py @@ -42,9 +42,9 @@ def k_hop_subgraph(node_idx, num_hops, edge_index, relabel_nodes=False, num_node col, row = edge_index if isinstance(node_idx, (int, list, tuple)): - # node_idx = tlx.convert_to_tensor(np.array([node_idx]).flatten(), dtype=edge_index.dtype) - node_idx = np.array([i.item() for i in node_idx]).flatten() - node_idx = tlx.convert_to_tensor(node_idx, dtype=tlx.int64) + node_idx = tlx.convert_to_tensor(np.array([node_idx]).flatten(), dtype=edge_index.dtype) + # node_idx = np.array([i.item() for i in node_idx]).flatten() + # node_idx = tlx.convert_to_tensor(node_idx, dtype=tlx.int64) subsets = [node_idx] node_mask = tlx.zeros((num_nodes,), dtype=tlx.bool)