Compare commits
	
		
			2 Commits 
		
	
	
		
			f78ab44ab2
			...
			5fd8117998
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 5fd8117998 | |
|  | 85d9d0c910 | 
|  | @ -0,0 +1 @@ | ||||||
|  | 64599 31 674832 2659361 1 0 8867 321 | ||||||
|  | @ -0,0 +1,140 @@ | ||||||
|  | SSSSSSSSGGGGGGGGGGGGGHHHHHHHHHHHHHHRHHFFFFFFNNNNNNNNZNIIQQQQQQQQQQQQLLLLLLCCCCCCCCCCCUUUUUUSSSSSSSSSSYYYYYYYYYYFFFFFFQQQQUUUUUUUUUUUUKKKKKKK | ||||||
|  | SSSSSSSSGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHFFFFNNNNNNNNNNNIQQQQQQQQQQQQQLLLLLLCLLCCCCUUUUUUUUSSSSSSSSSSSSSYYYYYYYFFFFFFFFFFFQQUUUUUUUUUUUUUJJJKK | ||||||
|  | SSSSSSSSGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHFFFFNNNNNNNNNNNQQQQQQQQQQQQQQLLLLLLLLLCCCCCCCUUUUWSSSSSSSSSSSKKZYYYYFFFFFFFFFFFFFFFFUUUUUUUUUUUUZJJJJ | ||||||
|  | SSSSSSSSGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHFFFNNRNNNNNNNNNNQQQQQQQQQQQQQQLLLLLLLLOCOOCOCCUUUUCSSSSSSGSSSZZZYYYYFFFFFFFFFFFFFFFZUUUUUUBUUUUUUJJJJ | ||||||
|  | SSSSSSGGGGGGGGGGGGGGHGHHHHHHHVVHVVHHHHHFNNNNNNNNNNNNNNNQQQQQQQQQQQQLLLLLLLNLOOOOOOOOCUUUCCSSSSSSGSSSZZZZYYFFFFFFFFFFFFFZZZZUUUUUUBUUUUUJJJJJ | ||||||
|  | SSSSSSSGGGGGGGGGGGGGGGHHHHHHHVOVVVFFFFFFFNNNNNNNNNNNNNNKQQQQQQQQQQUQLLLLLLNLOOOOOOOOCCCCCCSSSSSSSSSSZZZZYYYFFFFFFFFFFFFFQZZZZUUUUUUUUUJJJJJJ | ||||||
|  | SSSSSWSGGGGGGGGGGGGGHHHHHHHHHVVVVVVVFFFFFFNNNNNNNNNNNNNNNQQMCQQQQQQQLLLLLLOOOOOOOOOOOCCCCCSSSSSSSSSSZZZZYYYYFFFFYYFFFFFFZZZZZZUUUFFUUUJJJJJJ | ||||||
|  | WWWWWWWGGGGGGGGGGGGGHHHHHHHVVVVVVVVFFFFFNNNNNNNNNNNNNNNNNSQCCPQQQWWQLLLLLGGGOOOOOOOOOCCCCCCSSSZSSSSZZZYYYYUYYYYFYFFFFFFVZZZZZZZFFFFFSJJJJJJJ | ||||||
|  | WWWWWWWGGGGGGGGGGGGHHHHHHHHHVVVVVVVFFFFFFNNNNNNNNNZNZNNNCCCCCCCQUDDDDDLLLLLOOOOOOVOOCCCCCCCCZZZSSSSZZZZYUUUYYYYYYYYFFFZVVZZZAAZZFFSFSSJJJJJJ | ||||||
|  | WWWWWGGGGGGGGGGGGHHHGHHHHHHHVVVVVVVBFFFFFFNNPNNNNNZZZNCCCCCCCCUUUDDDDLLLVVOOVVVVVVVCCCCCNNNNNNZSSSSZZZZZUUUUYYYYKKOOOOZVVZZAAAAZFFSFSSJJJJJJ | ||||||
|  | WWWWWWAAGGGGGGGGRRGGGHHHHHHHVVVVVJJBBFFFFNNNPPNNKZZZZZZCCCCCCCCUUUUDDLLVVVVVVVVVVVVCCCVCNNNNNNZZZZSZZZZZUUUUYYYKKKKOOOZZZZZZAAAASSSSSXXJJJJJ | ||||||
|  | WUUWWWWGGDGGGGGGGGGGGHHHHHXXXFVVVVVBBBBFPPPPPPNNKZZZZZZCCZCCCUUUUDUDDDVVVVVVVVVVVVVVNNNVNNNNNNNNNNNNNZUUUUUUUKKKKKOOOOZZZZZCOAASSSSSSSJJJJJJ | ||||||
|  | UUUUUUUUGGGGSGGGGGGGGGHHHHXXFFFVVVVBBBBBPPPPPPPNKZZZZZZZZZZUUUUUDDDDDDMMVVVVVVVVVVVVNNNNNNNNNNNNNNNNNUUUUUUUUKKKKKKKOZZZZZZOOSSSSSSSSJJJJJJJ | ||||||
|  | VUUUUUUUUUUUZGGGGGGGGGHXHXXXXFFBBBBBBBBBPPPPPPPPKZZZZZZZZZUUUUUUDDDDDDMMVVVVVVVVVVVVNNNNNNNNNNNNNNNNNUUUUUUUUKKKKKKKOOZOZZZZOSSSSSSSSSBOBJJJ | ||||||
|  | VVVUZZZZUUUZZGGGGGGGGHHXXXXXXFFBBBBBBBBBBPPPPPPPKZZZZZZZZUUUUUUUUUDDMFMMMVMMVVVVVVVVNNNNNNNNNNNNNNNNNUUUUUUUUUKKKKKKOOOOZOOOOOSSSSSSSSBOBMJM | ||||||
|  | VVUUZZZZZZZZZGGGGGGGGGJXXXXXXXFXBBBBBBBBBPPPPPPPPZZZZZZZZZQUUUUUUUUMMMMMMVMMMMXVVVVVVNNNNNNNNNNNNNNNNUUUUUUUURKKKKKKOOOOOOOOOOSSBSBSSBBBBMJM | ||||||
|  | VVUUZZZZZZZZZGGGGGGGGGGXXXXXXXXXXBBBBBBBBBBPPPPPPZZZZZZZQQQUUUUQUUUMMMMMMVMMRVVVVVVVVNNNNNNNNNNNNNNNNUUUUUUUUUKKKKKKOOOOOOOCOOOCBBBBBBBBBMBM | ||||||
|  | VVVZZZZZZZZZZGGGGGGGGGGGLLLLLLLXXBXXCXBBBBBPPPPYYYZZZZZKQOQQQQQQQQQMMMMMMMMMRVVVVVVVVNNNNNNNNNEEEZZZUUUUUUUUUUKKKKOOOOOOOOOCCOOCCBBBBBBBBBBM | ||||||
|  | VVVVZZZZZWZGGGGGGGGGGGGLLLLLLLLXXXXXXXXYYBBPPPYYYYEEEEZZZQQQQQQQQQMMMMMMMMMMVVVVVVVVVNNNNNNNNNEEZZZZUUUUUUUUUUOOOOOOOOOOOOCCCYCCCBBBBBBBBBBM | ||||||
|  | VVVZZZZWWWXGGGGGGGGGGGGLLLLLLLLLXXXXXXXXYYYPPPYYYEEEEEQQQQQQQQQQQQQMMMMMMMMMVVVVVVVVVNNNNNNNNNXQQQZZZUUUUUUUUUOOOOOOOOOOOOOCCCCCCCCCBBBBBBMM | ||||||
|  | VVVVZZZWWWWGGGGGGGGGGGGLLLLLLLLXXXXXXXXYYYYYYYYYYYEEEEEQQQQQQQQQQQQQOMMMMMMRRRRRVVVVVVNNNNNNNNXQQQZZZUUUUUUUUUUOOOOOOOOOOOCCCCCCCCCCCBBBBMMM | ||||||
|  | VVVVZQQWRWWQQQGGGGGGGGGLLLLLLLXXXXXXXXXYYYYYYYUUUYEEEEEQQQQQQQQQQQQOOMMMMMMRRRRRVVVVBBNNNNNNNNXXQQQZVUUUUUUUUUUPPOPOPPPPOOOCCCCCCCCBBBBBBMMM | ||||||
|  | VVVVQQQQWWQQQQGGGGGGGLLLLLLDDLXXDXZXYYYYYYYYYUUUUEEEEEGQQQQQQQQQQQQOOMMRRMRRRRRRRRBBBBVDDXXXXXXQQQDVVVVUUUUVVVPPPPPPPPPPPOOOCCCCCCCCBBBBBMMM | ||||||
|  | VVVVQQQQQQQQQQGGGSSQSLLLLLLDDXXDDXXYYYYYYYYUYUUUUUUUPEEQQQQQQQQQQQQQQMRRRRRRRRRRRRBBLLXXXXXXXXXXQQVVVVVVVVVVVPPPPPPPPPPPPPPCCCCCCCBCCCCBOMMO | ||||||
|  | VVVVQQQQQQQQQQQGGSSSSSSLLLLDDDDDDXYYFFFFFYYUUUUUUUUUPPPQQQQQQQQQQQQQRRRRRRRRSRSRRRBBLLXXXXXXXXXQQQVVVVVVVVVVVPPPPPPPPPPPPCCCATCGCBBBBOEOOOOO | ||||||
|  | VVVVQQQQQQQQQQQQSSSSSSSSLLLDDDDDDDDYFFFFYYYUUUUUUUUUUUURRQQQQQQQQQQQQRRSSSSSSSSSLLLLLLXXXXXXXXXQQQVVVVVVVVVVVVPPPPPPPPPPPPPOTTGGTBBBBOOOOOOO | ||||||
|  | VVVVVQQQQQQQQQQQSSSSSSSSSLDDDDDDDDDYYFFFFFUUUUUUUUUUUUUQRQQQQQQQQQQQRRRRRSSSSSSSLLLLLLLXXXXXXXXXQQQQVVVVVVVVVVPPPPPPPPPPPPOOTTTTTBBTOOOOOOOO | ||||||
|  | VVVVQQQQQQQQQEQSSSSSSSSSSSSDDDDDDDDYYDFFFFUUUUUUUUUUUUUQQQQQQWQQQQQQRRSSSSSSSSSSLLLLLLLDXXXXXXXXQQQQVVVVVVVZVVVPPPPPPPPPPCTTYTTTTTTTTOOOOOOO | ||||||
|  | VVVVVVVQQQQQQQOSSSSSSSSSGGDDDDDDDDDDDDFFFFFUUUUUUUUUUUUUUAQQUQQQQQRRRRSSSSSSSSSSLLLLLLLLXXXXXXQQQQJJVVVVVBVVVVVPPPPPPPPPPCTTTDTTTTTTTTOOOOOO | ||||||
|  | VVVVVVVQQQOQOOOSSSSSSSSEEDDDDDDDDDDCCCFFFFFFUUUUUUUUUUUUUAQAURQQQRRRRRSSSSSSSSSSSLLLLLLLLXXXXXXXQQJJJJJJVVVVVVVVPPPPPPPPPPTWTTTTTTTTTTSSOOEE | ||||||
|  | VVVVVVVVQOOOOOOSOISSSEAEDEEDDDDDDDFWCCQQQFFUUUUUUUUUUZUAAAAARRRRRRRRRRJJJSSSSSSSSSLLLLLLLXXXXXXXXJJJJJJJVVVVVVVVPPPPPPPPPPWWTTTTTTTSSTSSSEEE | ||||||
|  | VVVVVVVVOOOOOOOSOOQSEEEEDDEWWWDDWWWWWCQQQQUUUUUUUUUMMAAAAAAARRRRRRRYYYYYYYYSSSSSSSLLLLLLXXXXXXAXXJJJJJJJVVVVVVVVVVPPPPPPPPWWTTTTTTISSSSSSSEE | ||||||
|  | VVVVOOVOOOOOOOOOOOSSEEAEEEEEWWWWWWWWWQQQQQUUUUUUUUUMMAAAAAAAAARRRRRYYYYYYYYSSSSSSLLLLLLLLXXXXXXTCCCCJJCCWCCVVVVVVVPPPPPPPPWWWWTIIIISSSSSSSSS | ||||||
|  | VVVOOOOOOOOOOOOOOOOEEEEEEEEEEWWWWWHHWQQQQQUUUUBUUBBMMMMAAAAAABBYYYYYYYYYYYYSSSXSSLSLLLHLLXXXGXTTCCCCCJCCCCVVVVVVVVVVPPPPPWWWWIIIIIISSSSSSSSS | ||||||
|  | TVOOOOOOOOOOOOOOOOOEEEEEEEEEEWWWWWHWWQQQQSUUAUBBUBBBBMMAAPAPBBBYYYYYYYYYYYYYYYYYYYSSHHHHHXXTTTTCCCCCCCCCCCCVVVVVVVVKPPPPPWWWWIIIIISSSSSSSSSS | ||||||
|  | OOOOOOOOOOOOOOOOQOQQQNQQEEEWWWWWWWWWWQQQQQAAAUBBBBBBBMMAAPPPPBRYYYYYYYYYYYYYYYYYYYSHHHHHHXZCCCCCCCCCCCCCCCCCCVVVVKVKPPPKWWWWIIIIIIISSSSSSSSS | ||||||
|  | OOOOUOOOOOOOOQQQQQQQQQQQECCCCWWWWWWWWQQQAFAABBBBBBBBBMMMPPPPPRRYYYYYYYYYYYYYYYYYYYSHHHHHHZZZCCCCCCCCCCCCCCCCVVVVKKVKKKKKWWWIIIIIIIISSSSSSSSS | ||||||
|  | OUUOUOOOOOOOQQQQQQIQQQCCCCCCCCWWWWWWWQAAAAAAABHBBBBBMMMMMPPPPRRYYYYYYYYYYYYYYYYYYYSSHHHHHZZZZZZCCCCCCCCCCCCMVVVKKKKKKKKKKCWIIIICCCIIIISSSSSS | ||||||
|  | MUUWUOOOOOOOQQQQQQQQQQCCCCCCCCCCCCQQQQQAAAAAABBBBBBBBMMPPPPPPRPYYYYYYYYYYYYYYYYYYYSSHHHHHZZZZZZCCCCCCCCCCCCMKKKKKKKKKKKKCCCCICCCCCCIIISSSSSS | ||||||
|  | MUUUUUUUOOOOQNQQQQQQQQQQCCCCCCCQQQQQQQQAAAAAABPPBBBBBPPPCPPPPPPYYYYYYYYYYYYYYYYYYYHSHHZZZZZZZZZZCCCCCCCCCCCCKKKKKKKKKKKKCCCCCCCCCCIIIIIISSSS | ||||||
|  | UUUUUUMMMUOOOQQQQQQQQQQQQCCCCCCCCCQQQQQQAAAAAAAPBBHBBPPPPPPPPPPYYYYYYYYYYYYYYYYYYYHHHHZZZZZZZZZZCCCCCCCCCCCCKKKKKKKKKKKKCCCCCCCCCCCCIIIIIIIJ | ||||||
|  | UUUUUUUUUUOOOOQQQQQQQQQQQQCCCCCTCQQQQQQQQQAAAAAAAHHHPPPPPPPPPPYYYYYYYYYYYJJJHHHHSHHHHHZZZZZZZZZZZCCCCCCCCCPCJKKKKKKKKKKKKCCCCCCCCCCCCIIIIIIJ | ||||||
|  | UUUUUUUUUUUOOOSQQQQQQQQQQCCQHHHQCCQQQQQAAAAAAFAHHHHHPPPPPPPPPPYYYYYYYYYYYJHHHHHHHHHHHHZZZZZZZZZZZCCCCCCCXXCCJJGKKKKKKKKKTCCCCCCCCCCCCIIIIIJJ | ||||||
|  | UUUUUUUUUUUTOOSQQQQQQQQQQQQQHHHQQQQQQAAAAAAAAFFHHHHHPPPPPPPPPPYYYJKKKKJJJJJHHHHHHHHHHHHZNZZZZZZZZZCCCCCXXXXXJJGKKKKKKKKKTCCCCCCCCCCCIIIIIIIJ | ||||||
|  | UUUUUUUUUUUTOHSSSSQQQQQQQQQQHHHQQQQQQQAAAAAAAFHBBHHHHBPPPPPPPPYYYYYYYYKKJJJJJHHHHHHHHHHNNZZZZZZXXZCCCCXXXXXJJJKKKKKPKKKTTCCCCCCCCCCIIIIJIJJJ | ||||||
|  | UUUUUUUUUUUSVSSSSSSQQQQQQQQQQQQQQQQQQAAAAAAAFFFBBBBBBBPPBBPPBPYYYYYYYYKJJJJJHHHHHHHHHHNNNNNZZZZZXXXXXXXXXXJJXXXXKKKYYKYYYPPCCCCCCCCCIIIJJJJJ | ||||||
|  | UAUUUUUUUUUSSSSSSSSSQQQQQQQQQQEQQQQQAAAAAAAFFFFBBBBBBBBBBBPPBBYYYYYYYYJJJJJJHHHHHHHHHHNNNNGNZZPZZZAXXXXXXXXXXXXXXYYYYYYYYYPCCCCCCCJJIIIJJJJJ | ||||||
|  | AAUUUUUUUUUSSSSSSSSSWQQQQQQQQQEQQQQQQQAAAAAFFFBBBYYYYYYYYYYBBBYYYYYYYYJJJJJJHHHHHHHHHHNNNNNNNZZZZPAAAAAXXXXXXXXXYYYYYYYYYYYYCCCCCCJJIJIJJJJJ | ||||||
|  | AUUUUUUUUUSSSSSSSSSWWWQQQQQWQQQQQQQQQQQAYYYFFFBBBYYYYYYYYYYBBBPPYYYYYYJJJJJJJHHHHHHHNNNNNNNNNNDAAAAAAAAXTXXXXXXYYYYYYYYYYYIYYCCCCCCJJJJJJJJJ | ||||||
|  | AAUUUUUUUUWSSSSSSWWWWWWQQQQWWPPPQQXQQQHAYYYYYYYBBYYYYYYYYYYYYYYYYYYYYYJJJJJJJJHJJJJJNNNNNNNLNNAAAAAAAAAXTTTTXXXYYYYYYYYYYYYYYZCCCCCJJJJJJJJJ | ||||||
|  | AUUUYYYYYWWWWWSSWWWWWWWAWQQWWPPPPXXXQQQQYYYYYYYYBYYYYYYYYYYYYYYYYYYYYYJJJJJIJJJJJJJRRRRRRRRRRNAAAAAAATTTTTTTXTXXYYYYYYYYYYYYYYCAACCWWJJJJJJJ | ||||||
|  | AAAUYYYYYWWWWWSSWWWWWWWWWWWWPPPPXXUQQQQQYYYGGGGBBYYYYYYYYYYYYYYYYYYYYYJJJJJJJJRJJJJRRRRRRRRRRNALAAAAAATTTTTTTTTXYYYYYYYYYYYYYAWWWWCWWJJJJJJJ | ||||||
|  | AAAYYYYYYYWWWWWWWWWWWWWWWWWPPPXXXXUQQYQYYYYYGGGBBYYYYYYYYYYYYYYYYYYYYYHJJJJJMMRJJJJRRRRRRRRRRNAAAAAAATTTTTTTTTXYYYYYYYYKYYYYYAAWWWWWWWJJJJBJ | ||||||
|  | AAAYYYYYYYWWWWWWWWWWWWWWWWWWWPXXXXXYYYYYYYYGGGGGGGGBBBBBBBYYYYYYYHHHHHJJJNJJRRRRRRRRRRRRRRRRRAAAAAAAAATTTTTTTTXXYYAKKKKKKYYYAAWWWWWWWWWBBBBB | ||||||
|  | AAYYYYYYYYYYWWWWWWWWWWWWWWWWPPXXXXXXYYYYYYYGGGGGGGBBBGBBBBYYYYYYYHHHHHHHHMMMRRRRRRRRRRRRRRRRRAAAAAAAAAJTTTXXXXXXXXKKKKKKKKNYAAWWWWWWWWBBBBBB | ||||||
|  | AAYYYYYYYYYYWWWWWWWWWWWWWXWWXXXXXXXXXXYYYYGGGGGGGGGGGGGYBBBHHHHHHHHHHHHHHMMMRRRRRRRRRRRRRRRRRAAAAAAALLLLLXXXXXXXXXKKKKKKKKNWWAAWWWWWWWBBBBBB | ||||||
|  | AYYGYYYYYYYYWWWWWWWWWWQQQXXXXXXXXXXXXXYYYYGGGGGGGGGGGGGYYYBHHHHHHHHHHHHHHMMMRRRRRRRRRRRRRRRRRAAAAAAAALLLLXQXXQQXXKKKKKKKAWWWWAWWWWWWWWBBBBBB | ||||||
|  | AAYYRYYYYYYYYYWWWWWNWWQQXXXXXXXXXXXXXXXXGYGGGGGGGGGGGGGGHHHHHHHHRRHHHHHHMMMMMMMMMMJRRRRRRRRRRAAAAAAALLLLLLQQXQQXKKKKKKKKKWWWWWWWWWWWWWWWBBBB | ||||||
|  | AAAYYYYYYYYYYYYWNNNNWWWQQQXXWWXXXXXXXXVVGGGGGGGGGGGGFGXXXHHHHHHHHRHHHHHMMMMMMMMMMMJRRRRRRRRRRAAAAALLLLLLLLLQQQQXQKKKKKKKKKWWWWWWWWWWWWLLLBBB | ||||||
|  | AAAYYYYYYYYYYYYNNNNNWWWQQXXXWWWXXXXXXXVVGGGGGGGGGGGGFGXXXXHHHHHHRRRHHHHHMHMMMMMMMMJJJJJJJJAAAAAALLLLLLLLLLLLQQQQQKKKKKKKKKKWWWWWWWWWWWWLLLBB | ||||||
|  | AAAAAYYYYYYYYYNNNNNNNNNQQQXXWWWXWXXXXVXVGGGGVGGGGGGGGXXXHHHHHQHHRRHHHHHHHHHMHSMMJMJJJJJJJAAAAAAALLLLLLLLLLLLJJQQQQQKKKKKKKKKKGGGWWWWWWWLLBBB | ||||||
|  | AAAAAAYYYYAYNNNNNNNNNNNQQQQQWWWWWWXXXVVVGGGGVGGGGGGOXXXXZHHHQQQHRHHHHHHHHHHHHSMMJJJJJJJJJJJAAAAALLLLLLLLLLLLJJQQQQQKKKKKKKKKKGGGWWWWWCWCLLBB | ||||||
|  | AAAAAAYYYYAAANNNNNNNNNQQQQQWWWWWWWXXVVVVVGGVVGGGGGGOXXXXXHHSQQQHHHHHHHHHHHHHHHJJJJJJJJJJJJJPPAAALLLLLLLLLLJJJJQQQQQQKKKKKKKKKGGGGCCWCCCCLLBB | ||||||
|  | AAAAAYYYYAAAANNNNNNNQQQQQQQQWWWWWWXXWVVVVVVVVVVGVVVVRRRWSSSSQQQQQQHHHHHHHHHJJHHHJJJJJJSSSJJPPPPPPPLLLLLLLJJJJJQQQJKKKKKKJKKKGGGGGGCCCCCCCCBB | ||||||
|  | AAAAAAAYYAAAANNNNNNNQQQQQQQWWWWWWWWMWWWVVVVVVVVVVVVVRRWWWSSQQQQQQNNNHHHHHHJJJHJJJJJJJSSSSSSPPPPPPPLLLLLJLJJJJJJJJJKKKKKKJKKKGGGGGGGCCCCCCCAB | ||||||
|  | AAAAAAAAAAAAAANNNNNSSQQQQQWWWWWWWWWWWWWVVVVVVVVVVVWWWWWWSSQQQQQQQNNNHHNNNNNNHHJJJJJJSSSSSSPPPPPPPPLLJJJJJJJJJJJJJJJKKKKJJJKKGGGGGGGCCCCCCAAB | ||||||
|  | AAAAAAAAAAHHAAANNNNSSQQQQQWWWWWWWWWWWWVVVVVVVVVVVVWWWWWSSSSSQNNNNNNNNNNNNNNNJHJJJJJJSSSSSSPPPPPCPLLLJJJJJJJJJJJJJJKKKKJJJJJJGGGGAGGCCCCCCCAA | ||||||
|  | AAAAAAAAAAHWHNNNNNNSSSSQQWWWWWWWWWWWWWVVVVVVVVVVVWWWWWWSSSSQQNNNNNNNNNNNNNNNJJDDJJDDESSSSSSPSSCCCLLLJJJJJJJJJJJFJKKKJKJJJJJTGGGGAAAAACCACAAA | ||||||
|  | AAAUAAAAAHHHHHNNNNNSSSQQQQQWDWWWWWWWWWWWVVVVVVVVVVWWWWWSSSQQQNNNNNNNNNNNNNNNDDDDDDDDESSSSSSSSSSVVJVIJJJJJJJJJJJJJJJJJJJJJJJJJGGGSAAAAAAAAAAA | ||||||
|  | AAAUUUUUAHHHHNNNNSSSSSDQQQQDDWWWWWWWWWWWVVVVVVVVCCWWWWWWSSQQQNNNNNNNNNNNNNNNDDDDDDVDSSSSSSSSSSSGVVVIJJJJJJJJJJJJJJJJJJJJJJJJJGIGSAAAAAAAAAAA | ||||||
|  | UUUUUUUUUUHHHVVNSSSSSSDDDQQQDDDWWWWWWWWVVVVVVVVVCCCWWWWWSQQQQQQNNNNNNNNNNNNNDDDDDDVSSSSSSSSSSSOVVVVVJJJJJJJJJJJJJJJJJJJJJJJJJIIIAAAAAAAAAAAA | ||||||
|  | UUUUUUUURHHHHSSNSSSSSDDDDDDDDDDDDWWWWWWWVVWVVVVVCCCWOOOHHYYQQQQNNNNNNNNNNNNNDDDDDDSSSSSSSSSSSSSVVVVVIIJJJJJJJJJJJJJJJJJJJJJJIIIAAAAAAAAAAAAA | ||||||
|  | UUUUUUUUUUHHHSSSSSSSDDDDDDDDDDDDDWWWWWWWWWWWVWFFFCCCHHHHHYYQQQQNNNNNNNNNNNNNDDDASSSQSSSSSSSSSSSVVVVVVIIJJLJJJJJJJJJJJJJJJJJIIIIAAAAAAAAAAAAA | ||||||
|  | UUUUUUUUUUHHHSSSSSSSSSSDDDDDDDDDDWWWWWWWWWWWFFFFFCCHHHHHHYYYQQQNNNNNNNNNJDDDDDDDSSSSSSSSSSSSSSSSVVVVVVIJJLGOJJJJJDJJJJJJJJIIIIIAAAAAAAAAAAAA | ||||||
|  | UUUUUUUUUUHHSSSSSSSSSOSDDDDDDDDDDWWWWWWWWWWWWFFFFCHHHHHHHHXXXXXQQQXNNNNNJDDDDDDDSUSCSSSSSSSSSSSVVVVVVVVVGGGOOJBJJDDDJJJJJJJJXXXXTAAAAAAAAAAA | ||||||
|  | UUUUUUUUUUHHSSSSSSSSOOSDDDDDDDDDDWWWWWWWWWWWWWWFFCCHHHHHHXXXXXXXXXXXXXJJJDDDDDDDDDDSSSSSSSFSSSSVVVVVVVVVGGGOOGJJDDDDDDJJJJJJXXAAAAAAAAAAAAAO | ||||||
|  | UUUUUUUUUHHSSSSSSSSSODSDDDDDDDDDDWWWWWWWWWWWWWWFQHHHHHTHHXXXXXXXXXXXXXJJJDDDDDDDDDSSSSSSSSFSSSSVVVVVVVVVGGGGGGJJDDDDDPJDDDDJXXXAUXAAAAAAAAAO | ||||||
|  | UUUUUUUUUHHHNNSSSSSSOOODDDDDDDVDDWWWWWWWWWWWWWWFHHHHHHHXXXXXXXXXXXXXXXJJJJJDDDDDDDSSSSSSOTTTSSSVVIIVVGVGGGGGGGGJDDDJJJJJDDDXXXXXXXAAAAAAAAAO | ||||||
|  | UUUUUUUUNNHNNSSSSSSSOOVVDVDVDVVVDWWWWWYWWWWWWWWWWWHWHHNXXXNNNNXXXXXXXJJJJJSDDDDDDDSADISTTTTTTTTVIIIIIINGGGGGGGGGDDDDDDJJDDDXXXXXXXSSAAAAAOOO | ||||||
|  | UUUUUUUUUNNNNNSSSSVVVOVVVVVVVVVVWWWWWWYYYYWWWWWWWWWWHHNNXXNNNNNNXXXXWWWJJJSDDDDDDDDDDDSSSTTTTTVVIIIIPGGGGGGGGGGDDDDDDDDDDDDZXXXXXXSVSAAOOOOO | ||||||
|  | UUUUUUUUUNNNNNSXVVVVVVVVVVVVSSSSWWWWWWWWYWWWWWWWWQQQINNNXNNNNNNNFXXXXJJJJJDDDDDDDDDDDTTTTTTTTTTVIIIIIIIGGGGGGGGGGDDDDDDDDDDXXXXXXXSVVAAOOOOO | ||||||
|  | RURRRRUUUNNNBBVVVVVVVVVVVVVVVSSSSWWSSSYYYWYYWWQQWQQQQNNNNNNNNNNNNXIIIIIJJJDJDDATTDDDTTTTTTTTTTTTMIIIIIIGGGGGGGGGGGDDDDDDDDDDXXXPXVSSVVVVOOOO | ||||||
|  | RRRRRUUUBBNNBYVVVVVVVVVVVVSSVSSSSSSSSSYYYYYYWQQQWQQQQQNNNNNNNNNNNIIIIIBJJJJJDDTTTTTTTTTTTTTTTTTTMIIIIIIIIGGGGGGGGGGGDDDDDDDDXXXXXVVVVVVVVOOO | ||||||
|  | RRRRRRUUBBNNBYVVVVVVVVVVVVSSSSSSSSSSSSSSYYYYWQQQQQQQQCNNNNNNNNNBBBIIBBBJJJJJJJTTTTTTTTTTTTTTTTTTMIIIIIIIIGGGGGGGGGWDDDDDDDDDUUXYVVVVVVVVVVOO | ||||||
|  | RRRRRRRRRBBBBYVVVVVVVVVVVSSSSSSSSSSSSSSSYYYQQQQQQQQQCCNNNNNNNNNBBBIIBBBBJJJJJJJTTTTTTTTTTTKKKTTTMIIIIIIIGGGGGGGGGGDDDDDDDDUUUUXMKVVVVVVVVVVV | ||||||
|  | RRRRRRRRRBBBBYYYVVVVVVVVVSSSSSSSSSSSSSSSYYYYYYQQQQQQQQNNNNNNNNNNNBBBBBBBJJJJJJJTTTTTTTTTTTKKKTTIIIIIIIIIGGGWGGGGGGGDDDDUUUUUUMMMVVVVVVVVVVVV | ||||||
|  | RRRRRRBBBBBBBYBVVVVVVVMVVVMMMSSSSSSSSSSSYYYYYYQQQQQQQQNNNNNNNNNNBBBBBBBJJJJJJJTTTTTTTTTTTKKKXXTIIIKIIIIIWGWWWWWGGGLDDDDDDUUMMMMMMNVVVVVVVVVV | ||||||
|  | RRRRRRRRBBBBBBBVVVVVVVMVVMMMMMSSSSSSSSSSSYYYYYQQQQQQQQQNNNNNNNNNBBBBBBBBJJJJJJTTTTTTTNTTTKKKKKDIKKKKIIKKWWWWWWWWWWLDWDDDDCUUUMMMMMVVVVVVVVVV | ||||||
|  | RRRRRRRRBBBBRBRRTTVVMMMMMMMMMMSSSSSSSSSSSYYYYNNNQQQWQQQNNWJNNNNNBBBBBBBBBBJJJJJNTTTNNNKKYKKKKKKKKKKKKKKKKWWWWWWWWWWWWWDCDCMMMMMMMMVVVVVVVVVV | ||||||
|  | RRRRRRRBBBBRRRRRTTMVMMMMMMMMMMSSSSSSSSSYYYWWYWNNNQQWQAQWWWJJJNNJBBBBBBBBBBJJJNNNNNNNNNNKKKKKKKKKKKKKKKWWWWWWWWWWWWWWWWWCCCRMMMMMMMVVVVVVVVVV | ||||||
|  | RRRRRRRBBBRRRRRHTMMMMMMMMMMMMSSSSSSSSYSYYYWWWWWWNQQWWWWWWJJJJNJJBBBBBBBBBBBBBNNNNNNNNNNNNKKKKKKKKKKKKKKWWWWWWWWWWWWWWWCCCCCMMMMVVVVVVVVVVVVN | ||||||
|  | RRRRDRRRBRRHRHHHTZZZZZMMMMMMMSSSSSSSSYYYYYWWWWWWWQQWWWWWWWWWJJJJBBBBBBBBBBBBBBNNNNNNNNNNNSKKKKKKKKKKKKKWWWWWWWWWWWWWWIICCCCCMMVVVVVVVVVVVVVV | ||||||
|  | DDDDDRRRRRRHHHHHTZZZZZMMMMMMMMSSSSSSSYYYYWWWWWWWWWWWWWWWWWWJJJJRRBNNBBBBBBBBBNNNNNNNNNNNNKKKKKKKKKKKKKWWWWWWWWWWWWWWWIIIICCCCVVVVVVVVVVVVVVV | ||||||
|  | DDDDDRRRRRRHHHHHHHZZZZZZZZMMMSSSSYYYYYYYYWWWWWWWWWWWWWWDWJJJJRRLRNNNBBMMMMMBBNNNNNNNNNNNNPPKKKKKKKKKKKKKWWWWWWWWWWWWWIIICCCCCVVVVVVVVVVVVVVV | ||||||
|  | DDDDDDRRRRRHHHHHHZZZZZZZKMMMMMMMYYYYYYYYYWWWWWWWWWWWWWWWWJJJJRRRRRNRBBBMMMMBBNNNNNNNNNNNNPPPKPKKKKKKKKKKKWWWWWWWUUWWWIICCCCCCVVVVVVVVVVVVVVV | ||||||
|  | DDDDDDDRRRRHHHHHHHZZZZZZZMZMMMMMYYYAYYYYYYWWWWCCCWWWWWWWWJJJJJRRRRRRRBBMMMMNNNNNNNNNNNNTNPPPPPPAKKKKWWWKHWWWWWWWUUSSWIISSSSSCCCVVVVVVVVVVVVV | ||||||
|  | DDDDDDRRRRRVHHHHZZZZZZZZZZZZMMMMMAAAYYYYYAAAAWDCWWWWWWWWWWJJJRRRRRRCRMMMMMMNNNNNNNNNNNNNNPPPPAAAKKKKKKKHHHWWWWWWSSSSSSISSSSCCCCVVVVVVVVVVVVV | ||||||
|  | DDDDRDRRRRVVVVHHZZZZZZZZZZZZMMMMWWAAAAAYYAAAAACCWWWWWWTWWWWJRRRRRRRRRMMMMMMMNNNNNNNNNNNNNPAAAAAAAAKKKHHHHHHHHHHYNNSSSSSSSSCCCCVVVVVVVVVVLLVV | ||||||
|  | DDDDDDDDRRVVVVVVYYVZZZZZZZZZBMMMAAAAAAAAAAABAACCCWCCWTTWWQWRRRRRRRRRRMRMMMMMNNNNNNNNNNNPPPPPAAAAAAAAAHHHHHHHHHYYYNNSSSSSSSCCCCVVVVVVVVVLLLVL | ||||||
|  | DDDDDDDDDRRVVVVVVVVVZZZZZZZZZMMEAAAAAAAAAAAAACCCCCCCWTTTWWRRRRRRRRRRRRRRMMMMMNNNNNNNNNPPPPPPAAAAAAAAAAHHHHHHYYYYYNNSSSSSSSSSCCVVVVVVVVLLLLLL | ||||||
|  | DDDDDDDOOVVVVVVVVVVVVZZZZZZZJZZZCAAAAAAAAAAAACCCCCCCTTTLLRRRRRRRRRRRRRRRRRMMMMNNNNNNPPPPPPPAAAAAAAAAAAAHHHHHYYYYYYYVYSYSSSSCCCCVZVVVVVVLRLLL | ||||||
|  | DDDDDOOOOVVVVVVVVVVVVZZZZZZZZZCCCAAAAAAAAAAAACCCCCCCCCCCXRRRRRRRRRRRRRRRRMMMMMNNNPPPPPPPPPAAAAAAAAAAAHHHYYYYYYYYYYYYYSYYYYYCCCVVZVVVVVVLRRLL | ||||||
|  | DDDOOOVVVVVVVVVVVVVVVZZZZZZZZZCAAAAAAAAAAAAAACCCRRCCCCXNXRRRRRRRRRRRRRRRMMMMMMNPPPPPPPPPPPALAAAAAAAAAAAHYYYYYYYYYYYYYYYYYYYCCCVRVVVVVVVRRLLL | ||||||
|  | OODDOVVVVVVVVVVVVVVVJJZZZZZZZZCAAAAAAAAAAAAAAACHROOOQQXXXXXRRRRRRRSRRRRBSSMMMGPPPPPPPPPPPPPAAAAAAAAAAAHYYOYYYYYYYYYYYYYYYYYYYCRRRRRVVVRRRLLL | ||||||
|  | OOOOOOOOVVVVVVVVVVVVJZZZZZZZZCCCCCCAAAAAAAAAAAARRROXXXXXXXXXRRKRRSSSSSRRSSSSGGPPPPPPPPKKKKKAAAAAAAAAAAHOOOYYYYYYYYYYYYYYYYYYYCCRRRRRRRRRRRRR | ||||||
|  | OOOOOOOOVVVVVVVVVVVVJZZKKZZZGKKKCCAAAAAAAAAAAAARRROOXXXXXXXGGGSSSSSSSSSSSSSCGXGPPKPPPPKUKKKAAAAAMMMMMOOOOOYOYYYYYYYPYYXXXYYYCCRRRRRRRRRRRRRR | ||||||
|  | OOOOOOOVVVVVVVVVVVVVVVVKKKZZGKKKCCAAAAAAAAAAKRRRROORXXXXXXXXGGGGYSSSSSSSSSSSGGGGPKPPPKKKKKKKAAAMMMMMOOOOOOOOOYYYYYYPXXXXXXXYYCRRRRRRRRRRRRRR | ||||||
|  | OOOOOOOVVVVVOVVVVVVVVKKKKKKKKKKCCCARAAAAAALARRRRROORXXXXXXXXXGGGGRRRRSSSSSSSGGGGGKKKKKKKKKKKAAAMMMMMOOOOOOYOYYYYYYYYYXXXXXXYYYYRRRRRRRRRKKKY | ||||||
|  | OOOOOOOOVOOOOVVVVVVVKKKCCKKKKKKCCCGGHAAGALLLRRRRRRRRRXXXXXXXXGGGGRRRRSSGSSSSGGGGGFKKKKKKKKKKKAAMMMMOOOOOOOYYYYYYYYXXXXXXXXYYYYYRRRRRRRRRKKKK | ||||||
|  | OOOOOOOOOOOOOOVVVJJVKKKCCKKKKKKGCGGGGAGGGLLRRRRRRRRXXXXXXXGGGRRRRRRRRRSGRSSSGGGGGGKKKKKKKKKKKKAOOOOOOOWOYYYYYYYYYXXXXXXXXXXXXRRRRRRRRRRRRKKK | ||||||
|  | OOOOOOOOOOOOVVVJVJJJKCCCCCKAEEEGGGGGGGGGGGLRRRRRRRRKXXXXXXGGGRRRRRRRRRSGGGCCGGGGGGGGKKKKKKKKKKKOOOOOOWWWWBYYYYYYYXXXXXXXXXXXXXRRRRRRRRRRRKVV | ||||||
|  | OOOOOOOOOOOOOVVJJJJJJJCCCCKAAAAGGGGGGGGGGFRRRRRRRRKKXXXXXGGGGRRRRRRRRRGGGGCCCGGGGGGGGKKKKKKKKKOOOOOOWWWWWBWTTYYYYYXXXXXXXXXXXXRRRRRRRRRRRVVV | ||||||
|  | OOOOOOOOOOOOOOJJJJJJJJCCCCVAAAGGAAGGGGGAARRRRRRRRRKXXXXXXGGGGRRRRRRRRRGGGCCCCCGGCGGGGGKKKKKKKOOOOOOWWWWWWWWWTTTTYXXXXXXXXXXXXXRRRRRRRVRRVVVV | ||||||
|  | OOOOOOOOOOOOJJJOJJJJJCCCCAAAAAAAAAGGGGAAARRRRRRRRRKKXXXGGDGGGRRRRRRRRRGGCCCCCCCCCGGGGKKKKKKKKOOOOOWWWWWWWWWWWTXXXXXXXXXXXMXXXXHHRRVVVVVVVVVV | ||||||
|  | ONOOONOOOOOOOOOOIJJJJCCCAAAAAAAAAAAGGAAAARRRRRRRRRRKXXXGGRRRRRRRRRRRRRGGCCCCCCCCCGGGGGGKKKKKZOOOOOOWWOWWWWWWWTXXXXXXXXXXMMMMMMMHRRVVVVVVVVVV | ||||||
|  | NNOOONNOONNIIIIIIJJJCCCFAAAAAAAAAAAAGAARRRRRRRRRRRRRRUXZKRRRRRRRRRRRRGGCCCCCCCCCCGGGGGGKKKKKKKOOOOOOOORRWWWWWTTXXXXXXXXXXMMMMMMHRRRVVVVVVVVV | ||||||
|  | NNNNNNNNNNUUIIIIIIIJCCCCCAAAAAAAAAAAAARRRRBRRRRRRRRFFKXKKRRRRRRRRRRGQCCCCCCCCCCCCCGGGGGGGGKKKKOWOOOOOWRRWWWWTTXXXXXXXXXXMMMMMEEMMJJVVVVVVVVV | ||||||
|  | NNNNNNNNNUUUIIIIIIJJJJJJCJAAAAAAAAAAAARPPRRRRRRVVRRFFKKKKRRRRRRRRRRQQCCCCCCCCCCCCCCGGGGGGKKWWWOWWWOOWWRRTTTTTTTXXXXXXXQMMMMMMMMMMJJVVVVVVVVV | ||||||
|  | NNNNNNNNNUUUIIIIIIJJJJJJJJANAAAAAAAAPPRPPPRRLRRRVVRKKKKKPRRRRRRRRRGGQCCCCCCCCCCCCGGGGGGGGGGWWWWWWWWWWRRBBBBBBBBBBXXXQQQQMMMMMMMMMJJVPVVVVVVV | ||||||
|  | NNNNNNNNNNUUUIIIIIIUUJJJJJAAAJAAAAAAPPPPPPPPRRVVVVRKKKKKPRRRRRRRRRGQQCCCCCCCCCCCCCGGGGGGGGGWWWWWWWWWWRRBBBBBBBBBBBBBBBBBQMMMMMMMMMPPPPPVVVYV | ||||||
|  | NNNNNNNNNNUUUIIUIIIUUUJJJJJJAJAAAAPAPPPPPPPKKVVVVKKKKKKKPRRRRRRRRRCCCCCCCCCCCCQUUCGGGGGXXXWWWWWWWWWRRRBBBBBBBBBBBBBBBBBBQMMMMMMMEMMPPPPPPVYV | ||||||
|  | NNNNNNNUUUUUUUUUUIIUUUUUJJJJJJAAAAPPPPPPPPKKKKKKVVKKKKKKPRRRRRRRRRCCCCCCCCCCCCUUUUUUGGXXXXXWWWWWWWRRRRBBBBBBBBBBBBBBBBBBQMMMIIMMEMLPPPPPPPYY | ||||||
|  | NNNNNNNNUUUUUUUUUUUUUUUUUJJJJAAAAPPPPPPPPPPKKKKKKKKKKKKKPRRRRRRRRRCCCCCCHHSSUUUUUUUUGGGXXXXWFFWWWWRYRRBBBBBBBBBBBBBBBBBBBBBBIIJELLLLLLPPYYYY | ||||||
|  | NNNNNNNUUUUUUUUUUUUUUUUIIHJAAAAAAGPPPPPPPPPPKKKKKKKKKKKKKPMPPCCCCCCCCCHHHHHSSUUUUUUUUUXXXXXFFFWFFRRRRRRBBBBBBBBBBBBBBBBBBBBBIIJJLLLLLLLPPYYY | ||||||
|  | NNNNNNNUUUUUJUUUUUUUUUUUHHHHHHAAAAAPPPPFFFFKKKKKKKKKKKKKKKPPCCCCCCCCCCHHHHHSSUUUUUUUUUXXXXXVFFFFFRRRRRRRRRRBBBQBBBBBBBBBBBBBJIJJLLLLLLLPYYYY | ||||||
|  | NNNNNNNNUUJJJUUUJUUUUUUUHHHHHHAAAAAEPPPFFFFKKKKKKKKKKKKKKKPPCCCCCCCCCHHHHHHSHURUUUUUUXXXXXXVVFFFFFFRRRRRRRRBBBQBBBBBBBBBBBBBJJJJLLLLLLLYYYYY | ||||||
|  | NNNNNNNNUUJJJJJJJJJJUUUUIHHHHHAEEEEEPPFFFFFKKKKKKKKLLLKKKKKPCCCCCCCCCHHHHHHSHUYYYYYYYYYYUXFFFFFFFFFFFRRRRNNBBBNBBBBBBBBBBBBBJJJJLJLLLLLYYYYY | ||||||
|  | NNNNNNENUJJJJJJJJJDDUDDHHHHHHEEEEEEEPPFFFFFKKKKKLLLLLLKKKKKKCCCCCCCCCHHHHHHHHGYYYYYYYYYYYYYYYYYFFFFFFRFRFNNBBBNBBBBBBBBBBBBBAJJJJJLLLLLLYYYY | ||||||
|  | NNNNNNNNSSSJJJJJJJDDDDDDHHHHHHEEEEEEFFFFFFFFKZKKLLLLLLKKKKKKKCCKCKCCCHHHHHHHGGYYYYYYYYYYYYYYYYYFFFFFFQQQQQQBBBQBBBBBBBBBBBBBAJJJJJJJLLLQQQQY | ||||||
|  | KNNENSCSSJJJJJJJJJDDDDDDDHHHHEEEEEEFFFFFFFCKKKKKLLLLLKKKKKKKKKKKKKKKHHHHMHHZGGYYYYYYYYYYYYYYYYYFFFFFFQQQQQQQQQQFFCCFFFFAAAAAAAJJJJJJLQQQQQQQ | ||||||
|  | NNNENSSSSJJJJJJJJJDDDDDDDHHHHEEEEEHFFFFFFFLLKLLLLLLLKKKKKKKKKKKKKKKKCTCCCCZZZZYYYYYYYYYYYYYYYYFFFFFFQQQQQQQQQQQNFFFFFFFAAAAAAJJJJJJQQQQQQQQQ | ||||||
|  | EEEEESSSSSJJJJJJJJSDDDDDHHHHHHHEEEHXXFVVFFLLKLLLLLLLLKKKKKEEKKEEKKEKCCCCCCCZZZYYYYYYYYYYYYYYYYFFFFFFQQQQQQQQQQQFFFFFFFFAAAAAAJJJJJQQQQQQQQQQ | ||||||
|  | JEEJEJJJJJJJJJJJJJSDDDDDHHHHHHHEEEHXXXLVFLLLLLLLLLLALEEEEKEEEEEEKKEKCCCCCCCZZZZYYYYYYYKKKKKKKKKFFFFFQQQQQQQQRRRBBRFFFFFAAAAAAJJJRRQQQQQQQQQQ | ||||||
|  | JEJJJJJJJJJJJJUUSSSSDDDDHHHHHHHHHHHHXXLLLLLLLLLLLLLAAEEEEEEEEEEEEEEECCCCCCCCCCZYYYYYYYKKKKKKKKKKFFFFQQQQQQQQQQQQQRFFFFFFAAAAAJJJJQQQQQQQQQQW | ||||||
|  | JJJJJJJJJJJJFFUUSSSSSDHHHHHHHHHHHHHXXXXLLLLLLLLLLLAAAEEEEEEEEEEEEECCCCCCCCCCCCCYYYYYYYKKKKKKKKHFFFFFFQQQQQQQQQQQQRRRGFFGGAAMMMXXHQQQQQQQQQQW | ||||||
|  | JJJJJJJJJJJJJUUUSSSSDDHHHHHHHHHHHHYHXXXXLXLLLLLLLAAAAAAEEEEEEEEECCFCCCCCCCCCCCCYYYYYYYKKKKKKKKKFFFFGGQQQQQQQQQQQQRGGGGGGGXMMXXXXXQQQQQQQQQQQ | ||||||
|  | UJJJJJJJJJJBBUUUSSSSSHHHHHHHHHHHHHHHXXXXXXBBBBLLLAAAAEEEEEEEEEEECCCCCCCCCCCCCCCCCCPPKKKKKKKKKKKKKKGGGQQQQQQQQQQGGRRGGGGGXXXXXXXKXXQQQQQQQQQQ | ||||||
|  | JJJJJJJJJJJBSSSSSSSSSHHHHHHHHHHHHHAHXXXXXXXBBBBAAAAAAAAEEEEEEEEECCCCCCCCCCCCCCCCCPPPKKKKKKKKKKKKKGGGGQQQQQQQQQQGGGGGGGGXXXXXXXXXXXCQQQQQQQOQ | ||||||
|  | KJJJJJJJJJJSSSSSSSSSSHHHHHHHHHHHHHHHXXXXXXBBBBBBBBAAAAAEEEEEEEEOOOCCCCCCCCCCCCPPPPPPPKKKKKKKKKKKKGGGGQQQQQQQQQQGGGGGGGGGXXXXXXXXXYQQQQQQQQQU | ||||||
|  | KJJJJJJJJJJSSOOSSSSSSAHHHHHHHHHHHHHHHXXXXXBBBBBBBAAAAAAEEEEEEEEOOOCCCCCCCCCCCPPPPPPPPPKKKKKKKKKKKGGGGQQQQQQQQQQGGGGGGGXXXXXXXXXXXYQQQQQQQQQU | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,71 @@ | ||||||
|  | ################################################## | ||||||
|  | ##.#...OO#O...O.O..#.#O.............O...O.O.O.OO.# | ||||||
|  | #O#O.....O...O..O#OO..O..OO....OO........#..#....# | ||||||
|  | #..O.O.O...OOO..O..#.#..O.OOO....O.....OO#.O#.#.O# | ||||||
|  | #.....#....O.O..#.#.O...OOO..#...O...O....OO.....# | ||||||
|  | #O.O#.....O....O#.O..OO.O...#O.........O...O.O.OO# | ||||||
|  | #..O..#OO.........O.#...O....O..OOOOO.O....O..O.## | ||||||
|  | ##O#....OOO......#O#.#.##O..O...O.O.OOO#.........# | ||||||
|  | #O....O...O...O#OO.........O.........O.O.......O## | ||||||
|  | #......OOO...OOO.O........OOOO.....O..O.O......O.# | ||||||
|  | #.O....O#...#O.O.OOO...O...O..O...#OO.........O..# | ||||||
|  | #....#O..O.O#.............O...O#.O.#.O....#......# | ||||||
|  | ##..O..O.OOO.O...................O#...O.....#...O# | ||||||
|  | #....O.O........O.O.#O.OO...O....O.....OO....O...# | ||||||
|  | #O...O.O....OOOO.O..#..O..O.#....OOOO#.....OOO.#.# | ||||||
|  | #...#O.........O......OO..O.O..#...OO#.##.#...OO## | ||||||
|  | #...O...OO.#...O....#..O...........#.......O#.O..# | ||||||
|  | #....OO.......O...##.#...O..O.O..#..O.....O.O.O..# | ||||||
|  | #..O.O...O....O..O....O.O..O.O.O.......OO.....O.## | ||||||
|  | #O..O.........O.......O.O.O..O#.OO.O.O.OO......#.# | ||||||
|  | #OO.O..OOO.....OO.#..#....OO..O.#.#.O..O.O.O.O.#.# | ||||||
|  | #..O...O.....OO..#..O...#....O..OO.#O.O...O.O..OO# | ||||||
|  | #.....#OO.O...O...#O..#..OO...O..#OO...........OO# | ||||||
|  | #..#O...O..#.O...O#.....#O.OOOOOO...#.O.O.O.O..O.# | ||||||
|  | #O......##.O..O........#@.....O..O#......O..OO...# | ||||||
|  | #......OOO..O.......#.....OO##...O.#O...#.O..O...# | ||||||
|  | #...O..O.....OO.O.#O.#..O.....O.O...#....O..O....# | ||||||
|  | #O....O.O..O..O..O..O..O..#...O.O.....O#.O.#.#OO## | ||||||
|  | #.O.....OO...OO#........OO....O...O....#........O# | ||||||
|  | #.#.....OO..O.O.#O#.##.O..#O#................OO.## | ||||||
|  | #.........O#OO.O.....#..#...O#O....O.O..O..O.....# | ||||||
|  | #OO....OOO.....O.............#OO#...#....#.O.....# | ||||||
|  | #.O#.....O#...#.O..O...O...#.OO..O...OOO#..#....O# | ||||||
|  | #.#.O.O..O......#...OOO.......##.O..OOO#.O.O.....# | ||||||
|  | #.........#.......#..O.OO.#.OO..O..O.....OOO..O..# | ||||||
|  | #..#...O#O...............OO.O.O.O..O..OO.....#.#.# | ||||||
|  | #O#.O.O.#.O..O#...O..O....O....OO#O.O.OOO.#..O...# | ||||||
|  | #...#.##........OO.O.O..O.....O.O#OO..O.O.O.##O..# | ||||||
|  | #O#...##.#...OO.OO.#O..O..#OO..O.O......O.O......# | ||||||
|  | #.OO....#.O...O........OO..O.......O.O#..O.......# | ||||||
|  | #O..O..O...O...O......OO..O..O.OOO.#...O....#O...# | ||||||
|  | #.....#...#...OO.O...O.#..#..#OO..........O.O.#O.# | ||||||
|  | #....O......O#.O.O...#...O..O.O.....O.O..O.....OO# | ||||||
|  | #..O...#.O..O.O...O......#.#OOO..................# | ||||||
|  | #.O.....OO.O...OO.......O.#...#...O....O.....O...# | ||||||
|  | #O##O.#..OOO...#......O..O..#OO.........O..O...OO# | ||||||
|  | #..O.O...O....O..O....#O.......O......O..OOOO##.O# | ||||||
|  | #..O.#O..O.OOO..#O.......O.#.#OO.O.O.O.O..O.#..#.# | ||||||
|  | #.....O.OOO...#.O.O..O...O.OO...OOO..#.O.O.OO.OOO# | ||||||
|  | ################################################## | ||||||
|  | 
 | ||||||
|  | <v><v><><vv>v<v<^>><><>v^v>v>v<>^v<<>>v>>v>v^><>><v^v><v>v^v>v<^vv>vv><>v^^v>>v>^>>^v<v<^<v^^^<<<<v>>vvv<v<vv^><<>>^>v^^v>v^v>>^vv<^>^v>>^^>>>>v<<>^v>^^><^v>^<<<^<<<v<<v^>>^v<>v>>v<v^^v>v><<^vvv<>>v>>v^^^<vv<>^><^>^<<>>^<>v>v<v<><^>^v>^<^<^^^v>^>v<v^vv^<vvv><v><v><<^<v<v>vv<>>v>>^^v>v<<^<^v<<<^>v<<<^><>v<>v>vvv^^^<v><v^<vv>v^^<v^vv<<^<^v^>v<vvv^^^^<>v>>^>>>>^<>><>v<^^<v<>v^<^v<^v^^^v<><<vv<><vv^>v<><vv^>vv>vv^>vv>v>v>>><v>vv^>v^^v>^vvv^>^v^^<<<^>^>>>^<>^>^v^v^<>v^>^<vv>v<>^^v>>v^<>^><vv^<<<>v>^>>^<<v>vvv>><^><^^<v^>v<^>^<><^><vv<v>v<^><>^^>v^<v<>>vv^><^>v^^<^^vv^>vv^^v>>v<^^v^v>><v<v^^v^v^vv>>^^vv^^v^vv^v<^^>>><><^^<<>v><>v<^^>^<^<v><^vv>v>>>v<<v<<^^>><^>>^^v^<v<>vvvv<vv>^^<>><>>>^^v<><>>^<<<v<<v^^>>>v^>^v><><>^vvv^>>v^^^v>^><v^v^><^^<>v>vvv>vvvv>>>v<^v^^^vv>>v><<v>^<>>^<v^<v>>>v>^v<<^v<^^<^<^vv^v<>v<v<>>v^v<<^^^v>>><v>v^><v<<>>vv<<<v^>^v^^v^>^^^^>v^v<<^^v^>^<>^<<<<v><<><><<<<^vv<^v^<^>>v>>v<^><^>^<^v<^v^>^^v<^^^v^>^><^v>>^<^^^>^^^^v<><<^^<>>>vvvv<<^>v>^>v>^<^v<^^v^<v^><>^^^<^>><<^^><< | ||||||
|  | >^><<>vvv^<>>>^>vv<v^v<<^<><<><<>>^>^>v>vv<v<vvv<<<vv<v><^^><^>vv^v<v>vvv>^^^<>>v^<v<^v<>>^<vv^<v^^v<vv^<<^<>^v><v><>^^>>>^<^v><^^^><<vv^>^>v<<<<>>><>>^>v^^vvvv<>v^^v><v<>><>v<^^<>>vv^v<^<>>>^^^<^^>vvv<^<<v<><v>><^^<^vv<v>vv><>v<v><^^>vvv<><<>v<<^<<<<^v>>><<v^vvv>><v><v><^^^>vvvv><<>^<^>^^>>^^<<^^v^^<<^vvvv<v>vv><>>^v>^>v^<<>>><v><>><<>vv><v^><<v<>><>v><<<>v>v<>^^^v<^>^<^<^<>>>><>v>vv^<<<^v^<<^<>^<v>^^v^>>v^<<^^<><><<<^>>><><v>vv^>v^>><^>>^v>>vv^<v^v<v<v><<^vv<<vv>^vv<v^v>v>v>>v^<vv^<v<>^>>v><>>vvv><>>>>v^<<^^<<^vv>^v>v<v<^<^^><<v>^^>>^<^<vv>>><^vv^^^>v<^^<>v>^^^>^<<<><>vv>^^<^<^<<<vv^v><^>v^v^<>^><^v<<>^>>^v^<<v>v^><v^^<^<<v^^v>v<><v>vvv^<>^v>>^^^v><>>v<<vv^v<^<>^<>>v<><<v<^>^<^v^^^vv><^vv>>^<>>>v<vv^<v^<^>v>>^<v<><>>>>><>v><v^<v^<v^<>vv^v<v^<v^^<v^<>v^v^>vvv<>^v<><^>>v>^<><<^<>^<v^>><^^v<<<vv^v^<v^>^><^^v><><v>v^<<<><v^>v<>^^<<<><>v<^<<<><^^>^^v<<v>v>><<v^vv^>^>^vv^v>v<<v^<v^<<>^<v^><>v>>v><>^v^<^vv<v^<vvv>vv<^vv>v<<>v^^<^<<>^><^^<^v^<v<v>^v<v<<<>^^><<<v<v>v>v><>^<<v^>v<vvv>^v^vvv<<< | ||||||
|  | vv^^><^>v<<vv<<vvvvvv>^>v^><^<v^<><^<v>^v>^<>^^^^><<>^^>>>^>^<>v^<^v^^v<v>vv><><<>>^>>>v<vvvvvv<^>>v<<><<>v^^v<v>^>^<v>^v>vvvv^vv<^><^<v^vvv>>>vv^v<>^>^>^>vvv^><v^<v^>^^^v>>v<^>><<^^v^<>v>><^v<v>v<v<<>^^vv^^v<<<<vv><>>^vv^<^vv<>>v^>vv<^<v>><<^>^>>>^v>vvvv^<v<^^<>vvv><^v<>^<<v<>>v<<^^><v<<v^>>><vv>>v^^<<>v>v^^^<<v<^>v^>^v<^<v^^>><<><^<<<><>^^<v<<><>^v^>>^<>>v>>v<<vv^vv>>>^>vv^v^<>v<<v<<^^<^^<<vv>>>^>v<v^^^v>^<^^<^<>vv>v<^v^><<vv^^^v>>>>^^^>^<v^>>>>^><>><<v^><v^^<<^><v^^<>>>>vv><v^^vv^v>^v^><>v^^<><><^<><<<<v>>v<^>^vv^^v^<^>>>>^v^^^<v^v<^vv>vvvv^^vv<^<>><vv^^<^<>^^<^v^^><<>>^v>><^>v^vvvv><<^v>v>>^v^v<<>v^<^^<v^v>^vv^v<^v<>^v<vv>^>vv>>v<v^><^v<<>^^<v><^>><vv><>v<>^>^>vv^v><vv<v>vv^<<>v>v^^><>vvv>v^<<>^v<<>v>v>>><v<^^^^<>^^v<^vv<v<vv>vv>^vvv>>^^<v>v><^vvv<>^v^<^vv^<vvv^v^v^^><<<>^vv>>>>v><v^<^^^<vvv<^^^^<><>v^v>>^^^^v^>^<v<^^^^>^^>^^><^<^><^<<vv^<vv>>vv<v^<v^^><>^>>><^^^<v<vv^<<^vv><><vv<>>>v^>>v<>v>>>^v^>^<<<^<>v^>^v>>^<<v^<><^<>>v^v<^>^><^>v>><^v^^^>v^>^^<^v^^v>vv>v<^^^<^><^vv^v>v<>v<^vv | ||||||
|  | ^^>v<><<^vvvv>^v>>><^^<vv>v>><<>v>vv>^>>^^>>^><<v^<<><vv<<>v><<><>vv<v><<vv<^<^><v><>^v^<>v>^^>v>^<<<^<>v<<>v<><>v<<v><^>v<<^v<<^v>>v<^<<<^<><^>>^<>^^>>^<v^>^vv<>>^v^<><>^v><<<<^^><^^>>^^^>^v><v<><<^>^<<^<^^<v^>^vv>^>^v<>>>><^v>v^^^>>><>^<>>^^<vv^v>^>>><v>v>><^^v<^><vvv><><>v^><>>>^v<>>vvv><>v><<v>>>v<>v><^><<^<v<>v<><<^><<^v>>^^>><^^v^><v>vv<<^><><v>^>><^><^<^>^v><v>^^v<^^<v^<>v<vv><^<>v^>^^<^v>^<^^>v><<^>^>v>^>^><>^<v>>^<v<^>v<^vvv><v^v<^v^>^v^^^>>>vv<^<>^>>>>v^>^>v^vv^^v<^^v^^>>>^^vv>v>^v<^^v<vv^^>>v^^^^>^^>^^<vv^>v^v<><v^vv^vv><^<^><<<<<<v><<>^vv><vv>><<<v<^^<^<v><^><>>v>>v<v<v>^^v<^^<>^^v<>>v<>>><^>^<><<v<><>^^v<<vv><^v^<<<>v^<^<<^vv^^^<<<>v<^^>^^v>>>>v>>^>^>^<^v^vv^^<>v>><<^v<>v>>><<v>vv^><v>>^^<><<>>>>><^^^<<^>vv^v>^<>>^^^v><v^<<>v>^>vv^<v<^<<^v^v<^<<<vv^<v<vv><^^^><<v<vv^v><<<v><vv<vv<>^^^^v^^vv>>vv^v><^vv<^^v^v<v^>v<<v^>v<>^>>>><^>^>>vv>^>v^v<<<<<v<v<^<>^>vv^<^^><^<^<<>><>^>>>^v><^<<>>^><><<>v<<^v^^<^>v><vv^^vv>^^>^v>>^>vv<<>>>>v<<^>>v<^<><^<>^<<^^v^^<<v><<<^v>v<^>^v<<^><^<^v^ | ||||||
|  | ^>v><>^>v^>^vv^^v<<<<><^^<^><<^v<v>v<<>>>><>^^^v><>v<^v><<<<^<>v>v>^>^><vv<<^>^<><vv>^^>v<v>vvvv>^^^<>vv^>><v>^<^vv<<v<<^^<vv<^<^v^vv><v^^vv^<^>^>^^^^>><^>v^v^^v^<vv^>>><^^^v<^v>>v^<^^v>v>^v>^<vv<^v^v^vvv>>v^><v^><<<>>v^^><v>v><<<^v><>v^^vv^v>>v><>^^^v<v>^<vv>v>^>^v<>><>>v^<><><^vvvv^>^^<>vv<v<<>><<<>><<<<>^v>>v^^^v>vv<<v<vv^<v>><>vv<v<<<<><v^<>^v^v<^>><^<<>^>v>^>v>^>^>>>v^>v>v^v^^^v<^>>>v>><<<<v^v<^<v^v^vv>vv^vv>v^v^><<^<><<<^^>vv<<^<^<v<vv^v>vv^<^^>>>vv^><<<^<><>^>>v<^^v><<<>v^v<<<^<<v<<^v<^v^^^>^<^^<<vv>^<^>^vvv>^^><^><^v>v^>v<v><<<><>v^vv^v<<<<>v^<^^v>v>v^^>^v>^<<>v<^<><^<vv<^<>>^<>>^<v^^vv<<<v<<^>^><^^vv^<<<^vvv^^^>^v^^v^<><^^>^^<^<><>>><^v^>vv^>>><v^v^>v^<<>v<v^<vv>^<^^^<<>^<v^vv>>^^<v^<>>>>^<>v<v<^^><<>v^^<<<^>>^v^^<>>v><v>^v^v^>>^^>^<<<>><<>^^>>>^^<>><>><<<<^<>^>^v^^vv>><v^^<v^><<v>>><v<<<^><>^<<>>v<^v<v><>><^>>^>^<<<^v>^>v^>vvv>>v^^><>>v^v<>v<<v^^>vv><<<^<v^>vv<>^v^^^>^>^<>^>^<v^<>^vvv<<<>^>><><^^^v^<^^>v^<v^<^^v^>^<^^<>v<<>>v>^>^<<>vv^^^<>^v>v^<^v<<v^><v>>^^<<vv<<>>v<<><v>>^v | ||||||
|  | <^>^vvv>>^vv<><>v<v><^>>vv^v^v^<^<<<^<vv<>v>><<v<^>><vv<<v>vv<><>v^v>^><^>>^v<^<<<^v><><><<v^<<<^^<vvv<v>vv<^<v<^v<<><<^v^^v<^<><^<<><<^v<<<><<^v<<^<^<v>^>>v>>>^^>>^vv>>^>v<^v^>^<^<v<^<<<v^v^^><v^^><^<>^v^^><v<>v^><^<<vv^v>v<>v<>^<v^vvv^^v<^^>v^><>><^^>vv><>>v<>>vv^>v^^vvv<v<v>>^v<v>>v>v><vvv<>^>><^vv^<<^>^>^vv^vv<>v^<vv^^><>vv^<<^><^v>>^^^>v^v<><>><v>^^vv<><<^<^v^<>v^v>^<><<<>vv>^<^^>v<>>v>v<^<<>^v<>>>^<v>^>^^<v>>^<<^><v>>v^v<vv>>>^<^v^<^>^<v>><vv^^><^>v>^>^^>><><v<^<<v<v<^^v^><^<<^v<>v>^^v^>v><<<<^>^v<v<v^^^>v>>v^vv>v^^>^><<>^<^<>vv<<v<^^^>><^v^v<v^^<^v^<^^v<^v<><^^v^<^<^^>>^>vvv^<<<^v<<<<<^v^^<>^<>v<<v<^>>^>^>vv^v<vv<^v>vv^v^v<>>^>v^v<v^^v>^v^v^^v^^<<><<^>><>^<>v^<<<><<<^vv>v<vv^>v<vvv<<><<^<<vv^^^v<vvv<^<vvvv>v>^>^v<>>><><^<vv<<v<^<v>^v><<><<v>^<^<<vv<^>v>^>>vv^^>>v<>^vvv>>v><^<<v^v^^^>^>v<><>><>v><<<>v^^vv<^>v<>>^vv>v<^^>v>^>v<<^<^<><v^^<^><v<<<>^^vv^>><v<v<>>^>^^^v^<>^v>>>v^v<>^<<^>>><<v>^>vv<>v>v>^vv^vv^v<v<^^<>><>^v^>^>v><^^^>>^vv^>v>v>v<vvv^v^><^>v^^^>vv>^^>><^^^^<^v<v<><v>^>^ | ||||||
|  | >vv^^vv<^vv>^>^v>^^<^^^<>^^<<^<v><vv<>v><vv^v^<>>vv><<^^<<>^>v^<<v^v<>v^v>v>v<^^v<<vv<>^^<><v^<>^>^<^>><>v^^^>^vv>v<<><v<<<v>><^v<^v^^<>>v^<^vv^<^v^v^^v^^^>^v^^><^><^>^><v>^v>^<>v^v>v^^^^>>v<v<><^^v>><<v^<>>>>^v^v>vvv^v><v>vv<^^v>v<^<vv^<<v>>vv^>v<^^<<^<^v>v^v>>>v^v^v<v>v^v^>><v^>vvvv^>v><^^vvv<vv<<<><>^^<^<>><vv^vv<^>>^v<v^<>^^v<v>>>><v<>v><^v^^<<v^>><^<^v^^>vv<<<v><v^>v>v<vv><v<<v^<^>>v^^<<>v><<<v><>>>>vv<<^v<v^v^v<>>vvv^v^v<^>>v^>^<v><><>><>^<<>v^vv><<><>^^vv^v^^v^><v<<^^>>v^v>v^>>^<v>^<>v^vv^^v^v>v<>^v^<^<>v>v<^v^><vvv^><v<><<^v<>><^v^>>^v<<v^^<<<><v<vv^><><^>vv<<v>^>^<v<^v^>^vv^><v<^>>v<^v^vv<vvv<<^^<<<v><<^^v^^<^<>^v^><><<^^><><<<v^>><>v<>>v>><^^v<v>>vvv>vv>>>><>vv><v<<vv><vv<<^v>^^^>vvvvv>^^<<<v>^vv^^><^<^>^vv^><>>v<>v<^>v>>v^^><^v>>v<>vv^^v<v^v<v>^><>^^<>^^<^>^<>><<v<v>>><>v>vv^<^<<>>^>^vvv>v^><^<<<>><v^v<v^<<<>^>><v<^<v>v^<^>^><v>^><v^vv^>>v<^^^v<<<v<v<v>v<<^<vv^vv^v>>^<>>>v^^vv^<<^><^v<>><^<^<<<^<^v<>><^v^<^v^<<<vv<v^<^<^^v<>v<>vvvvvv>>><>><v>^^<>^>><v^vv^v^>vvv>^>v<v><v^>^vv | ||||||
|  | <<vv><>v>>v>>vvv^>v><<<v>^>^<>^<<^v><^v^v<<v>^<>v>^>vvv<><^^>vvv^v^>><<><<>^<<<><v^^>vvvv>vv>^vv<^>v<>v<^v>v<^^>v<^vvv^^<<<vv<v<<v<v>vv>v><v>><v^v^<<>>>v>^^v^>v^^^>^><<v^vv^v<^v<><v<^<^><vvv>>vv>v^<vv^><><>v>><^v><>vv^^<vv<^v<>>v>^<<^>>>^>vv^<><v<^>v>vv<v><v^<<v<^><^>>><v<^<>>^<v^<<^>^>^v^<<v^v<^^v><>v<<^<v^vv<^>^^^^<>^vvv<<^>>><^><^<v^^^v<>^>^vvv<>^<<>>v<<^^<v^<vv>>^>><^v^<<^^vv><vv<<^v^>><v^^<<v<<vv<<^vv<<vv^v>>^^>v>>v^v^^<v>^><<>^^^>>^v^<v<^^^<v<>v^^v>^>^<<^>>v^v^^^><>>>v^>>^<^><<>^v><<v>^<^>v>><<>>>>v<v>^><^^>>^^>vv>^>^<^v>v^v<<><^v^<^vv>^<<v><<<<v>^v<vv^v>vv<<<><>>><^v^>^><^>>>v<>>^v>>^v^v^>>>v<<^><>v<v<^>>^>^<^><^<v<<^^v^^><vv^>^<><vvv<v<v^^^<v<^><vv^v>>v<<>^<>vv^<<><<<^<>^vv>v^>^v^v^<^<>^><^>>v^^<<<v>>^><<>><<v>><^<<<>^><>vv><^v><<>v^^^^^^>^vvv^^>v>v<^vv^^<<vv>>v^v^>^<<v<v<v>vv><^v<>><^^>>^^<v^<^v>v>>v^v<v>>>v^<>v><^^^<>^>^vv<^v>><^v^><v>>>v<v<<<><<>v^v<<v>^^v^v^<<>^><>v^^><v<vv<^<^^<^v<<>^<^<<^v<><v>^>^<>>v>>v^v<<^^^^<v<>><>>v>><^><v^>>^^>^^<vv^^<<^^>^>^<vvv><<>>vv<<>>><^vvv>>< | ||||||
|  | <<^vv><v><>v><>v^<>>v^v<v<>v^^>vv><>v>>>^v^^>v<^>^^<><^<^<v^^<<>>>^^v><>^<vv^vvv^^vvvv><><^^vv>>^^<^<v<><^^^v>^v^>>^<v^>^^^><<v>><^^>vv<^<^vv^>^>^>^><^v^>^^><v>^<<vv<>v^<^^<vv<<v^^v<^>>^>vvvv<^^<><><vv<>v<^v><v^<<vv>>v<^v><v>^v^^v<^<>>^>v>^<v<<>>>^v>^><<<v<^<vv><v^v^v>^<<><^v<<>^>^vv<<^v><>vvv>vv<v^v>>^<<<v>>v>>>^<^<v>>^>^>^><^<>^>>v><^<v^^<v><>^^<^<^^<^v^^<><^<>>v<^>v<^<v><^v>^>v^>>v>v<<><><<>^<<>vv>v<<^v^^^><v^><><v^><^<<vvv>^<^^vv<><<vv><v>v>^v><v^<<<<>v>v>v<v<v>^>^><vv><<^>vv<>vv^^>>vvv^><><v<^>>^<>v><>vv>>><<>>^>^<<<v^<<^>>>^^^><>>v>>>>>v<>vv<><<^vv>^<^<vv<>>v^vv>>^<^v>v^v^<>>^>>^^<<><^<<>v<<>>>^<<<>v^^>><<vv<>v^v^>><v^^>>^<v^v<vv>>><<v<>vv^v^<v<^vv<<vv>v>^^v><><>v><<>^^<^^^>^v^^>vvv<><><>^><vv^<^v><><<>>v>>>^v^<^v<<<<v>v<><<<>>^<<>^^<<><><>v><<vv^>v^<v<v^vv<v>v>v^^v^v^^v>vv<v>^^>v<>v^<>v>^v^>^>^<v<^^<^v<vv^^>v^^^vv>>>^v>vv>v^^vv^^v^^v^>>^>><^v^>^v<^^>^>>^>^>>>>>vv<>v>^><^^^vvv><v^<^v^<v<>>^vvv<v<>v<<>v^v^<^v<<>>^^v<><^^<vvv>^v<v^^>^v^>><v><^<<>v^<v<>vv>>>><v<>v^v<^<><v^v^vvvv<^<> | ||||||
|  | ^>><>^v^vv<^v^v<^>>vv<<^^^^<><^>>><v<v>^v^^>^<>>vv>vv<><^>>v<<<><^<><^<>^<<><v^<v><v^<^>>>v<^^>^<>^>^<^^>><^>^vvvv^^v^v^>^<>vvvv<>^<v<^v>^^>^<<^><<v^<><vv<^v<v^>^>^<<v^v^v>vv^><<^<v<<v>v<<^>^<>>vv>v<>>>^>v^v>><>>>>v>>^<vv^>^>>vv<vv>v<<^><v>>vvv<<><^^<>^>v^<vv><vv><<^<>^<>vvv><vv^>^vv^vvv^^>^v>>^><vv>v<v^^<^vvv^<<><^>>v^<^<v<<^<vvv<>^><<^><>v<<v^^^v^>v>^vv>v^v^^^>><^>^<<<>^<>v>^^v>v>v<>^vv<<v^><v><><^v^v>^<v>^<^<^v<^vv^>v^^v^>v>^<v<<v<>^<><<v<<<>><v^^^<>^>><>>><v>v<^vv<^v^>>>^^^^v^<><vv>vv>^^v^<v>vv^^^<v>^v>v>^^v<v<v^vv<>><<^^<<^<v^v^^^^>vv^><vv<^>>^><v<vv>^^<^<^^>^^<<<v>>v<vv>v<>>>>v<v>^^^>>vv<^v<><v<<^<>^v>^>v>>^<<^>v<vv><<v<v^>>^v^>>><v>>vv<<<v>>^v<<><vvvv<vv<^<<vv>^<><^<^v<<>v>v^v><vv<^>^>>vvv^^>>v^<vv^<^^<<^>>^>><^>v<<^<>^vv<><^v<^>vv>vvvv^v>^<vv<>vvvv>>>>>v>v>^<>vv<<v>>^v^v<v>>>^vvvv<v><^>vv><>>v>^<^<<^^<>vv>v<^v<^<^><v^vv<>><>^vv<v^<^>^^<v^^>^vvv^>^v^v>v^v><<<<<vv<^^vv^^<>>>>vvv^<^>v^<^>>vv^>v<>^v^<v>vvv>><<>^<v<^>v<v^>^^<v>><vv><v^^v^v<<<<<<<<>>>>>v<^^^v<<^^v^<>v<<<>v>^<>>^^^>>< | ||||||
|  | ><<>v<^<<^v>v^^>vvv^>vvv^>^v><^<v<^<^^<v^v<v>>^><>>vv^<>^>><>^v^><<><vvv<^^^vv<vv^<><><<v^<^v>^^v^<<^<>vvvvv<v>v^><^>v<<^<^^<^>^>v^vv<>vv<>><<>vvv<>vv>^^^v<><v<<<>vv<<>>v^^<^<v>^v>v<<vv^^vv<^<<<<>>><^>>vv<<>^v<<v>^<<v^vv><v>^<^<>v<^vvv>>v>vvv><vvv^<^v><>v<v^<v<v^^^><^>>><vv<^v>^v<^>v^v^v><^>^><<>v^<vv>vvvvv^<v<<vvv<^<>>v>^<<v^<<^^>><v>>vvv<<<>^^<^>^^^<<<v^><^>^>>v>v<^v<^>vvv>vvv^v^v>v>v<^^v<^v>^>><<^><<<><<>>^<<<<^<v^vv><<>vv>^v>>vv>^^>>^<>>^<<<<>v>^^^<^<^<<^^>^v^v^^vv^<>><^vv^>>v>^>>>>vv>^><<v<v^><^v<>^<>>v<v^v<^<v<^><<<v><^<<v>^>><^<><vv<^<^>v<^>v^^v^v<<^>^><vvv>>><<v<<><vv^vv<><^v^>>>vvvv<vv<^v^>v^^v<<<^^<<<v>>^<>^v<<>^^>^^v^<vv^<<>><^<^><>><^^<vv>v<<v>vv<><^^v><<<^v^^>vv<^<<^v^v^^>^><vv><>^vvvvv>>>>^v>><^<><<<>^>v^^^><><^v<^vv^^v<^>>>^><^^<>>v<v^^<<<<<>^v^^><^<<<>^<>^v<>>><>v><<<^vvv<^v^<<v^v^^<v<vvv^<^<^^<v<v^<v^vv^<^vv>v><v^vv<v^<^vv>v^><^>vv>vv<^<v<v^<^^>^<><><<^>^^>v^<^>^^v^v^^<<v^v^v>>v<>v>>^v>>^><v<^v<v><<<><<<v>^v><><^<^v<><<><<>v^<<>v<>vvvv<><^^^<<^^>^>>^>><v<>vv^<<^vv^>>^< | ||||||
|  | <^vv><v^>v>^v><>^<<^>v<>v><^<<><<^v><<v>^>^^<<v^<^><>>v><v>^<><^<v<v^>v<^v>>^^>v><>^>^v^vv>>><<^vv>^<>^<^v^>vv><v>vvvv>^v>>>>v^v^v^v^>><^v^>v<^<v<<^<<vv<^^v>>^>>>^>^^^v<vv>v^<^^>^>^v^^v>v<^<vv^^^>^<^v^v>^vvv<>>vv^v<<v^>^v>>v>^<^^>>>v><<^<<^<^v<v<v>vv^^>>^<^^><<<^^^>^^<>>^<<v<v><^vv>>^v<vvv<>v><><^<v>v<><v<<^v^^>vvv<>^^^><<<<v>^^>>>vv<^v^^>^>^v>>><v^<v<^<<v>^><>^^<<^v^<^>>v<^v^^^>^><><vv<v<v<^^>^v^^<vv<><<^v^><<>>^^^>^^><<<v>v^>^<vv<><<>v><>>v^<^<><><>^^^^>>^v^<v<>^^^<^^>v^^v<vvv<>><v<>v>^<>^vv<^<^^>>vv<<>^^>vvvv><v^v>vv<v>><^v^>^^vv><>v><>v^^><v>^>^^>^<v^^vvv^v>v<^>^<^v<v<vv^>^><>^v<><vv>^<<v<<<>>v>v>v^<v<>^>v<>v^<<^v>^vvvv^v>^vvv<<v>vv>><^v>^<<v<^vv^>vv<v<>^^v<v<<v<^^v^vvv<<vv>v<<<^>vv>v^^v^^^<<><^<v<^^<v^^^>v<^^v<><>^>>><><>^^^v^<>><vv<v><<>v<>>^>^v>^>vv^<<^v^^^<<^vv>>>>^^^^^^<<<<<^vv^v<<<^v<<<<><^^><^<<>>v><<<v^^<>^>>><^^v<^v>>><>v<>>v<^>><^>vv<^><<v>v<<>^^^<<<v^>>>v<v>^<^>>^v<>>^^<^v>v^vv>>^vv>^>>v<<><>^><<>vv<^v><v^<vvvv<^^v<v><^>><^<^<^<<<v<v<>>^vv>^<<^<v^v>>>vv<v<^<v^>v^v>^^^<v< | ||||||
|  | <^>v^^<v^<v^>^>vv<<^<^vv>v>^><^<<vv><^^vvv^>^><v<^v<<^>>v<vvv<v>^>^v>vv^^>^^><v<>>>vv<<^<^v^^^^>^^vv<<<>><^v<<>^^>v^<<v>>vv<v>vvv^v<v>>>vvv>vv^>^^^^^>^v^<<><v<^v><v<v^v>^><v>>v><<<>v^v<>>v>v>^>^<^v>v^v<v>^><>vv^^^>><v<v<<>><>^v^v^^<vv^<^<<vv<^^>>v>v<>^>^^v<v<vv>^>vvv>v^v^><>>^<v>>v^^^v^>>^^v<<<<v>^^>^<>v^v^><v<>v<><<vv>^^^^<v<v<v>v>^^<<<>^v^>v<<<^v^>>^<>^v<^^v^<^><<v^<v^^^v<v^^^^^>^^^v<>>>>^>>v^><v^<<^^^^<^<>v<<<^^>>v^<><v>>v^<>^>><><><<^>^<^>>^v^vv>^<^<>><v<>^<^^^^>^^>^^><v<>v>>><>^^<v^^^^vv<vv^^>^<>v><><^>^^<><><<^<vv><>><^^>>^<v<v<v^<^<<<^v>>v>v>^v^v^^^<^vv<<v<vv^<^<v>>^<v^v>v^>>v<^>^<<><<^<><v^^v><>^v>vv>>>vv><^<v^<^^^^>v^v<<v>>v<>v<<^<><v<<^^vv><><^>^<vv^<<>>>>vv>^>>^^>vv^>^<<v<<^v^><^<>^^^><>v<<>><<>v><^><^v<>^><>v><^<><^v^^vv>>v>^^<^>^^<<^^<<<>^>^>^<><<^>^vv<<^>^v^v<v<>>v^<<<<^>v><>^><v<v>^>v<>^v>>>v^<><<>>v<<<v<<><^>v<vv<v<^>v<^^v^><<>^<^^v^^>>><>v<<<v<^<vv><v<<^<>vv>v>v>v^<>>^<^^<^>vv^<^>^<>^>^vv<vv<>>^><^v^v^>>vvvvv<^<v<<^<^><v<><v>^^vvv<v<^^<>>v^^v<<vv<^^v^<^v><^<<><^><^>^>v | ||||||
|  | <^vv^>^^v^<^v>vv<><<v<^>><v<><<<>>>vv^>^>vv<v<<^^>^^v>v^>^^<<v^v>^<v<<^^<v<><<v^v>^>v^v^vv>>vv<v^>v^><^<^>>>^<<vv><vv^^v^<<<^vvv><v>v>><vv^^>^<^v>v^^>>>><v^<v^<>^vvv<v<v><<>^v<^<<>v>^v<vv<>>v<<^^<v^^v<v<<<>>v><>^v><<v^v>>^v<><<<^v^^^<v>^v^<^vvv<><>>><^^^^<^^^v^v<^>vvvv>vv^>>v<>vvv<v<><>v>v<^vv>v^<<^^<><>v<><<>>>^<vvv<>>^<<>>^vvv>^v>>>>v^>^^<^>>v>>^v^v><^^<>vv^>v^<>v<^>v><<^>^^<>^^v><<<<^v>^v^^^^^v^><v^<^><^^>>>^<^v<^v<>v<vvv<v>^>>v<v<^v>>^>>^^>>v^<>v<>^>v^vv>v^^vv^><>v>^><^v<>>^>>^><>v^^>^^><^v><><<<<><vv^^v^>^<<>^^v^>>><vvv^>^v^v^><^<>vv^vv>^<vv<>v^v>^^<>>vvvv^v^^<^><v><>vvv<<><vv^>><<<^^<<^<>>^>^<>>^<<^^>>>>vv>><v^v^<v^>^<^vv<>v^><>>><vvv<v>vv>vv<v<v^^<>v><>vvv<^^^>vv><vv>>v<^>^<>^<<<^<<^^>v>^vv^>v<<^^^><^>^v><^v>vv^^^v>><v^<^><<^<>><^>v<>^<v>v^<<v><^>>^<<^<vv^><<^^vv^v<vvv><vv^^^<^^^^<vv><<v<v><^v<v^<^vv^>^^<><<>^^^v^<^<<^^v<^><^<<<><><<vv>>^>>>v<<^v^<v><^vv<>><>>^^v<<v><<>>^<>>>^<>^vv<<>v<>vvv>v<^^^v<>>v><^v^^<^^>v<><<^<<^>^^vv>v<v^v><>^^^vv^^>>^vvv>>^>>^v^^>v<>><^><vvvv<><v><^v^>> | ||||||
|  | <v^<^v^^>><^>v><^^<><>v>^>v^<>v<<vvvv>v^^>>^<<vv^vvv>^v^><^>^>>><v^^<>^>>^<v^<^v^^<v^v^>v<>v^<vv^><><v<^<v^v^^><v<^>v^<<<><^v^^>v><>v^<vv<>><^>>^^vv>^^>>vv^<<<^v^vv^>>^<<v>>v>^><vv^^v<^>>v^<^><^<^^^>^^>^v<<>v^<^v>v><<v<<v^>^v^>^^<v<><<^>^v^^vv>vv^^^v>^v>>vv^v^^^>^v^^^^<<<>^^vv^^^><<^vvv^v<vvv><>^<v^v^<v^^<^vvvv<^^<vv<^<>><<v^^>^v^^<^v>^^<v^>^^>>>^<>v^^vv^v^v<v>>><^<>^^><>v<>^<<>>>v<^^<<>>^>>^^^><<><><v^^v<>v^<><>v<>v^<>v^^<^v^^^<>^^v><<^v<v^v>><<>v>v^^v^<<>>^^<>><^^<<<>^v^><^<<^^^^>><^<^^<<v^^><><v><<v^>v^>>^v^>>vvv^^v<^^v^>>v^v><^>^>>^>vv<^><<^^^><>^<v^^v<<<<^^vv^^vv>>^<<<>^>>vv<<v<>>v^v>^^^<^<v^>>^<^>^v^>>^^>>^vv^><^v>>^><<>>^>>v^v<>^^v<<<<^<>v^>><>>v^v^^^^^^vv>vv<^v^><^<>vv>^v<><>vv><v>>^>v^vv^><<><v<vv><<<<v>>^^v<v>>^v>^^><v<v^vv^v^^v<<^<^^v^<<^><<>><vv<^><^>>v^<^^><>^^<>v<^<v<<>>^v^v>>>><vv>v><>>><><^<>^<><v<v>v^>v<>vv<^<<vvv<><v>v<v^v^v>^>vv>^>^^<>v^v>>^><>><<v><<v>>>>v^>>v<v<>v<<<>v><^^^>>^vv^>^v><^^>^^<v^^>^^v><<>v<^<^>^v^<>^><^>><>^>^>>^>^^v>^v<^>^>^><<><>^>>^<v<^>v^<^><v><>^> | ||||||
|  | v>>v^<v^>v^<>>><vv>v^<<>v<<v>>v><>^<>vv<^^^v<<v^v<^><>>>>>^^v^^<<<><>>^v^v^^v>>>><vv<<>>v^<vv><^^^>v^<v^>><<v>v<<<<>v<>>><<<vv<<>^^>v>^v<v><v>>><^<^><^<>vv>v<>vv<><v>^>^v^^v<<>vv<v>v<<<^v>^><<<>^>v><<><^<>^^^^v^>^><>><v^>>^<v<><>^^<^><>>v<v>vv>^<v^^>^<^^><^^<v>v^<^>>vvv<vvv>v>>><<<><<><>vv^^<v^>^^<>>><>>v>^>^<>>v><v^^vv^vv^<><^<vv>>v<^<<^^<<^>>v>><<v<^v<<<>^>>>^v^<v^<vv>>^v<^vv<v^vv^<v<v<<<v<v<^^<v^<><<^<v<<>>v>^vv^><^v<<v>^v>>v^v^><^<^^>^>vv>>^^<><v>v^^<v^^>>>v^>><>>^<>>>>>v>v<<vv^>v^^^^<v>><><^<^^<v>^^>^>^<<<><v^<>>v><<<>^v^^<v>>^>^><>^v>><vvv>v>^><^^<v<><vv^>v^<<<^v^^^v<>v><^^<vv^^v><^v><^^^>^<>vv^^v<vv>^^<<^^><><><<^>^v>><v^>^>>^^v>>^>>>v^<^<^<v<>v<<<<vv^^><<>^>v^^>^>vvv>>^v>^^^><><^<vv<><<<>v>v>v^<<^^<^vv^<vv^>>^v<<^<>^>>^>^<^^v<v<>>v>>^<^>^<^>^^<^>>>><<<vv>vv^^^<^<v><<^^<v^^<>><<v>^v^v^^^^vv^><<v<^<><>^v<^v<^>v^<><^^^>^v<>><^<^v<^v<^^>^<v^v^^^>v^><v>vv<>^><v>>v>v>^<vvvv<^>v<v<>v^<<<v<>v^^^^><<v^^^<^^<v>v>^>v>^v<^<^><<v^v<<^^v>>>><^<>v^><<v<^^^<v<<^vv>^^<^<>v^vv><<<^<<>v^<>^v><^<< | ||||||
|  | ^<^^><v<vv<<<>vvv<v^>>^^><^vv><<^^<<>>>v^v<><v^><v>>>>>^<v^<>^><>vvv^^^<vv>><^<v^><v^^>vv^<>^^v^^v<v^v<>vv>^v^<<<<v>>v<>>><v>^<<>^>>v><^^^>v><<vv<>v<^<<<vv^^^<^>>^<v<>>^>v<><<<><><<vv<^><><><<vv<>>^<<v^>>v>>^<v<v>>><<><v><<><^<>^v^<>^vvv^v<^<<^v^<<^v<^v^^^^v<^>^^<vv>v^><^^^>v>v^>^<>v>vvv^<>v^v<^>>^^>^>^<>>^^<<^>v<<>>^>^<<<><^vv><>><><<^><v^vv<^>v>>^v>^^vv^^<v>^<<v<^<<<^<><v^>v>vv<^><^v^v>vv^>>>v>^>^>vv^>v<v>>vvv^<^v^^<<>><vvv<<v>>^<><<>^<^>^vv^>^vvvv<><<<<^^>v><^^v>^<>>vv^<^v>><^>>^>><^v<^^^>v><<^<<>^^v>vv><^>v^v<>><vv^v>^^<^><^>^>v<<><^<v>^<v^<v<<^^vv<>v^>^^vv>^<vvv<^v>^v><v^v>^<><<><<v>v<^>>v<>^>><v^<<><<><vv<^<>>^v<v<<>>><v^><<<vv<>>v^>vv^^^^<v^^^^vv<^v<<^vv><<v^<<><>^>vv>>^>^>^<>vv><<^^><v^vv<<^><vv^^<^<>^v>^<v<vv^^><^v>^^^<>^vv<v>v>vv>^^><v^^^<^^v<v<<vvv<>v><>>^>>vv^^v^><<<^^<v<v<v>>><v>^^^>^vvv^v<<^<>vv^<<>>><<^<>><>><v><^<v><^vv<^^<v^^v<vvv<<vvv><vvv^vvvv^^<^<^^^<^<^v><^^^<v>v^<<^^>^vvvv^<<vv<^^v^>v>vv<vv<>v^v^^v<^vvv^>>v^<v<^<><v<><v<^v<vv<v<v><^>>^><^v>^vvvv><v<>^^^vv>v^<><^vv | ||||||
|  | ^><<^<<>v^>>v><vvv^v<^>vvvv<>^>>vv<^>>v<v^<<>^^<^<^^^^^^<<^<v^>v^>^^vv^^>v<^><^^><v^<v><<^v>v>>>^^<v>><^^>><<^^>^^^<v^>vv<><vv>>>vv^v^<>v<><^>>v^<v>v>^><<v^v>>^v^^^<<<>v^><v^<^vv<>>>>^>>>>^v^v>><<^>^>>^><^v^>^<v<v><<^>>^>^v<<v^<>^v^v<^>vv>vv^v^<vv<v>^^^v^^>vv>^^^>>v^<<v<>^^<<v>v^v^<v^v><<<v<vv<^v^^vv<vv^vv<<v>><^>v<v<<v>><v^^^<^<v^<>v^vv^>><^>v>>^><<v<^<^v^<<><>v>^<>>v><<^^vv<<v<>^<v^^v^vv>>^v><<>v>v<^<vv^^>v>^<^^<v^^<<v<^<^^>^<^v>>^<<v<>><v<v>v^^^>vv^>^<>v^>v^<<>^<><^>v<v<<v><^<<vvv>^v<><v^><><>>>^<<^<<>v<v<><<^<v<>v>vv>v<><<^v>>><v<^^v^<v>vv>>^<<v^<^>^><<<v^>>^<v>v<<>^>v>>>v<v^vv>^^v<v<<^<^^>^<>>vvvv^v>^^vv^<^><v><<^^><>>><<>^<v^^vv>><<^v><><v<vv><v<<><><vvv^<^^<^><<^<<^<><><>vv<>>^>^^vvv<v^v<<v<><<>^^^^vv<><>^<><v>^<>>>v^v<>^><<<<^<^>^<>vv<>^<v^v<>>><vv>v^<^<><<^>vv^v>v>^>>>^vv<><^>>>>>^^<>^>^^>^^>>vv>v>vv^^v<><v^<^><^<<>v>^<><^v<<><^v><><>^^<^^v^>^^>v^<><><^>v><^><<^vv<<<>^v^<<^^<^<><^<>^<><v<v<^<^<vvv>>><<<v^v^>vv<^>v><<><<^<^v>vv^<>^^v>v^>^<<>v><^<><<v<v><>>^>>v>v>^>v<>^<<v^vvvv> | ||||||
|  | ^^^<><vv<><<<vv<^v>v>>v><><v>><<<v^^vv<><^v><>vv^<^><<<^v>>vv>v<>v<><>>>^^v>>vv<^^<<<v>^^^>v<<>^v^^<<^>^v^<<<<^^>>vv><>>^<v^^v^<<><>>>v>^<v><vv><<v<>^>^<<^v^<>^>vvvv>>>>^><^vv>>^<<^>v^<^^>vv^^>v<<>^<>>v<<^<vvv<^^^><>v>>>^><^^<^><^^<>^>v<>>><<<v^v^vvvvvv^<<^v>><<^><>>v<^<v^<^<>>><v<>vv^><v><^^>v<^vv><><<^<<vv^v>v^><v>^^v<^<v<v^vv>>^^<<<<vvvvvv^>v<>><v>>>^<<^^<v>>^<<v^><><>vv<v^^^<^><>^v^<v^vv^vv>><<^><><v^>^v>^v<v<>^v^v>v>^^v><<>v<<<<>v>v>^<><<><><>v<v^^>^vv>vv><<><<><v<v>^^^^^vv><vvv<><><>><<<>>^>^v>^^<^v^^^>v^><v><><<^<v>^><>vv>vv<^^v<^><^><^<v^<>^<>v^vv<v^v>^>v^^>^^>><>^>>>vv<^^^<<<>v^><<^v><>v><<vv^^><vv^<^><<>>>^^><v<v><<<vv^v><>v><<^<^<v<v^<^<vv<>>><><v^>vv<<v^<vv><v^<><>^v^><><<<v<^^^>v<<vv<<^>>>^^v><>>>vv>><vvv^vv^><<<^v^^^vv<<<^^^<>><v^<v>v>>^><>^^vv<^^vv<^^^vv^>v^>^^<v<v>>>vv^v<<<v^vvv><v<^><v^>^^<v<^>v<^<^v>v^<^v^<^<>>v>>>>v^v>^^<v><^v^v<v<v<>><v^v<>v<^>v<>^<vv>^^<<vvvv<^v^<<<>v^v<^v<><^>><^^^v<<^^<v^v^>>vv^<vvv>>>v>^^>>>^>>^v^>>><>>>>^v^vv<^>><^<v>v>^v><>^^><>v<<v<>>>^<<>><^ | ||||||
|  | >v^^v<<>>^>^<v<<<^^vv<<><^^^v>^>^>v^<>^^<^v><<v>v^><v^>^>>>vv^vv<<<v^<v>^vv^v><^v<<^vv>>^><v>v><>v^v<<>v<<v^v>v><><v>^v<v<v>v^^v>^^>^><^<^v<^>v<vv><v<^^>v<>>^^^v<^vvv<>^<<><>^<^>^v>>^>v<^^>v><<>v<^^>>><^<^>vv<>^<v^<^^<>^^vv>^v><^<^v^^v^><<<^<v>vv<<^^v^^^<^^^^vv>^v>^v^<<v>v^<v>>v<^v>^v^<^><<vv>>v>^>^^<vv<>^^vvvv>^>vvv>><v>vv<v>^><v<^^>>^^vvv>v<<vvv<^^><>v<v<<<<><v^v<<<^^>v<v>>>^>vv^<><v^<v>v<<<>^^v<>^v^v>v>>^<<>>^v>^<v>^<^>^<><>^v^^>>v^<<v><v^>vvv^>><^^>>v^<>^^^>>>><^>^<<^>^<><^<^v>^>^<<v<v<>^^v^^>v><<<<v>>>v^<<^>v^v<><^<>^^vv^vv<^<^v<^^><<v<><^><^<>v^v<^^<^<<^^>><<>^>^>^><<^^v^<>^^^<^>^<>>><v><^^<^^>v^v>^^>^<^vv^>v^<v>^>v><>v^v<<v^v>>>^v<vv<v>>^^^<^^<v<<vv^>^>^<>>^>v^^v<v>^<<>>>^v^>^<^^<^v>^<vvv<^^v^>^<v<^vv<>><<<^v^v><^v^<v^<<>^>^>^<^^^>><><v<v<<vv>^^><>><^v><v^v<><<^^v>>^v<v>>v<>v>^>vvv>>v>^<^^v>vv^^<^>^<><>>>>v^^^v^<<>>v>v^>^<<v^>^><<^v<>>v>^^<<<>^>vv<^^v<>>^<><<<v^v<v>><>^<>>v<^v^<<<<>>>><v>^>vv<v>>^^>v^v><^v<v^><>^<<>v^<^<^<v<><>v<>^v>v>v>^v^^<<<><v^v><<>>v><>v<>^vv<v<vvv^^<<>^<^v | ||||||
|  | @ -0,0 +1,142 @@ | ||||||
|  | ############################################################################################################################################# | ||||||
|  | #.#...................#.........#...............#...#...........#...........#.....#.............#...............................#.#........E# | ||||||
|  | #.#.#.###############.###.#####.###.###.#######.#.#.#####.#####.#######.#.#.#.###.#############.#.#####.#.#####.#####.#.#######.#.#.#.####### | ||||||
|  | #...#.........#...#...#...#...#...#.#...#...#...#.#.....#.#...#...#.......#.#...#...#.........#.....#.#...#.....#...#.#...#.#...#...#...#...# | ||||||
|  | #.###########.###.#.###.###.#####.###.###.#.#.###.###.#.#.#.#####.#.###.###.###.###.#.#######.#####.#.#####.#######.#.###.#.#.#########.#.#.# | ||||||
|  | #...#.#.....#...#...#...#.#...........#...#.#.#...#.......#.....#.#.#.......#...#.....#.#...#...#.#...#...#.......#.#...#.#...#...#...#.#.#.# | ||||||
|  | ###.#.#.#.#####.#.#####.#.#.#########.#.###.#.###.#.#.#####.#.###.#.#######.#.#########.#.#.###.#.###.#.#.#######.#.###.#.#.###.#.#.#.#.#.#.# | ||||||
|  | #.#.#.#.#.......................#.....#...#.#.#...#.#...#.#.#.....#.#.....#...#...#.......#.....#.....#.#...............#.#...#.#.#.#...#.#.# | ||||||
|  | #.#.#.#.#.#.#.#.###.#.###.###.#.###.#.###.#.#.#.###.#.#.#.#.#######.#.###.#####.#.#####.###########.#####.#.#####.###.#.#.###.#.#.#.#####.#.# | ||||||
|  | #.#.#...#...#.#...#...#...#...#...#.#.....#.#.#...#.#...............#.#.#.......#.....#.#.#.......#.......#.#.....#...#.#...#...#.#.......#.# | ||||||
|  | #.#.#########.###.#####.###.#####.###.#####.#.###.#.#.#.#####.#.###.#.#.#############.#.#.#.###.#.###########.#####.#.#.#.#.#####.#######.#.# | ||||||
|  | #.#.......#.....#...#...#...#...#.....#.#...#...#.#.#.#.....#.#...#.#...#...#.......#.#.#...#...#.............#.....#.#.#.#.#...#...#...#.#.# | ||||||
|  | #.#######.#.###.###.###.#.#####.#####.#.#.#####.#.###.#####.#.###.#####.#.#.#.#####.#.#.#####.#.#####.#########.#######.###.#.#.###.#.#.###.# | ||||||
|  | #.....#.#...#.#...#...#.#.#.......#.....#.#.#...#...............................#...............#...#.#...#.....#.......#...#.#.....#.#.....# | ||||||
|  | #.#.#.#.#####.###.###.###.###.###.#.#.###.#.#.#######.###.#.###.#.#.#.###.#.#####.###.#####.#.###.#.###.#.#.#.###.###.###.#######.###.#####.# | ||||||
|  | #.#.#...........#...#.....#...#.....#.....#...#.............#.#.#...#.#.....#...#.#...#.......#...#.....#.#.#.#...#...#...#.....#.....#...#.# | ||||||
|  | ###.#############.#.#######.#.#####.#.#######.#.#############.#.#.###.#.#####.#.#.#.###########.#########.#.###.###.#.###.#.###.#######.###.# | ||||||
|  | #...#.......#.....#.#.......#.#...#.#.......#.#.#.......#.....#...#...#.......#.#.#.#.....#.....#.........#.#...#...#...#.....#...#.....#...# | ||||||
|  | #.###.#####.#.#.###.#.###.#####.#.#########.#.#.###.#.###.#.#.###.#############.#.#.#.#.#.#.#####.#########.#.#####.###.#.#######.#.#####.### | ||||||
|  | #...#...#.#...#.......#...#.....#.#...#.....#.#...#.#.#...#.......#...........#.#.#...#...#.....#.#.........#...#...#.#.#.#.....#.#.........# | ||||||
|  | #.#.###.#.###############.#.#####.#.#.#.#####.###.###.#.###########.###.#####.#.#.#####.#.#####.#.#######.#.###.#.###.#.#.#.###.#.#.###.#.#.# | ||||||
|  | #.#...#...........#.....#.#.#...#.#.#...#...#...#...#.#.#.....#...#.#.#.#.....#.....#...#.#.#...#...#...#.....#...#.#...#.#.#.#...#.#...#.#.# | ||||||
|  | #.#.#.#.#######.###.###.###.#.#.#.#.#####.#####.#.#.#.#.#.###.###.#.#.#.#####.#####.#.###.#.#.#####.#.#.#####.#####.#.#####.#.#####.#.###.#.# | ||||||
|  | #.#.#.........#.#...#.#.....#.....#...#.#.......#.#.#.#.#...#...#.#...#.....#.#.....#.#...#.#.#...#.....#.......#...#.#.....#...#...#.....#.# | ||||||
|  | #.#.#.#########.#.###.#######.#######.#.#.#.#######.#.#.#.#.###.#.#.#.#####.###.#####.#.###.#.#.#.#####.#.#####.###.#.#.#######.#.#########.# | ||||||
|  | #.#...#.........#.#...#.....#.........#.#...#.......#.#...#...#.#...#.#...#.....#...#.#.#...#.#.#...#...#.#.........#...#.......#...#.....#.# | ||||||
|  | #.###.#.###.#####.#.#.#.#.#####.#.#####.###.#.#######.#####.#.#.#.###.#.#########.#.#.#.###.#.#.#####.###.#########.#######.#######.###.#.#.# | ||||||
|  | #...#...#...#...#.#.#.#.#...#...#.#.#.....#.#.#...........#.#...#.#...#.....#...#.#.#.#.....#.#...#.....#...#.....#.#.......#.....#...#.#...# | ||||||
|  | ###.#.###.#.#.#.#.###.#.###.#.###.#.#.#.###.#.###.#.#####.#.#####.#.###.#.#.#.#.#.###.#####.#.###.#.###.#.#.#.###.#.###.###.#.###.###.#.###.# | ||||||
|  | #...#.....#...#.#...#.......#.....#...#.#.....#...#.#...#.#.#...#.#...#.#.#...#.#...#.....#.#.#.....#.....#...#...#...#.#...#.............#.# | ||||||
|  | #.###.#####.###.###.#.#.###.#.#######.#.#.#####.#.###.#.#.#.#.#.#.###.#.#.#####.###.#####.#.#.#.###.#.#.#######.#####.#.#.#####.#.#.###.#.#.# | ||||||
|  | #...#.....#...#.#...#...#...#.#.......#...#...#.#.#...#.#.#...#.....#.#.#.#.#...#...#...#.#.#.#...#.#.........#.#...#...#.#.#...#...#...#...# | ||||||
|  | ###.#.###.#.#.###.#######.###.#.#####.#####.#.#.###.###.###.#.#####.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#########.#.#.#.#####.#.#.#######.#.###.# | ||||||
|  | #.#.......#.#.....#.....#.#...#.....#.......#.#...#.#.#.......#.....#.....#.#...#.#...#.#.#.#.#.#.#...#.#...#.#...#.........#.....#...#.....# | ||||||
|  | #.###.#.###.#####.#.###.#.#.###.###.#########.#.#.#.#.#########.###########.###.#.#####.#.#.#.#.#.#.#.#.#.#.#.#######.#####.#####.###.#.#.#.# | ||||||
|  | #.......#...#...#.#.#.#.#.#.#.#...#.....#.....#.#.#.#.......#.......#...........#.....#.#.#.#.#.#.#...#.#.#...#...#...#...#.....#...#.......# | ||||||
|  | #.#.#.#.#.#.#.#.###.#.#.#.#.#.###.#.###.#.#######.#.#.#.###.#########.#########.#####.###.#.#.###.#.###.#.#######.#.###.#.#####.###.###.###.# | ||||||
|  | #...#.#.#.....#.#...#.#.#.....#...#.#...#.#.#.........#.#.#.......#...#.......#.....#.#...#.#.....#...#...#.......#...#.#.........#.........# | ||||||
|  | #.###.#.###.#.#.#.###.#.#.###.#.#####.#.#.#.#.#.#####.#.#.#.#.###.#.###.#####.#####.#.#.#######.#####.#.#.###.###.###.#.#####.###.#####.###.# | ||||||
|  | #.#...#.#.....#...#...#.#.....#.#.....#.#.#...#.#.....#...#...#.#...#.#...#.#...#.....#.#.....#.......#.......#.....#.......#.#.......#.....# | ||||||
|  | #.#.###.###.#.#####.#.#.#####.#.#.#####.#.###.#.#.#######.#####.#####.###.#.###.#####.#.#.###.#.#.###########.#####.#######.#.#########.###.# | ||||||
|  | #.#...#.....#.....#.#.#.........#.#...#.#...#.#.#.......#.#.....#...........#.#.....#.#...#.#...#.......#...#.#.......#.....#...............# | ||||||
|  | #####.###.#.#.###.###.#####.#.###.#.#.#.###.###.###.#####.#.###.#####.#.###.#.#####.#.#####.#.#######.#.#.#.###.#####.#################.##### | ||||||
|  | #.......#...#.....#.....#.#.#...#.#.#.#...#...#.....#.....#...........#...#.#.....#.#...#...#.......#.#...#.#.......#.......#.......#.......# | ||||||
|  | #.#######.#.#.#####.###.#.#.###.#.#.#####.###.#.#####.#####.#############.#.#.###.#.###.###.#.#####.#######.#.#########.#.#.#.#####.#.#.###.# | ||||||
|  | #.........#...#.....#...#.#...#...#.....#.#.#.#...#.#.#.......#.....#.....#.#...#...........#...#...#.......#...#.......#.#.#...#.#.......#.# | ||||||
|  | #.#######.###.#.#####.###.###.#######.###.#.#.###.#.#.###.###.#.###.###.#.#.###.#.#.#.#######.###.###.###.#####.#.#.#####.#.###.#.#########.# | ||||||
|  | #.......#.#.....#...#.....#.#.........#...#.#...#...#...#...#.#...#...#...#.#...#.#.#.#.....#.#...#...#...#.....#.#.#.....#...#.#.....#...#.# | ||||||
|  | #.###.#.#.#.#.#.#.#.#.###.#.#####.#.###.###.###.#######.#.#.#.#.#####.#####.###.#.#.###.###.#.#.#####.###.#.#####.###.#####.###.#.###.#.#.#.# | ||||||
|  | #.....#.#.#.#.#.#.#.....#.#...#...#.#...#.....#...........#...#.#...#.#...#...#.#.......#.#...#.#...#...#...#...#.....#...#.......#...#.#...# | ||||||
|  | #######.#.#.#.#.#.#####.#.#.#.#.#####.###.#.#############.#####.#.#.#.#.#.###.#.#.#######.#####.#.#.###.###.#.#.#########.#############.###.# | ||||||
|  | #.#.....#.....#.#.#...#.#...#.#.......#...#.#.......#...........#.#...#.#.....................#...#...#...#...#.......#.....#...#...#...#.#.# | ||||||
|  | #.#.#####.#####.#.###.#.#####.#########.#####.#####.#.###########.###.#.#########.#############.#####.###.###########.#.#.#.#.###.#.#.###.#.# | ||||||
|  | #...#...........#.#...#.#.....#.#.....#.......#...#...#...#.....#.#.#.#...#...#...#...........#...#...#.....#.......#.#.#...#.#...#...#.....# | ||||||
|  | #.###.###########.#.#.#.#.#####.#.#.###.#.#.###.#.#####.#.#.###.#.#.#.###.#.#.#.###.#########.#####.###.#####.#.#####.#.#.###.#.############# | ||||||
|  | #.....#.......#.....#.#.#...#...#.#...#.#.......#.#.....#.#.....#.#...#...#.#.#...#.#.#.....#.....#.#.........#...#.....#...#.#.....#.......# | ||||||
|  | #######.#######.#####.#.###.#.#.#.###.#.#######.#.#.#####.#.#.#.#.#####.###.#.###.#.#.#.###.#####.#.#.#.#########.#.#.#.###.#.#####.#.#####.# | ||||||
|  | #.......#...#...#...#.#...#.#.#.#...#.....#.....#.#...#.#.#.#.#...#.....#.#.#...#.#.#...#...#.....#.#.........#...#.#...#.........#.....#...# | ||||||
|  | ###.#.#.#.#.#.###.#.###.#.#.###.#.#########.#####.###.#.#.###.#.###.#####.#.###.#.#.#.###.#.#.#####.#########.#.###.#.###.###.#####.#####.### | ||||||
|  | #...#.#...#.....#.#.....#.#...#...#...#.....#...#.#...#.......#.#...#.....#.#.#.#.#.#.#...#.#.#.......#...#...#...#...#.#.#...#...#...#...#.# | ||||||
|  | #.###.#########.#.#######.###.#####.#.#.#####.#.#.#.#############.###.#.#.#.#.#.###.###.###.#.#.#####.#.###.#####.#####.#.###.#.#.###.#.###.# | ||||||
|  | #.....#.#...#...#.....#.....#.......#...#.....#.....#.............#.....#.#.#...#...#...#...#.#...#.#.#.....#...#.#...#...#...#.#...#.#...#.# | ||||||
|  | #.#####.#.#.#####.###.#.###.#############.#.###.###.#.#############.#.#.###.#.###.###.#####.#.###.#.#.#.#####.###.#.#.#.###.#.#.###.#.#.#.#.# | ||||||
|  | #.......#.#.....#...#.#.....#.....#.....#.#.#...#...#...#...............#...#.....#.........#.#.....#.#.......#...#.#...#...#.#.#.#.#...#.#.# | ||||||
|  | #########.#####.###.#.###.#####.#.###.#.#.#.#.###.#.###.###.###.#######.#.#########.#######.#.###.###.#######.#.###.#####.###.#.#.#.#.###.#.# | ||||||
|  | #.....#...#.....#...#...#...#...#.....#.#.#.#...#.....#.....#.#.....#...#...#.#.......#.....#.......#.....#...........#...#...#.#.#.#.#...#.# | ||||||
|  | #.###.#.#.#####.#.#.###.###.#.#.#####.###.#.#.#.#####.#######.#####.#.#####.#.#.#####.#.###########.#####.###########.###.#.###.#.#.###.###.# | ||||||
|  | #.#.....#.#...#...#...#.......#.#.....#...#.#.#.....#.#.......#.....#.#...#.#.........#...........#.....#...........#.#...#...#.#.......#...# | ||||||
|  | #.#######.#.#.#######.#.#####.###.#.###.###.###.#.###.###.###.#.#####.#.#.#.###.#####.#####.###########.#######.###.#.#.#.###.#.#########.#.# | ||||||
|  | #...#.#...#.#.#.....#.#...#...#...#...#...#.....#.........#...#.#.....#.#...#...#.....#.....#.........#.....#...#...#.#.#.#...#.....#...#.#.# | ||||||
|  | ###.#.#.###.#.#.###.#.###.###.#.#####.#.#.#.#######.#####.#####.#.#.###.###.#.#.#######.#####.#####.#######.#.#.#.###.#.#.#.#######.###.#.#.# | ||||||
|  | #...#...#...#.#...#.#...#...#.#.....#.#...#...#...#.#...#.#.....#.#...#.#.#...#.......#...#...#...#.......#...#...#.#...#...#...#...#...#.#.# | ||||||
|  | #.###.###.###.###.#.###.###.#.#####.#.#.###.###.#.###.#.###.#########.###.#.#.#######.###.#.###.#####.#.#.#########.#.#######.#.#.###.###.#.# | ||||||
|  | #...#.#...#.#...#.#...#.#...#.#.#...#.#.#...#...#...........#.........#.....#...#.........#.#.......#...#.........#.#.#.......#.............# | ||||||
|  | ###.#.#.###.###.###.###.#.###.#.#.###.#.###.#.###############.###.#####.#######.#.#####.#.#.#####.#.#.#.#.#######.#.#.#.###########.###.###.# | ||||||
|  | #...#.#...........#.....#.#.....#...#...#...#.....#.....#...........#...#...#...#.....#.#.#.....#.#.#.#.#.#...#...#...#...........#...#...#.# | ||||||
|  | #.#####.#.###.###.#.#####.#####.###.#####.#.#.#.#.###.#.#####.#####.#.###.#.#.#######.#.#######.#.#.#.#.###.#.###.###.###.#######.#.#.###.#.# | ||||||
|  | #...#...#...#.#...#.#...........#.#.#.....#.#...#.#...#.....#.#...#...#...#.#.#.....#.#.......#.#.#.#.#.....#...#...#.....................#.# | ||||||
|  | ###.#.###.###.#.###.#####.###.#.#.#.#####.#####.#.#.#######.###.#.#.###.###.#.#####.#.#######.#.#.#.#.#########.###.#######.#.#.###.#######.# | ||||||
|  | #...#.#.#.#.......#.....#.........#.....#.......#...#.....#.....#.#.#...#.#...#.....#.#.....#...#.#.........#...#...#.....#.#.#...#.....#...# | ||||||
|  | #.###.#.#.#.#####.#####.#.#######.#####.#.#.###.#####.#.#.#######.###.###.#####.###.#.#.#.#.###.#.#####.#####.###.###.###.#.#.###.#.#.###.### | ||||||
|  | #.#...#...#.#...#.#.....#.#.#.........#.#.#.#...#.....#.#...#...#.....#.......#...#.#...#.#...#...#.....#...#.#.......#.#.#...#...#.#...#...# | ||||||
|  | #.#.#######.#.#.#.#####.#.#.#.#########.#.#.#####.#####.#####.#.#######.#####.#.#.#######.###.###.#######.#.#.#.#######.#.#####.#####.#.#.#.# | ||||||
|  | #...#.......#.#.#.#...#...#.....#.......#.#.........#.#.....#.#.......#.#...#...#.#.........#.#...#.....#.#...#.........#.......#.....#.....# | ||||||
|  | #.###.#.#####.#.#.#.#.###.#####.#.#.#.###.#########.#.#.#.#.#.#.#####.#.#.#.###.#.#.#######.#.#####.###.#.#####.#.###############.###.#.#.### | ||||||
|  | #.#...#.#...#.#.#...#.#...#...#...#.......#.......#...#...#.#.#.#...#...#.#.....#.......#.#.#...#...#.#.#.#.#...#.............#.......#.#...# | ||||||
|  | #.#.#.#.#.#.#.#.#.###.#.###.#.#.#########.#.#####.#######.#.#.#.#.#.#######.#.#########.#.#.###.#.###.#.#.#.#.#########.#######.#####.#.#.#.# | ||||||
|  | #.#.#.#.#.#.#.#...#...#.#.#.#...#.......#.#.#...#.#.....#.#.#.#.#.#.........#.......#.....#...#...#...#...#...#.......#...........#...#.#.#.# | ||||||
|  | #.###.#.#.#.#.###.#.###.#.#.#####.#.###.#.#.#.###.#.###.###.#.#.#.#####.#.###.#####.#.#####.#.#####.#.#########.#####.###.#########.#.###.#.# | ||||||
|  | #.....#.#.#...#.....#.#.#.#.#...#.#.#...#.#.#.....#.#.....#...#.#.....#.#.#.........#.#...#.#.........#.....#...#...#...#.#.#...#...#.....#.# | ||||||
|  | #######.#.###########.#.#.#.#.###.#.#.#####.#.#####.#####.#####.#######.#.#.###########.#.#####.#####.###.#.#.#####.###.#.#.#.#.#.###.#.#.#.# | ||||||
|  | #...#...#.......#.....#...#.#.....#.#.#.....#.....#...#.....#...#.......#.#.#...#.......#.......#...#.#...#...#.....#.#.#.#.#.#...#.....#...# | ||||||
|  | #.#.#.#########.###.#.###.#.#####.#.#.###.#######.#.#.###.#.#.###.#########.#.###.#.#.#############.#.#.#.#######.#.#.#.#.#.#.#####.#.#.#.#.# | ||||||
|  | #.#.#.....#...#...#.#...#.#.....#.#.#.....#.......#.#.....#...#.#.......#...#.....#.#.....#.#.......#...#...#.....#.#.#.#...#.....#.#.#...#.# | ||||||
|  | #.#.#####.###.###.#.#.###.#####.###.#########.###########.#####.#.#####.#.#####.###.#.###.#.#.###.#########.#.#.###.#.#.###.#####.#.#.#.#.#.# | ||||||
|  | #.#.....#.........#.#...#.....#...#.........#.#...........#.....#.#.#...#.#...#.#.#.#.#.....#...#...........#.#.#.#...#.#.#.#...#.....#...#.# | ||||||
|  | #.#####.#####.#.#######.#####.###.#.#######.#.#.###.###########.#.#.#.###.#.#.#.#.#.#.#####.###.#####.#######.#.#.#.###.#.#.#.#.###.#.#.#.#.# | ||||||
|  | #.#...#.....#.#.#.......#.....#...#.....#.#.#.#.#...#.#.......#.....#...#...#.....#.#...#.#.#.#.#...#...#.....#.#...#...#...#.#.#...#.....#.# | ||||||
|  | #.#.#.#####.#.#.###.#####.#####.#######.#.#.#.###.###.#.###.#.#####.###.#####.#####.#.#.#.#.#.#.#.#.###.#.#####.#####.###.###.#.#.#.#.#.###.# | ||||||
|  | #.#.#.....#.#.#...#.......#...#...#.....#.#.#.....#...#...#.#.......#.......#...#...#.#.#.....#...#...#.#...#...#...#.#.........#.#.........# | ||||||
|  | #.#####.#.#.#.###.#########.#.###.#.#.###.#.#######.#.###.#.#######.#.###.#.###.#.###.#.#########.#####.#.###.###.#.#.###########.#.#.#.#.### | ||||||
|  | #...#...#.#.#.#.#...#.....#.#...#...#.....#.#.......#.#...#...#.......#...#...#.#...#.#.#...#.....#.....#.#...#...#.#...........#.#...#.....# | ||||||
|  | ###.#.#####.#.#.###.#.###.#.###.###.#####.#.###.###.###.#####.#########.#####.#.###.#.#.#.#.#.#####.###.#.#.###.###.###########.#.#########.# | ||||||
|  | #...#.......#.....#...#.#...#.#...#.#.....#...#...#.....#...#.#.......#.#.....#.......#.....#.#...#.#...#.#...#.#.#.....#.....#.#...........# | ||||||
|  | #.#####.#########.#####.#####.###.#.#########.###.#.#####.###.#.#####.#.#.#.#.#########.#.#.#.#.###.###.#.###.#.#.#####.#.#.###.#.#.###.#.### | ||||||
|  | #.....#.....#...#...#.........#...#...........#.#.....#.....#...#.....#.#.#.............#.#...#...#...#.#.#.#.#.......#.#.#.....#...#...#.#.# | ||||||
|  | #.###.#.#.###.#.###.#.#.###.#.#.###.#.#########.#####.#.###.#####.#####.#.#.#############.#######.###.#.#.#.#.###.#####.#.#########.#.###.#.# | ||||||
|  | #.#...#...#...#.....#.#...#...#.#...#...#.........#...#...#.....#.......#.#.#.....#.....#...#.....#.#.....#.#...#.#.....#.........#...#.#.#.# | ||||||
|  | #.#.###.###.#############.#.#.#.#.#####.#.#.#####.#.###########.###.#####.###.###.#.###.###.###.#.#.#.###.#.###.#.#.###.#########.###.#.#.#.# | ||||||
|  | #.#.......#...#...........#...#.#.......#.#...#...#.#.........#.........#...#...#.#...#.....#...#...#.#...#...#...#.#.......#.....#...#.....# | ||||||
|  | #.#####.#.###.#.#######.###.#.#.#######.#.###.###.#.#.#######.#.#######.#.#.#.#.#.###.#######.#####.#.#.###.#.#####.#######.#.#####.###.###.# | ||||||
|  | #.#.....#...#.......#...#...#.#.....#...#.........#.#.#.....#.#.......#.#...#...#.#...#...#.......#.#.#.#.......#.........#.#...#...#.....#.# | ||||||
|  | #.#.###.###.#####.#.#.###.#.#.#####.#.#.###.###.###.#.#.###.#.#.#####.#.#.#####.#.#.#####.#.#####.#.#.#.###.###.#.#######.#.###.#.###.#.#.### | ||||||
|  | #.#.#.#...#.......#.#.#...#.#.......#.#...#.#.#.....#.#...#...#.....#.#.#...#...#.#.#...#.....#.#.#.#.#.....#.#.#.......#.#.#.#.#.#.....#...# | ||||||
|  | #.#.#.#.#.###.###.###.#.###.###.#.#.#.###.#.#.###.###.###.###.#####.#.#####.#.###.#.#.#.#####.#.#.#.#.#######.#.#####.#.#.#.#.#.#.#.###.#.#.# | ||||||
|  | #.#...#.....#.#...#...#.#.#.#.#.#.#.#.#.#...#.....#...#.#.....#.....#.....#...#.#...#.#.....#...#.#...........#.......#.#.#...#.#.#.#.#.....# | ||||||
|  | #.#####.#.###.#####.#.#.#.#.#.#.#.#.#.#.#####.###.#.###.#####.#####.#####.#####.#####.#####.#####.#.###########.#######.#.###.#.#.#.#.#.#.#.# | ||||||
|  | #.#.....#.#...#...#...#.#.#.#...#.#.#...#.....#...#.#.....#.#.....#.....#...#.........#...#...#...#.......#.........#...#.#...#.#.....#.#.#.# | ||||||
|  | #.#.#####.#.###.#.#.#.#.#.#.###.#.#####.###.###.###.###.#.#.###.#.#.#####.#.#.#.#####.#.#.###.#.#.#######.#.#.#.#####.###.###.#.#######.#.#.# | ||||||
|  | #...#.....#.....#...#...#.....#.#.#...#.....#.#.....#...#.#.#.....#.#...#.#...#.........#...#.#.#...#...#...#.#.#...#...#...#.#.#.......#...# | ||||||
|  | #######.###########.#.#######.###.#.#.#######.#######.###.#.#.#######.#.#.#.###.#.###########.#.###.#.#.#####.###.#.###.###.#.#.#.#####.#.### | ||||||
|  | #.....#.......#...#.#...#...#.....#.#...........#.....#.....#.........#...#.....#.........#...#...#.#.#.....#.....#.........#.#.#.#...#.....# | ||||||
|  | #.###.#####.#.#.#.#.###.#.#.#####.#.#.#######.#.#.###.#.###.#############.###############.#.###.#.#.#####.#.#############.#.###.#.#.#.#.#.#.# | ||||||
|  | #...#.#.....#.#.#.#...#...#.#.....#.#...............#.#.............#.....................#...#.#.....#...#.........#...#.#.#...#...#...#.#.# | ||||||
|  | #.#.#.#.#.#.#.#.#.#######.#.#######.###############.#.#.###########.#######.#.###########.###.#.#.###.#.#.#####.###.###.#.###.###.#####.#.#.# | ||||||
|  | #.#.#.#.#.....#.#...........#.......#.#.....#.....#.#.#.......#...........#.#.#.....#.......#.#.#.#...#.#...#...#.......#.#...#...........#.# | ||||||
|  | ###.#.#.###.###.###.#.#######.#######.#.###.#.###.###.#.#.#.#.###.#######.#.#.#.###.#######.#.#.#.#.###.###.#.#.#.#######.#.###.#####.#####.# | ||||||
|  | #...#.#.#.......#...#.........#.......#.#...#...#...#...#.#.#...#.#...#...#.#.#...#.......#...................#.#.#.......#...#.#...#.#...#.# | ||||||
|  | #.###.###.#.###.#####.###########.#.###.#.###.#.###.###.#.#.###.###.#.#.###.#####.#######.###.###.#.#####.#####.#.#.#####.#.#.###.#.###.#.#.# | ||||||
|  | #...#...#.....#.#.....#.........#.#.#...#.#...#...#.......#...#.....#.#...#.....#.....#.#...#...#.#...#...........#.....#.#.#...#.#.....#.#.# | ||||||
|  | #.#.###.#.#.#.###.###.#.#######.#.###.###.#.#####.#####.#####.#######.###.###.#.#####.#.###.###.#.#.#.#############.###.#.#.###.#.#######.#.# | ||||||
|  | #.#...#.#...#...#.#.#.........#.#.#...#...#.#.....#...#.#.....#...#...#...#...#...#...#...#.#...#...#.#...........#.#...#.....#.#.#.........# | ||||||
|  | #.###.#.###.###.#.#.#.#####.#.#.#.#.###.#####.#####.#.###.#####.#.#.###.###.###.#.#.###.#.#.#.#####.#.#.#########.###.###.#.###.#.########### | ||||||
|  | #...#.#.#.......#.#.#...#...#.#.#.#...#.......#...#.#...#.......#.#.#.......#...#.....................#...#.....#.#...#...#.....#...........# | ||||||
|  | ###.#.#.#.#.#####.#.#.#.#.###.#.#.###.###.#####.#.#.###.#####.#####.#.#######.#.#.###.#.#.#.#.###.#.#.###.#####.#.#.#######.###########.###.# | ||||||
|  | #.#.#.#...#.......#.....#.#...#.#...#...#.#.....#.#.#...#.....#.....#...#.......#.#...#.#.#.#...#.#...#.#.#...#.....#.....#...#.......#.#...# | ||||||
|  | #.#.#.#####.#########.###.#.#.#.#.#####.###.#####.#.#.###.#####.#########.#####.#.#.###.#.#.###.#.#.###.#.#.#.#######.###.#.#.#.#####.###.### | ||||||
|  | #...#.#.....#...#...#.#.....................#...#.#.#.#...#.......................................#.#...#...#.#...#...#.#.....#.#...#...#...# | ||||||
|  | #.###.#.#####.#.#.#.#.#.###.#######.#.###.#.#.#.#.#.#.#.###.#####.#####.#.#.#.#.###.#.###.#######.#.#.#.#####.#.#.#.###.#####.#.#.#####.###.# | ||||||
|  | #S..#.........#...#.....#...........#...#.....#.#...#.....#...........#.....#.#.......#...........#...#.....#...#...............#...........# | ||||||
|  | ############################################################################################################################################# | ||||||
|  | 
 | ||||||
							
								
								
									
										14
									
								
								main.py
								
								
								
								
							
							
						
						
									
										14
									
								
								main.py
								
								
								
								
							|  | @ -8,3 +8,17 @@ import src.day_04.part_1 | ||||||
| import src.day_04.part_2 | import src.day_04.part_2 | ||||||
| import src.day_05.part_1 | import src.day_05.part_1 | ||||||
| import src.day_05.part_2 | import src.day_05.part_2 | ||||||
|  | import src.day_07.part_1 | ||||||
|  | import src.day_07.part_2 | ||||||
|  | import src.day_10.part_1 | ||||||
|  | import src.day_10.part_2 | ||||||
|  | import src.day_11.part_1 | ||||||
|  | import src.day_11.part_2 | ||||||
|  | import src.day_12.part_1 | ||||||
|  | import src.day_12.part_2 | ||||||
|  | import src.day_13.part_1 | ||||||
|  | import src.day_13.part_2 | ||||||
|  | import src.day_15.part_1 | ||||||
|  | import src.day_15.part_2 | ||||||
|  | import src.day_16.part_1 | ||||||
|  | import src.day_16.part_2 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,29 @@ | ||||||
|  | def main(): | ||||||
|  |     lines = open('inputs/07.txt').read().splitlines() | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     for line in lines: | ||||||
|  |         test_value, params = line.split(": ") | ||||||
|  |         test_value = int(test_value) | ||||||
|  |         params = [ int(p) for p in params.split(' ') ] | ||||||
|  | 
 | ||||||
|  |         if calculates_somehow(test_value, params): | ||||||
|  |             total += test_value | ||||||
|  |      | ||||||
|  |     print(f"Day 07 part 1: {total}") | ||||||
|  | 
 | ||||||
|  | def calculates_somehow(test_value, params): | ||||||
|  |     # print(test_value, params) | ||||||
|  |     if len(params) == 0: | ||||||
|  |         return False | ||||||
|  |     elif len(params) == 1: | ||||||
|  |         return params[0] == test_value | ||||||
|  |     else: | ||||||
|  |         h1, h2, t = params[0], params[1], params[2:] | ||||||
|  |         return ( | ||||||
|  |             calculates_somehow(test_value, [ h1 * h2 ] + t) or | ||||||
|  |             calculates_somehow(test_value, [ h1 + h2 ] + t) | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | # if __name__ == '__main__': | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,33 @@ | ||||||
|  | def main(): | ||||||
|  |     lines = open('inputs/07.txt').read().splitlines() | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     for line in lines: | ||||||
|  |         test_value, params = line.split(": ") | ||||||
|  |         test_value = int(test_value) | ||||||
|  |         params = [ int(p) for p in params.split(' ') ] | ||||||
|  | 
 | ||||||
|  |         if calculates_somehow(test_value, params): | ||||||
|  |             total += test_value | ||||||
|  |      | ||||||
|  |     print(f"Day 07 part 2: {total}") | ||||||
|  | 
 | ||||||
|  | def calculates_somehow(test_value, params): | ||||||
|  |     # print(test_value, params) | ||||||
|  |     if len(params) == 0: | ||||||
|  |         return False | ||||||
|  |     elif len(params) == 1: | ||||||
|  |         return params[0] == test_value | ||||||
|  |     else: | ||||||
|  |         h1, h2, t = params[0], params[1], params[2:] | ||||||
|  |         return ( | ||||||
|  |             calculates_somehow(test_value, [h1 * h2] + t) or | ||||||
|  |             calculates_somehow(test_value, [ h1 + h2 ] + t) or | ||||||
|  |             calculates_somehow(test_value, [concat_operator(h1, h2)] + t) | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  | def concat_operator(a : int, b : int) -> int: | ||||||
|  |     return int(str(a) + str(b)) | ||||||
|  | 
 | ||||||
|  | # if __name__ == '__main__': | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,41 @@ | ||||||
|  | def main(): | ||||||
|  |     grid = [ [ int(c) for c in line.strip() ] for line in open('inputs/10.txt') ] | ||||||
|  | 
 | ||||||
|  |     WIDTH = len(grid[0]) | ||||||
|  |     HEIGHT = len(grid) | ||||||
|  | 
 | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     # print(WIDTH, HEIGHT) | ||||||
|  | 
 | ||||||
|  |     for y, line in enumerate(grid): | ||||||
|  |         for x, c in enumerate(line): | ||||||
|  |             if c == 0: | ||||||
|  |                 s = set() | ||||||
|  |                 s.add(( x, y )) | ||||||
|  |                 total += search(0, s, grid) | ||||||
|  |      | ||||||
|  |     print(f"Day 10 part 1: {total}") | ||||||
|  | 
 | ||||||
|  | def search(level, items, grid) -> int: | ||||||
|  |     if level == 9: | ||||||
|  |         return len(items) | ||||||
|  | 
 | ||||||
|  |     s = set() | ||||||
|  |     new_level = level + 1 | ||||||
|  |      | ||||||
|  |     for x, y in items: | ||||||
|  |         if x - 1 >= 0 and grid[y][x - 1] == new_level: | ||||||
|  |             s.add(( x-1, y )) | ||||||
|  |         if x + 1 < len(grid[0]) and grid[y][x + 1] == new_level: | ||||||
|  |             s.add(( x+1, y )) | ||||||
|  |         if y - 1 >= 0 and grid[y-1][x] == new_level: | ||||||
|  |             s.add(( x, y-1 )) | ||||||
|  |         if y + 1 < len(grid) and grid[y+1][x] == new_level: | ||||||
|  |             s.add(( x, y+1 )) | ||||||
|  | 
 | ||||||
|  |     return search(new_level, s, grid) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # if __name__ == '__main__': | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,41 @@ | ||||||
|  | def main(): | ||||||
|  |     grid = [ [ int(c) for c in line.strip() ] for line in open('inputs/10.txt') ] | ||||||
|  | 
 | ||||||
|  |     WIDTH = len(grid[0]) | ||||||
|  |     HEIGHT = len(grid) | ||||||
|  | 
 | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     # print(WIDTH, HEIGHT) | ||||||
|  | 
 | ||||||
|  |     for y, line in enumerate(grid): | ||||||
|  |         for x, c in enumerate(line): | ||||||
|  |             if c == 0: | ||||||
|  |                 s = set() | ||||||
|  |                 s.add(( x, y )) | ||||||
|  |                 total += search(0, s, grid) | ||||||
|  |      | ||||||
|  |     print(f"Day 10 part 2: {total}") | ||||||
|  | 
 | ||||||
|  | def search(level, items, grid) -> int: | ||||||
|  |     if level == 9: | ||||||
|  |         return len(items) | ||||||
|  | 
 | ||||||
|  |     s = [] | ||||||
|  |     new_level = level + 1 | ||||||
|  |      | ||||||
|  |     for x, y in items: | ||||||
|  |         if x - 1 >= 0 and grid[y][x - 1] == new_level: | ||||||
|  |             s.append(( x-1, y )) | ||||||
|  |         if x + 1 < len(grid[0]) and grid[y][x + 1] == new_level: | ||||||
|  |             s.append(( x+1, y )) | ||||||
|  |         if y - 1 >= 0 and grid[y-1][x] == new_level: | ||||||
|  |             s.append(( x, y-1 )) | ||||||
|  |         if y + 1 < len(grid) and grid[y+1][x] == new_level: | ||||||
|  |             s.append(( x, y+1 )) | ||||||
|  | 
 | ||||||
|  |     return search(new_level, s, grid) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # if __name__ == '__main__': | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,91 @@ | ||||||
|  | use crate::utils; | ||||||
|  | use std::collections::HashMap; | ||||||
|  | 
 | ||||||
|  | type Collection = HashMap<Stone, Count>; | ||||||
|  | type Count = u64; | ||||||
|  | type Stone = u64; | ||||||
|  | 
 | ||||||
|  | pub fn answer(text : String) -> ( Count, Count ) { | ||||||
|  |     let coll = stones_from_string(text); | ||||||
|  | 
 | ||||||
|  |     let c_25 = blink_at_collection_times(coll, 25); | ||||||
|  |     let p1 : Count = collection_size(&c_25); | ||||||
|  | 
 | ||||||
|  |     let c_75 = blink_at_collection_times(c_25, 50); | ||||||
|  |     let p2 : Count = collection_size(&c_75); | ||||||
|  | 
 | ||||||
|  |     ( p1, p2 ) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn blink_at_collection(coll : &Collection) -> Collection { | ||||||
|  |     let mut newc : Collection = HashMap::new(); | ||||||
|  | 
 | ||||||
|  |     for (key, value) in coll.iter() { | ||||||
|  |         let (stone1, mstone2) = blink_stone(*key); | ||||||
|  | 
 | ||||||
|  |         newc.entry(stone1) | ||||||
|  |             .and_modify(|counter| *counter += *value) | ||||||
|  |             .or_insert(*value); | ||||||
|  |         
 | ||||||
|  |         if let Some(stone2) = mstone2 { | ||||||
|  |             newc.entry(stone2) | ||||||
|  |                 .and_modify(|counter| *counter += *value) | ||||||
|  |                 .or_insert(*value); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     newc | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn blink_at_collection_times(start : Collection, n : u8) -> Collection { | ||||||
|  |     let mut coll : Collection = start; | ||||||
|  | 
 | ||||||
|  |     for _ in 0..n { | ||||||
|  |         coll = blink_at_collection(&coll); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     coll | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn blink_stone(stone : Stone) -> (Stone, Option<Stone>) { | ||||||
|  |     if stone == 0 { | ||||||
|  |         ( 1, None ) | ||||||
|  |     } else if let Some(( s1, s2 )) = split_stone(&stone) { | ||||||
|  |         ( s1, Some(s2) ) | ||||||
|  |     } else { | ||||||
|  |         ( 2024 * stone, None ) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn collection_size(coll : &Collection) -> Count { | ||||||
|  |     coll.iter().map(|(_, v)| v).sum() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn split_stone(stone : &Stone) -> Option<(Stone, Stone)> { | ||||||
|  |     let s : String = stone.to_string(); | ||||||
|  | 
 | ||||||
|  |     if s.len() % 2 == 0 { | ||||||
|  |         let i = s.len() / 2; | ||||||
|  |         let s1 = str_to_stone(&s[..i])?; | ||||||
|  |         let s2 = str_to_stone(&s[i..])?; | ||||||
|  |         Some(( s1, s2 )) | ||||||
|  |     } else { | ||||||
|  |         None | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn stones_from_string(s : String) -> Collection { | ||||||
|  |     let mut collection = HashMap::new(); | ||||||
|  | 
 | ||||||
|  |     for stone in s.split(" ").filter_map(str_to_stone) { | ||||||
|  |         collection.entry(stone) | ||||||
|  |             .and_modify(|counter| *counter = *counter + 1) | ||||||
|  |             .or_insert(1); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     collection | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn str_to_stone(s : &str) -> Option<Stone> { | ||||||
|  |     s.trim().to_string().parse::<Stone>().ok() | ||||||
|  | } | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | import functools | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     for stone in open("inputs/11.txt").read().strip().split(" "): | ||||||
|  |         total += count_stones(int(stone), 25) | ||||||
|  |      | ||||||
|  |     print(f"Day 11 part 1: {total}") | ||||||
|  | 
 | ||||||
|  | @functools.cache | ||||||
|  | def count_stones(number : int, blinks : int) -> int: | ||||||
|  |     """Count the number of stones after a given number of blins""" | ||||||
|  |     if blinks <= 0: | ||||||
|  |         return 1 | ||||||
|  |     elif number == 0: | ||||||
|  |         return count_stones(1, blinks - 1) | ||||||
|  |      | ||||||
|  |     s = str(number) | ||||||
|  | 
 | ||||||
|  |     if len(s) % 2 == 0: | ||||||
|  |         i = len(s)// 2 | ||||||
|  | 
 | ||||||
|  |         return count_stones(int(s[:i]), blinks - 1)+ count_stones(int(s[i:]), blinks - 1) | ||||||
|  |      | ||||||
|  |     else: | ||||||
|  |         return count_stones(2024 * number, blinks - 1) | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | import functools | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     for stone in open("inputs/11.txt").read().strip().split(" "): | ||||||
|  |         total += count_stones(int(stone), 75) | ||||||
|  |      | ||||||
|  |     print(f"Day 11 part 2: {total}") | ||||||
|  | 
 | ||||||
|  | @functools.cache | ||||||
|  | def count_stones(number : int, blinks : int) -> int: | ||||||
|  |     """Count the number of stones after a given number of blins""" | ||||||
|  |     if blinks <= 0: | ||||||
|  |         return 1 | ||||||
|  |     elif number == 0: | ||||||
|  |         return count_stones(1, blinks - 1) | ||||||
|  |      | ||||||
|  |     s = str(number) | ||||||
|  | 
 | ||||||
|  |     if len(s) % 2 == 0: | ||||||
|  |         i = len(s)// 2 | ||||||
|  | 
 | ||||||
|  |         return count_stones(int(s[:i]), blinks - 1) + count_stones(int(s[i:]), blinks - 1) | ||||||
|  |      | ||||||
|  |     else: | ||||||
|  |         return count_stones(2024 * number, blinks - 1) | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,64 @@ | ||||||
|  | import itertools | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     lines = [ [ c for c in line.strip() ] for line in open('inputs/12.txt') ] | ||||||
|  | 
 | ||||||
|  |     width = len(lines[0]) | ||||||
|  |     height = len(lines) | ||||||
|  | 
 | ||||||
|  |     chars = {} | ||||||
|  |     nodes = set() | ||||||
|  | 
 | ||||||
|  |     for y, line in enumerate(lines): | ||||||
|  |         d = {} | ||||||
|  |         for x, c in enumerate(line): | ||||||
|  |             nodes.add(( x, y )) | ||||||
|  |             d[x] = c | ||||||
|  |         chars[y] = d | ||||||
|  | 
 | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     while len(nodes) > 0: | ||||||
|  |         # Pick a new item and start finding its blob | ||||||
|  |         items, cursor = [ nodes.pop() ], 0 | ||||||
|  | 
 | ||||||
|  |         # Find matching neighbours | ||||||
|  |         while cursor < len(items): | ||||||
|  |             x, y = items[cursor] | ||||||
|  | 
 | ||||||
|  |             if y + 1 < height and chars[y+1][x] == chars[y][x]: | ||||||
|  |                 if ( x, y + 1 ) in nodes: | ||||||
|  |                     nodes.remove(( x, y + 1 )) | ||||||
|  |                     items.append(( x, y + 1 )) | ||||||
|  |             if y - 1 >= 0 and chars[y-1][x] == chars[y][x]: | ||||||
|  |                 if ( x, y - 1 ) in nodes: | ||||||
|  |                     nodes.remove(( x, y - 1 )) | ||||||
|  |                     items.append(( x, y - 1 )) | ||||||
|  |             if x + 1 < width and chars[y][x+1] == chars[y][x]: | ||||||
|  |                 if ( x + 1, y ) in nodes: | ||||||
|  |                     nodes.remove(( x + 1, y )) | ||||||
|  |                     items.append(( x + 1, y )) | ||||||
|  |             if x - 1 >= 0 and chars[y][x-1] == chars[y][x]: | ||||||
|  |                 if ( x - 1, y ) in nodes: | ||||||
|  |                     nodes.remove(( x - 1, y )) | ||||||
|  |                     items.append(( x - 1, y )) | ||||||
|  | 
 | ||||||
|  |             cursor += 1 | ||||||
|  |          | ||||||
|  |         items = set(items) | ||||||
|  |         border = [] | ||||||
|  | 
 | ||||||
|  |         # Find borders | ||||||
|  |         for x, y in items: | ||||||
|  |             for dx, dy in itertools.product([ -1, 0, 1 ], repeat=2): | ||||||
|  |                 if abs(dx) + abs(dy) == 1: | ||||||
|  |                     if ( x + dx, y + dy ) not in items: | ||||||
|  |                         border.append(( x + dx, y + dy )) | ||||||
|  | 
 | ||||||
|  |         total += len(items) * len(border) | ||||||
|  |      | ||||||
|  |     print(f"Day 12 part 1: {total}") | ||||||
|  |          | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,101 @@ | ||||||
|  | import itertools | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     lines = [ [ c for c in line.strip() ] for line in open('inputs/12.txt') ] | ||||||
|  | 
 | ||||||
|  |     width = len(lines[0]) | ||||||
|  |     height = len(lines) | ||||||
|  | 
 | ||||||
|  |     chars = {} | ||||||
|  |     nodes = set() | ||||||
|  | 
 | ||||||
|  |     for y, line in enumerate(lines): | ||||||
|  |         d = {} | ||||||
|  |         for x, c in enumerate(line): | ||||||
|  |             nodes.add(( x, y )) | ||||||
|  |             d[x] = c | ||||||
|  |         chars[y] = d | ||||||
|  | 
 | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     while len(nodes) > 0: | ||||||
|  |         # Pick a new item and start finding its blob | ||||||
|  |         items, cursor = [ nodes.pop() ], 0 | ||||||
|  | 
 | ||||||
|  |         # Find matching neighbours | ||||||
|  |         while cursor < len(items): | ||||||
|  |             x, y = items[cursor] | ||||||
|  | 
 | ||||||
|  |             if y + 1 < height and chars[y+1][x] == chars[y][x]: | ||||||
|  |                 if ( x, y + 1 ) in nodes: | ||||||
|  |                     nodes.remove(( x, y + 1 )) | ||||||
|  |                     items.append(( x, y + 1 )) | ||||||
|  |             if y - 1 >= 0 and chars[y-1][x] == chars[y][x]: | ||||||
|  |                 if ( x, y - 1 ) in nodes: | ||||||
|  |                     nodes.remove(( x, y - 1 )) | ||||||
|  |                     items.append(( x, y - 1 )) | ||||||
|  |             if x + 1 < width and chars[y][x+1] == chars[y][x]: | ||||||
|  |                 if ( x + 1, y ) in nodes: | ||||||
|  |                     nodes.remove(( x + 1, y )) | ||||||
|  |                     items.append(( x + 1, y )) | ||||||
|  |             if x - 1 >= 0 and chars[y][x-1] == chars[y][x]: | ||||||
|  |                 if ( x - 1, y ) in nodes: | ||||||
|  |                     nodes.remove(( x - 1, y )) | ||||||
|  |                     items.append(( x - 1, y )) | ||||||
|  | 
 | ||||||
|  |             cursor += 1 | ||||||
|  |          | ||||||
|  |         items = set(items) | ||||||
|  |         borders = 0 | ||||||
|  | 
 | ||||||
|  |         items_x = set([ x for (x, _) in items ]) | ||||||
|  |         items_y = set([ y for (y, _) in items ]) | ||||||
|  |          | ||||||
|  |         # Find borders | ||||||
|  |         for x in range(min(items_x), max(items_x) + 1): | ||||||
|  |             left, right = False, False | ||||||
|  |             for y in range(min(items_y), max(items_y) + 1): | ||||||
|  |                 if (x, y) in items and (x - 1, y) not in items: | ||||||
|  |                     left = True | ||||||
|  |                 elif left: | ||||||
|  |                     left = False | ||||||
|  |                     borders += 1 | ||||||
|  |                  | ||||||
|  |                 if (x, y) in items and (x + 1, y) not in items: | ||||||
|  |                     right = True | ||||||
|  |                 elif right: | ||||||
|  |                     right = False | ||||||
|  |                     borders += 1 | ||||||
|  |             else: | ||||||
|  |                 if left: | ||||||
|  |                     borders += 1 | ||||||
|  |                 if right: | ||||||
|  |                     borders += 1 | ||||||
|  |          | ||||||
|  |         for y in range(min(items_y), max(items_y) + 1): | ||||||
|  |             up, down = False, False | ||||||
|  |             for x in range(min(items_x), max(items_x) + 1): | ||||||
|  |                 if (x, y) in items and (x, y - 1) not in items: | ||||||
|  |                     up = True | ||||||
|  |                 elif up: | ||||||
|  |                     up = False | ||||||
|  |                     borders += 1 | ||||||
|  |                  | ||||||
|  |                 if (x, y) in items and (x, y + 1) not in items: | ||||||
|  |                     down = True | ||||||
|  |                 elif down: | ||||||
|  |                     down = False | ||||||
|  |                     borders += 1 | ||||||
|  |             else: | ||||||
|  |                 if up: | ||||||
|  |                     borders += 1 | ||||||
|  |                 if down: | ||||||
|  |                     borders += 1 | ||||||
|  |          | ||||||
|  |         total += len(items) * borders | ||||||
|  |      | ||||||
|  |     print(f"Day 12 part 2: {total}") | ||||||
|  |          | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | import re | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     lines = open('inputs/13.txt').read() | ||||||
|  | 
 | ||||||
|  |     match_string = ( | ||||||
|  |         r"Button A: X\+(\d+), Y\+(\d+)" + "\n" + | ||||||
|  |         r"Button B: X\+(\d+), Y\+(\d+)" + "\n" + r"Prize: X=(\d+), Y=(\d+)" | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     for machine in re.findall(match_string, lines): | ||||||
|  |         score = test_claw_machine(*machine) | ||||||
|  |         # print(f"{machine} -> {score}") | ||||||
|  | 
 | ||||||
|  |         if score: | ||||||
|  |             total += score | ||||||
|  | 
 | ||||||
|  |     print(f"Day 13 part 1: {total}") | ||||||
|  | 
 | ||||||
|  | def test_claw_machine(a_x, a_y, b_x, b_y, p_x, p_y) -> int | None: | ||||||
|  |     a_x, a_y = int(a_x), int(a_y) | ||||||
|  |     b_x, b_y = int(b_x), int(b_y) | ||||||
|  |     p_x, p_y = int(p_x), int(p_y) | ||||||
|  | 
 | ||||||
|  |     alpha = (p_x - p_y * b_x / b_y) / (a_x - a_y * b_x / b_y) | ||||||
|  | 
 | ||||||
|  |     a = alpha | ||||||
|  |     b = (p_y - a_y * alpha) / b_y | ||||||
|  | 
 | ||||||
|  |     a = round(a) | ||||||
|  |     b = round(b) | ||||||
|  | 
 | ||||||
|  |     if a * a_x + b * b_x == p_x and a * a_y + b * b_y == p_y: | ||||||
|  |         return 3 * a + b | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | import re | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     lines = open('inputs/13.txt').read() | ||||||
|  | 
 | ||||||
|  |     match_string = ( | ||||||
|  |         r"Button A: X\+(\d+), Y\+(\d+)" + "\n" + | ||||||
|  |         r"Button B: X\+(\d+), Y\+(\d+)" + "\n" + r"Prize: X=(\d+), Y=(\d+)" | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     total = 0 | ||||||
|  | 
 | ||||||
|  |     for machine in re.findall(match_string, lines): | ||||||
|  |         score = test_claw_machine(*machine) | ||||||
|  |         # print(f"{machine} -> {score}") | ||||||
|  | 
 | ||||||
|  |         if score: | ||||||
|  |             total += score | ||||||
|  | 
 | ||||||
|  |     print(f"Day 13 part 2: {total}") | ||||||
|  | 
 | ||||||
|  | def test_claw_machine(a_x, a_y, b_x, b_y, p_x, p_y) -> int | None: | ||||||
|  |     a_x, a_y = int(a_x), int(a_y) | ||||||
|  |     b_x, b_y = int(b_x), int(b_y) | ||||||
|  |     p_x, p_y = int(p_x) + 10000000000000, int(p_y) + 10000000000000 | ||||||
|  | 
 | ||||||
|  |     alpha = (p_x - p_y * b_x / b_y) / (a_x - a_y * b_x / b_y) | ||||||
|  | 
 | ||||||
|  |     a = alpha | ||||||
|  |     b = (p_y - a_y * alpha) / b_y | ||||||
|  | 
 | ||||||
|  |     a = round(a) | ||||||
|  |     b = round(b) | ||||||
|  | 
 | ||||||
|  |     if a * a_x + b * b_x == p_x and a * a_y + b * b_y == p_y: | ||||||
|  |         return 3 * a + b | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,116 @@ | ||||||
|  | from enum import Enum, auto | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     grid, instructions = read_input('inputs/15.txt') | ||||||
|  | 
 | ||||||
|  |     for i in instructions: | ||||||
|  |         grid.move(i) | ||||||
|  |      | ||||||
|  |     print(f"Day 15 part 1: {grid.get_gps()}") | ||||||
|  | 
 | ||||||
|  | class Direction(Enum): | ||||||
|  |     Left = auto() | ||||||
|  |     Up = auto() | ||||||
|  |     Right = auto() | ||||||
|  |     Down = auto() | ||||||
|  | 
 | ||||||
|  |     def from_char(c : str): | ||||||
|  |         match c: | ||||||
|  |             case '<': | ||||||
|  |                 return Direction.Left | ||||||
|  |             case '^': | ||||||
|  |                 return Direction.Up | ||||||
|  |             case '>': | ||||||
|  |                 return Direction.Right | ||||||
|  |             case 'v': | ||||||
|  |                 return Direction.Down | ||||||
|  |      | ||||||
|  |     def from_str(s : str): | ||||||
|  |         dirs = [] | ||||||
|  | 
 | ||||||
|  |         for c in s: | ||||||
|  |             d = Direction.from_char(c) | ||||||
|  |             if d is not None: | ||||||
|  |                 dirs.append(d) | ||||||
|  |          | ||||||
|  |         return dirs | ||||||
|  | 
 | ||||||
|  | class Grid: | ||||||
|  |     def __init__(self, s : str) -> None: | ||||||
|  |         """ | ||||||
|  |             Create a new grid tracker. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.walls = set() | ||||||
|  |         self.boxes = set() | ||||||
|  |         self.robot = None | ||||||
|  |          | ||||||
|  |         for y, line in enumerate(s.strip().split("\n")): | ||||||
|  |             for x, c in enumerate(line.strip()): | ||||||
|  |                 match c: | ||||||
|  |                     case '#': | ||||||
|  |                         self.walls.add(( x, y )) | ||||||
|  |                     case 'O': | ||||||
|  |                         self.boxes.add(( x, y )) | ||||||
|  |                     case '@': | ||||||
|  |                         self.robot = ( x, y ) | ||||||
|  |          | ||||||
|  |         # Make sure it has been initialized | ||||||
|  |         if self.robot is None: | ||||||
|  |             raise ValueError("Did not find robot in grid") | ||||||
|  | 
 | ||||||
|  |     def get_gps(self) -> int: | ||||||
|  |         total = 0 | ||||||
|  | 
 | ||||||
|  |         for x, y in self.boxes: | ||||||
|  |             total += x + 100 * y | ||||||
|  | 
 | ||||||
|  |         return total | ||||||
|  |      | ||||||
|  |     def move(self, dir : Direction) -> bool: | ||||||
|  |         step = 1 | ||||||
|  | 
 | ||||||
|  |         while True: | ||||||
|  |             pos = self.steps(dir, step) | ||||||
|  | 
 | ||||||
|  |             if pos in self.walls: | ||||||
|  |                 return False | ||||||
|  |              | ||||||
|  |             elif pos in self.boxes: | ||||||
|  |                 step += 1 | ||||||
|  |              | ||||||
|  |             # Empty space! The robot can move | ||||||
|  |             elif step == 1: | ||||||
|  |                 self.robot = pos | ||||||
|  |                 return True | ||||||
|  |             else: | ||||||
|  |                 self.boxes.add(pos) | ||||||
|  | 
 | ||||||
|  |                 rpos = self.steps(dir, 1) | ||||||
|  |                 self.boxes.remove(rpos) | ||||||
|  |                 self.robot = rpos | ||||||
|  | 
 | ||||||
|  |                 return True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def steps(self, d : Direction, steps : int) -> ( int, int ): | ||||||
|  |         x, y = self.robot | ||||||
|  | 
 | ||||||
|  |         match d: | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return ( x - steps, y ) | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return ( x, y - steps ) | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return ( x + steps, y ) | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return ( x, y + steps ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def read_input(file_name): | ||||||
|  |     g, d = open(file_name).read().strip().split("\n\n") | ||||||
|  | 
 | ||||||
|  |     return Grid(g), Direction.from_str(d) | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,244 @@ | ||||||
|  | # 1480694 too high | ||||||
|  | from enum import Enum, auto | ||||||
|  | 
 | ||||||
|  | import time | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     grid, instructions = read_input('inputs/15.txt') | ||||||
|  | 
 | ||||||
|  |     for i in instructions: | ||||||
|  |         grid.move(i) | ||||||
|  |      | ||||||
|  |     print(f"Day 15 part 2: {grid.get_gps()}") | ||||||
|  | 
 | ||||||
|  | class Direction(Enum): | ||||||
|  |     Left = auto() | ||||||
|  |     Up = auto() | ||||||
|  |     Right = auto() | ||||||
|  |     Down = auto() | ||||||
|  | 
 | ||||||
|  |     def from_char(c : str): | ||||||
|  |         match c: | ||||||
|  |             case '<': | ||||||
|  |                 return Direction.Left | ||||||
|  |             case '^': | ||||||
|  |                 return Direction.Up | ||||||
|  |             case '>': | ||||||
|  |                 return Direction.Right | ||||||
|  |             case 'v': | ||||||
|  |                 return Direction.Down | ||||||
|  |      | ||||||
|  |     def from_str(s : str): | ||||||
|  |         dirs = [] | ||||||
|  | 
 | ||||||
|  |         for c in s: | ||||||
|  |             d = Direction.from_char(c) | ||||||
|  |             if d is not None: | ||||||
|  |                 dirs.append(d) | ||||||
|  |          | ||||||
|  |         return dirs | ||||||
|  |      | ||||||
|  |     def to_char(d) -> str: | ||||||
|  |         match d: | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return '<' | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return '^' | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return '>' | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return 'v' | ||||||
|  | 
 | ||||||
|  | class Grid: | ||||||
|  |     def __init__(self, s : str) -> None: | ||||||
|  |         """ | ||||||
|  |             Create a new grid tracker. | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         self.walls = set() | ||||||
|  |         self.boxes = set() | ||||||
|  |         self.robot = None | ||||||
|  | 
 | ||||||
|  |         self.width = 0 | ||||||
|  |         self.height = 0 | ||||||
|  |          | ||||||
|  |         for y, line in enumerate(s.strip().split("\n")): | ||||||
|  |             self.width = max(self.width, 2 * len(line.strip())) | ||||||
|  |             self.height = y + 1 | ||||||
|  | 
 | ||||||
|  |             for x, c in enumerate(line.strip()): | ||||||
|  |                 match c: | ||||||
|  |                     case '#': | ||||||
|  |                         self.walls.add(( 2*x, y )) | ||||||
|  |                         self.walls.add(( 2*x + 1, y )) | ||||||
|  |                     case 'O': | ||||||
|  |                         self.boxes.add(( 2*x, y )) | ||||||
|  |                     case '@': | ||||||
|  |                         self.robot = ( 2*x, y ) | ||||||
|  |          | ||||||
|  |         # Make sure it has been initialized | ||||||
|  |         if self.robot is None: | ||||||
|  |             raise ValueError("Did not find robot in grid") | ||||||
|  |      | ||||||
|  |     def __repr__(self): | ||||||
|  |         lines = [] | ||||||
|  | 
 | ||||||
|  |         for y in range(self.height): | ||||||
|  |             s = "" | ||||||
|  | 
 | ||||||
|  |             for x in range(self.width): | ||||||
|  |                 if (x, y) in self.walls: | ||||||
|  |                     s += "#" | ||||||
|  |                 elif ( x, y ) in self.boxes: | ||||||
|  |                     s += "[" | ||||||
|  |                 elif ( x - 1, y ) in self.boxes: | ||||||
|  |                     s += "]" | ||||||
|  |                 elif ( x, y ) == self.robot: | ||||||
|  |                     s += "@" | ||||||
|  |                 else: | ||||||
|  |                     s += "." | ||||||
|  |              | ||||||
|  |             lines.append(s) | ||||||
|  |          | ||||||
|  |         return "\n".join(lines) | ||||||
|  | 
 | ||||||
|  |     def get_gps(self) -> int: | ||||||
|  |         total = 0 | ||||||
|  | 
 | ||||||
|  |         for x, y in self.boxes: | ||||||
|  |             total += x + 100 * y | ||||||
|  | 
 | ||||||
|  |         return total | ||||||
|  |      | ||||||
|  |     def move(self, d : Direction) -> bool: | ||||||
|  |         match d: | ||||||
|  |             case Direction.Right: | ||||||
|  |                 step = 1 | ||||||
|  | 
 | ||||||
|  |                 while True: | ||||||
|  |                     pos = self.steps(d, step) | ||||||
|  | 
 | ||||||
|  |                     if pos in self.walls: | ||||||
|  |                         return False | ||||||
|  |                     if pos in self.boxes: | ||||||
|  |                         step += 2 | ||||||
|  |                      | ||||||
|  |                     else: | ||||||
|  |                         for i in range(step // 2): | ||||||
|  |                             self.boxes.remove(self.steps(d, 2*i+1)) | ||||||
|  |                             self.boxes.add(self.steps(d, 2*i+2)) | ||||||
|  |                         self.robot = self.steps(d, 1) | ||||||
|  |                         break | ||||||
|  |              | ||||||
|  |             case Direction.Up | Direction.Down: | ||||||
|  |                 boxes = [] | ||||||
|  | 
 | ||||||
|  |                 x, y = self.steps(d, 1) | ||||||
|  | 
 | ||||||
|  |                 if (x, y) in self.walls: | ||||||
|  |                     return False | ||||||
|  |                  | ||||||
|  |                 # Gather boxes, if necessary | ||||||
|  |                 if (x, y) in self.boxes: | ||||||
|  |                     boxes.append(( x, y )) | ||||||
|  |                 if ( x - 1, y ) in self.boxes: | ||||||
|  |                     boxes.append(( x - 1, y )) | ||||||
|  | 
 | ||||||
|  |                 # If a box is blocking, use BFS to look for walls | ||||||
|  |                 i = 0 | ||||||
|  |                 dy = -1 if d == Direction.Up else 1 | ||||||
|  | 
 | ||||||
|  |                 while i < len(boxes): | ||||||
|  |                     x, y = boxes[i] | ||||||
|  | 
 | ||||||
|  |                     left = ( x - 1, y + dy ) | ||||||
|  |                     middle = ( x, y + dy ) | ||||||
|  |                     right = ( x + 1, y + dy ) | ||||||
|  | 
 | ||||||
|  |                     # Note how left only matters if there's a box there of width 2 | ||||||
|  |                     if middle in self.walls: | ||||||
|  |                         return False | ||||||
|  |                     if right in self.walls: | ||||||
|  |                         return False | ||||||
|  | 
 | ||||||
|  |                     if left in self.boxes and left not in boxes: | ||||||
|  |                         boxes.append(left) | ||||||
|  |                     if middle in self.boxes: | ||||||
|  |                         boxes.append(middle) | ||||||
|  |                     if right in self.boxes: | ||||||
|  |                         boxes.append(right) | ||||||
|  |                      | ||||||
|  |                     # if left in self.boxes and right in self.boxes: | ||||||
|  |                     #     print("Found a splitter!") | ||||||
|  |                      | ||||||
|  |                     i += 1 | ||||||
|  |                  | ||||||
|  |                 # Once all boxes have been found, move all of them. | ||||||
|  |                 # In reverse order, so they don't accidentally merge. | ||||||
|  |                 for x, y in reversed(boxes): | ||||||
|  |                     self.boxes.remove(( x, y )) | ||||||
|  |                     self.boxes.add(( x, y + dy )) | ||||||
|  |                  | ||||||
|  |                 self.robot = self.steps(d, 1) | ||||||
|  |              | ||||||
|  |             case Direction.Left: | ||||||
|  |                 step = 1 | ||||||
|  | 
 | ||||||
|  |                 while True: | ||||||
|  |                     pos = self.steps(d, step) | ||||||
|  |                     box = self.steps(d, step + 1) | ||||||
|  | 
 | ||||||
|  |                     if pos in self.walls: | ||||||
|  |                         return False | ||||||
|  |                      | ||||||
|  |                     if pos in self.boxes: | ||||||
|  |                         # A box should not be here | ||||||
|  |                         raise ValueError( | ||||||
|  |                             f"Robot ({self.robot}) was found with clipping box at ({pos})" | ||||||
|  |                         ) | ||||||
|  |                      | ||||||
|  |                     # This space seems empty! | ||||||
|  |                     # Let's make sure there's no box to the left, otherwise it | ||||||
|  |                     # counts as a box. | ||||||
|  |                     if box in self.boxes: | ||||||
|  |                         # Crap. | ||||||
|  |                         step += 2 | ||||||
|  |                      | ||||||
|  |                     else: | ||||||
|  |                         # Goodness. We can move! | ||||||
|  |                         for i in range(step // 2): | ||||||
|  |                             self.boxes.remove(self.steps(d, 2*i+2)) | ||||||
|  |                             self.boxes.add(self.steps(d, 2*i+3)) | ||||||
|  |                          | ||||||
|  |                         self.robot = self.steps(d, 1) | ||||||
|  |                         break | ||||||
|  | 
 | ||||||
|  |         # print(f"Moving to {d}") | ||||||
|  |         # t = time.sleep(0.1) | ||||||
|  |         # print() | ||||||
|  |         # print() | ||||||
|  |         # print() | ||||||
|  |         # print(self.__repr__().replace('@', Direction.to_char(d))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def steps(self, d : Direction, steps : int) -> ( int, int ): | ||||||
|  |         x, y = self.robot | ||||||
|  | 
 | ||||||
|  |         match d: | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return ( x - steps, y ) | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return ( x, y - steps ) | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return ( x + steps, y ) | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return ( x, y + steps ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def read_input(file_name): | ||||||
|  |     g, d = open(file_name).read().strip().split("\n\n") | ||||||
|  | 
 | ||||||
|  |     return Grid(g), Direction.from_str(d) | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,100 @@ | ||||||
|  | from enum import Enum, auto | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     grid = Grid(open('inputs/16.txt').read()) | ||||||
|  | 
 | ||||||
|  |     print(f"Day 16 part 1: {grid.get_score(*grid.start, Direction.Right)}") | ||||||
|  | 
 | ||||||
|  | class Direction(Enum): | ||||||
|  |     Up = auto() | ||||||
|  |     Right = auto() | ||||||
|  |     Down = auto() | ||||||
|  |     Left = auto() | ||||||
|  | 
 | ||||||
|  |     def take_step(self, x : int, y : int, size : int) -> ( int, int ): | ||||||
|  |         match self: | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return ( x, y + size ) | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return ( x + size, y ) | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return ( x, y - size ) | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return ( x - size, y ) | ||||||
|  |      | ||||||
|  |     def turn_left(self): | ||||||
|  |         match self: | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return Direction.Left | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return Direction.Up | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return Direction.Right | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return Direction.Down | ||||||
|  |      | ||||||
|  |     def turn_right(self): | ||||||
|  |         match self: | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return Direction.Right | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return Direction.Down | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return Direction.Left | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return Direction.Up | ||||||
|  | 
 | ||||||
|  | class Grid: | ||||||
|  |     def __init__(self, text : str) -> None: | ||||||
|  |         self.walls = set() | ||||||
|  | 
 | ||||||
|  |         for y, line in enumerate(text.split('\n')): | ||||||
|  |             for x, c in enumerate(line.strip()): | ||||||
|  |                 match c: | ||||||
|  |                     case '#': | ||||||
|  |                         self.walls.add((x, y)) | ||||||
|  |                     case 'S': | ||||||
|  |                         self.start = (x, y) | ||||||
|  |                     case 'E': | ||||||
|  |                         self.finish = (x, y) | ||||||
|  | 
 | ||||||
|  |         self.score = {} | ||||||
|  |          | ||||||
|  |         # Start determining the optimal order | ||||||
|  |         stack = [ | ||||||
|  |             ( *self.finish, Direction.Up, 0 ), | ||||||
|  |             ( *self.finish, Direction.Right, 0 ), | ||||||
|  |             ( *self.finish, Direction.Down, 0 ), | ||||||
|  |             ( *self.finish, Direction.Left, 0 ), | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  |         while True: | ||||||
|  |             try: | ||||||
|  |                 x, y, d, score = stack.pop() | ||||||
|  |             except IndexError: | ||||||
|  |                 return | ||||||
|  | 
 | ||||||
|  |             if (x, y) in self.walls: | ||||||
|  |                 continue | ||||||
|  |              | ||||||
|  |             old_score = self.get_score(x, y, d) | ||||||
|  |             if old_score is not None and old_score <= score: | ||||||
|  |                 continue | ||||||
|  |          | ||||||
|  |             # If we get here, then we have found a new optimal path | ||||||
|  |             self.set_score(x, y, d, score) | ||||||
|  |             stack.append((*d.take_step(x, y, -1), d, score + 1)) | ||||||
|  |             stack.insert(0, (x, y, d.turn_left(), score + 1000)) | ||||||
|  |             stack.insert(0, (x, y, d.turn_right(), score + 1000)) | ||||||
|  |      | ||||||
|  |     def get_score(self, x : int, y : int, d : Direction) -> int | None: | ||||||
|  |         try: | ||||||
|  |             return self.score[( x, y, d )] | ||||||
|  |         except KeyError: | ||||||
|  |             return None | ||||||
|  |      | ||||||
|  |     def set_score(self, x : int, y : int, d : Direction, val : int) -> None: | ||||||
|  |         self.score[( x, y, d )] = val | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -0,0 +1,169 @@ | ||||||
|  | # 624 too low | ||||||
|  | from enum import Enum, auto | ||||||
|  | 
 | ||||||
|  | # Ridiculously high number - this is beyond the weights of the grid | ||||||
|  | NON_NUMBER = int(1e9) | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     grid = Grid(open('inputs/16.txt').read()) | ||||||
|  | 
 | ||||||
|  |     # print(grid.get_score(*grid.start, Direction.Right)) | ||||||
|  |     print(f"Day 16 part 2: {grid.find_best_spots() + 1}") | ||||||
|  | 
 | ||||||
|  | class Direction(Enum): | ||||||
|  |     Up = auto() | ||||||
|  |     Right = auto() | ||||||
|  |     Down = auto() | ||||||
|  |     Left = auto() | ||||||
|  | 
 | ||||||
|  |     def take_step(self, x : int, y : int, size : int) -> ( int, int ): | ||||||
|  |         match self: | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return ( x, y + size ) | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return ( x + size, y ) | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return ( x, y - size ) | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return ( x - size, y ) | ||||||
|  |      | ||||||
|  |     def turn_left(self): | ||||||
|  |         match self: | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return Direction.Left | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return Direction.Up | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return Direction.Right | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return Direction.Down | ||||||
|  |      | ||||||
|  |     def turn_right(self): | ||||||
|  |         match self: | ||||||
|  |             case Direction.Up: | ||||||
|  |                 return Direction.Right | ||||||
|  |             case Direction.Right: | ||||||
|  |                 return Direction.Down | ||||||
|  |             case Direction.Down: | ||||||
|  |                 return Direction.Left | ||||||
|  |             case Direction.Left: | ||||||
|  |                 return Direction.Up | ||||||
|  | 
 | ||||||
|  | class Grid: | ||||||
|  |     def __init__(self, text : str) -> None: | ||||||
|  |         self.walls = set() | ||||||
|  |         self.optimal_coords = set() | ||||||
|  | 
 | ||||||
|  |         self.width, self.height = 0, 0 | ||||||
|  | 
 | ||||||
|  |         for y, line in enumerate(text.split('\n')): | ||||||
|  |             self.height = y + 1 | ||||||
|  |             self.width = max(self.width, len(line.strip())) | ||||||
|  | 
 | ||||||
|  |             for x, c in enumerate(line.strip()): | ||||||
|  |                 match c: | ||||||
|  |                     case '#': | ||||||
|  |                         self.walls.add((x, y)) | ||||||
|  |                     case 'S': | ||||||
|  |                         self.start = (x, y) | ||||||
|  |                     case 'E': | ||||||
|  |                         self.finish = (x, y) | ||||||
|  | 
 | ||||||
|  |         self.score = {} | ||||||
|  |          | ||||||
|  |         # Start determining the optimal order | ||||||
|  |         stack = [ | ||||||
|  |             ( *self.finish, Direction.Up, 0 ), | ||||||
|  |             ( *self.finish, Direction.Right, 0 ), | ||||||
|  |             ( *self.finish, Direction.Down, 0 ), | ||||||
|  |             ( *self.finish, Direction.Left, 0 ), | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  |         while True: | ||||||
|  |             try: | ||||||
|  |                 x, y, d, score = stack.pop() | ||||||
|  |             except IndexError: | ||||||
|  |                 return | ||||||
|  | 
 | ||||||
|  |             if (x, y) in self.walls: | ||||||
|  |                 continue | ||||||
|  |              | ||||||
|  |             old_score = self.get_score(x, y, d) | ||||||
|  |             if old_score is not None and old_score <= score: | ||||||
|  |                 continue | ||||||
|  |          | ||||||
|  |             # If we get here, then we have found a new optimal path | ||||||
|  |             self.set_score(x, y, d, score) | ||||||
|  |             stack.append((*d.take_step(x, y, -1), d, score + 1)) | ||||||
|  |             stack.insert(0, (x, y, d.turn_left(), score + 1000)) | ||||||
|  |             stack.insert(0, (x, y, d.turn_right(), score + 1000)) | ||||||
|  |      | ||||||
|  |     def __repr__(self): | ||||||
|  |         lines = [] | ||||||
|  | 
 | ||||||
|  |         for y in range(self.height): | ||||||
|  |             s = "" | ||||||
|  | 
 | ||||||
|  |             for x in range(self.width): | ||||||
|  |                 if (x, y) in self.walls: | ||||||
|  |                     s += "#" | ||||||
|  |                 elif (x, y) == self.start: | ||||||
|  |                     s += "S" | ||||||
|  |                 elif (x, y) == self.finish: | ||||||
|  |                     s += "E" | ||||||
|  |                 elif (x, y) in self.optimal_coords: | ||||||
|  |                     s += "O" | ||||||
|  |                 else: | ||||||
|  |                     s += "." | ||||||
|  |              | ||||||
|  |             lines.append(s) | ||||||
|  |          | ||||||
|  |         return "\n".join(lines) | ||||||
|  |              | ||||||
|  |      | ||||||
|  |     def find_best_spots(self) -> int: | ||||||
|  |         """ | ||||||
|  |             Find all positions that lie on an optimal path. | ||||||
|  |         """ | ||||||
|  |         queue = [ ( *self.start, Direction.Right ) ] | ||||||
|  | 
 | ||||||
|  |         i = 0 | ||||||
|  |         while i < len(queue): | ||||||
|  |             x, y, d = queue[i] | ||||||
|  | 
 | ||||||
|  |             forward = ( *d.take_step(x, y, 1), d ) | ||||||
|  |             t_left = ( x, y, d.turn_left() ) | ||||||
|  |             t_right = ( x, y, d.turn_right() ) | ||||||
|  | 
 | ||||||
|  |             score_forward = (self.get_score(*forward) or NON_NUMBER) + 1 | ||||||
|  |             score_t_left = (self.get_score(*t_left) or NON_NUMBER) + 1000 | ||||||
|  |             score_t_right = (self.get_score(*t_right) or NON_NUMBER) + 1000 | ||||||
|  | 
 | ||||||
|  |             best_score = min(score_forward, score_t_left, score_t_right) | ||||||
|  | 
 | ||||||
|  |             if best_score >= NON_NUMBER: | ||||||
|  |                 raise ValueError("Optimal path has no path to the finish") | ||||||
|  |              | ||||||
|  |             if score_forward == best_score and forward not in queue: | ||||||
|  |                 queue.append(forward) | ||||||
|  |             if score_t_left == best_score and t_left not in queue: | ||||||
|  |                 queue.append(t_left) | ||||||
|  |             if score_t_right == best_score and t_right not in queue: | ||||||
|  |                 queue.append(t_right) | ||||||
|  |              | ||||||
|  |             i += 1 | ||||||
|  |          | ||||||
|  |         self.optimal_coords = set(( x, y ) for x, y, _ in queue) | ||||||
|  |         return len(self.optimal_coords) | ||||||
|  |      | ||||||
|  |     def get_score(self, x : int, y : int, d : Direction) -> int | None: | ||||||
|  |         try: | ||||||
|  |             return self.score[( x, y, d )] | ||||||
|  |         except KeyError: | ||||||
|  |             return None | ||||||
|  |      | ||||||
|  |     def set_score(self, x : int, y : int, d : Direction, val : int) -> None: | ||||||
|  |         self.score[( x, y, d )] = val | ||||||
|  | 
 | ||||||
|  | # if __name__ == "__main__": | ||||||
|  | main() | ||||||
|  | @ -8,6 +8,7 @@ mod day_07; | ||||||
| mod day_08; | mod day_08; | ||||||
| mod day_09; | mod day_09; | ||||||
| mod day_10; | mod day_10; | ||||||
|  | mod day_11; | ||||||
| mod utils; | mod utils; | ||||||
| 
 | 
 | ||||||
| use std::time::Duration; | use std::time::Duration; | ||||||
|  | @ -78,3 +79,10 @@ pub fn day_10() -> DailyOutput { | ||||||
| 
 | 
 | ||||||
|     ( p1 as u128, p2 as u128, d ) |     ( p1 as u128, p2 as u128, d ) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | pub fn day_11() -> DailyOutput { | ||||||
|  |     let s : String = read_from_file("inputs/11.txt"); | ||||||
|  |     let (p1, p2, d) = diagnostics::benchmark(s, day_11::answer); | ||||||
|  | 
 | ||||||
|  |     ( p1 as u128, p2 as u128, d ) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ fn main() { | ||||||
|     aoc.insert(8, aoc_2024::day_08()); |     aoc.insert(8, aoc_2024::day_08()); | ||||||
|     aoc.insert(9, aoc_2024::day_09()); |     aoc.insert(9, aoc_2024::day_09()); | ||||||
|     aoc.insert(10, aoc_2024::day_10()); |     aoc.insert(10, aoc_2024::day_10()); | ||||||
|  |     aoc.insert(11, aoc_2024::day_11()); | ||||||
| 
 | 
 | ||||||
|     aoc.show_diagnostics(); |     aoc.show_diagnostics(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ impl AdventOfCode { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn show_diagnostics(&self) { |     pub fn show_diagnostics(&self) { | ||||||
|         println!("|        | {: ^14} | {: ^14} | Duration |", |         println!("|        | {: ^15} | {: ^15} | Duration |", | ||||||
|             "Part 1", "Part 2" |             "Part 1", "Part 2" | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|  | @ -70,7 +70,7 @@ impl DayResults { | ||||||
|         let r = horizontal_bar('#', ' ', 4.0 * BAR_WIDTH_UNIT * (fraction - 0.75), BAR_WIDTH_UNIT); |         let r = horizontal_bar('#', ' ', 4.0 * BAR_WIDTH_UNIT * (fraction - 0.75), BAR_WIDTH_UNIT); | ||||||
| 
 | 
 | ||||||
|         format!( |         format!( | ||||||
|             "| Day {: >2} | {: >14} | {: >14} | {: >6}ms | [{: <}{: <6}{: <6}", |             "| Day {: >2} | {: >15} | {: >15} | {: >6}ms | [{: <}{: <6}{: <6}", | ||||||
|             day, self.part_1, self.part_2, self.duration.as_millis(), |             day, self.part_1, self.part_2, self.duration.as_millis(), | ||||||
|             g.as_str().green(), o.as_str().yellow(), r.as_str().red() |             g.as_str().green(), o.as_str().yellow(), r.as_str().red() | ||||||
|         ) |         ) | ||||||
|  | @ -86,7 +86,7 @@ pub fn benchmark<A,B>(s : String, f : fn(String) -> ( A, B )) -> ( A, B, Duratio | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn empty_diagnostic(day : usize) -> String { | fn empty_diagnostic(day : usize) -> String { | ||||||
|     format!("| Day {: >2} | {:->14} | {:->14} | {:->8} | [", day, "", "", "") |     format!("| Day {: >2} | {:->15} | {:->15} | {:->8} | [", day, "", "", "") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn horizontal_bar(full : char, empty : char, width : f32, max_width : f32) -> String { | fn horizontal_bar(full : char, empty : char, width : f32, max_width : f32) -> String { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue